亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

詳解MyBatis的XML實(shí)現(xiàn)方法(附帶注解方式實(shí)現(xiàn))

 更新時(shí)間:2024年05月21日 10:09:22   作者:HarryQUQ  
這篇文章主要詳細(xì)介紹了MyBatis的XML實(shí)現(xiàn)方法(附帶注解方式實(shí)現(xiàn)),文中通過(guò)代碼示例給大家講解的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下

這篇文章我們來(lái)簡(jiǎn)述一下MyBatis的XML實(shí)現(xiàn)方法(附帶注解方式實(shí)現(xiàn)方法)。

XML

1.創(chuàng)建接口

創(chuàng)建數(shù)據(jù)層(Dao)接口,使用@Mapper注解(交由Spring掌管這個(gè)類(lèi),這樣才能讓其幫助我們寫(xiě)操作數(shù)據(jù)庫(kù)的方法)。為了演示我創(chuàng)建一個(gè)StudentInfoDao接口:

@Mapper
public interface StudentInfoDao {
}

2.配置XML路徑

配置路徑是為了MyBatis能找到我們寫(xiě)的XML文件

以下是yml的配置方法:

mybatis:
  mapper-locations: classpath:mapper/*Mapper*.xml #這里的*是通配符,表示模糊匹配

如果要用properties只需要把:改成.及=即可。

3.配置XML模板

我們要在對(duì)應(yīng)的文件夾下創(chuàng)建XML文件(像我上面的代碼就是放在resource文件夾的mapper文件夾內(nèi),注意,名字要和自己寫(xiě)的文件名對(duì)應(yīng))如圖:

然后根據(jù)模板代碼把我們寫(xiě)的類(lèi)和XML匹配上,代碼如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.mybatis.demomybatis.demos.DAO.StudentInfoDao">

在namespace的值中寫(xiě)下需要匹配類(lèi)的全限定類(lèi)名。這樣我們整個(gè)模板就創(chuàng)建好了,我們只需要在這個(gè)XML文件中寫(xiě)下我們需要的代碼即可,接下來(lái)我來(lái)教大家如何執(zhí)行簡(jiǎn)單的SQL語(yǔ)句(非動(dòng)態(tài)(動(dòng)態(tài)的我會(huì)在以后的博客里說(shuō)明))。

4.MyBatis使用SQL語(yǔ)句

1.insert 

先在StudentInfoDao中寫(xiě)一個(gè)insert方法,方法名隨意,為了方便我直接取名為insert

@Mapper
public interface StudentInfoDao {
     void insert();
}

然后轉(zhuǎn)換到XML文件,我們使用<insert></insert>標(biāo)簽,設(shè)置insert標(biāo)簽屬性id為我們類(lèi)中對(duì)應(yīng)的方法名。在標(biāo)簽中寫(xiě)下SQL語(yǔ)句,因?yàn)閕nsert要傳入?yún)?shù),為了方便,我們直接傳一個(gè)類(lèi)進(jìn)去,MyBatis會(huì)自動(dòng)幫我們把這個(gè)類(lèi)轉(zhuǎn)化成類(lèi)內(nèi)部的參數(shù)。我們這里傳入StudentInfo類(lèi)。然后每個(gè)參數(shù)用#{參數(shù)名}的形式輸入

    <insert id="insert">
        insert into mybatis(user_name,password,age,gender,phone)
        values(#{username},#{password},#{age},#{gender},#{phone})
    </insert>
@Mapper
public interface StudentInfoDao2 {
     void insert(StudentInfo studentInfo);
}
@Data
public class StudentInfo {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private Integer gender;
    private String phone;
    private String deleteFlag;
    private Date createTime;
    private Date updateTime;
}

這里的@Data是lombok里的注解,可以自動(dòng)幫我們寫(xiě)getter,setter等方法,如果想要詳細(xì)了解可以去官方看看官方文檔,我們這里不多說(shuō),不是文章重點(diǎn)。

經(jīng)過(guò)上述步驟之后我們MyBatis使用insert語(yǔ)句就算是大功告成了。我們測(cè)試以下結(jié)果是否正確。

@SpringBootTest
class StudentInfoDaoTest {
    @Autowired
private StudentInfoDao studentInfoDao2;
    @Test
    void insert() {
        StudentInfo studentInfo=new StudentInfo();
        studentInfo.setPassword("12321");
        studentInfo.setAge(12);
        studentInfo.setPhone("972893");
        studentInfo.setGender(0);
        studentInfo.setUsername("zm");
        studentInfoDao.insert(studentInfo);
    }
}

顯然我們的insert語(yǔ)句執(zhí)行成功。

2.update

會(huì)使用insert之后update,delete都幾乎一樣,我們這里再講一個(gè)update。和前面一樣,創(chuàng)建方法,這次我們使用<update></update>標(biāo)簽,id設(shè)置為對(duì)應(yīng)方法名,在標(biāo)簽中寫(xiě)下update的sql語(yǔ)句。

@Mapper
public interface StudentInfoDao {
     void update(StudentInfo studentInfo);
}
<update id="update">
        update mybatis set password=#{password},age=#{age} where user_name=#{username}
    </update>
@Test
    void update() {
        StudentInfo studentInfo=new StudentInfo();
        studentInfo.setUsername("zm");
        studentInfo.setAge(18);
        studentInfo.setPassword("99292");
        studentInfoDao2.update(studentInfo);
    }

可以看到之前我們寫(xiě)的數(shù)據(jù)發(fā)生了變化。

3.select

select和上述的3個(gè)SQL有所不同,insert,update,delete返回的都是整數(shù),表示數(shù)據(jù)庫(kù)受到影響的行數(shù),所以返回值肯定是Integer,這毋庸置疑。但是select就不一樣了,它的返回值可以是一行數(shù)據(jù)也可以是多行數(shù)據(jù),所以我們不僅僅要設(shè)置它的id還需要設(shè)置它的返回類(lèi)型resultType。

    <select id="select" resultType="com.mybatis.demomybatis.demos.model.StudentInfo">
    </select>

resultType中填的類(lèi)是返回類(lèi)的全限定類(lèi)名。這個(gè)設(shè)置完之后其余的內(nèi)容和insert那三個(gè)也幾乎沒(méi)什么區(qū)別。還是創(chuàng)建方法,寫(xiě)上sql語(yǔ)句即可。

@Mapper
public interface StudentInfoDao {
     List<StudentInfo> select();//傳參和上面一樣,使用用對(duì)象即可,我們這里為了方便就不傳參了
}
<select id="select" resultType="com.mybatis.demomybatis.demos.model.StudentInfo">
        select * from mybatis
    </select>
    void select() {
        System.out.println(studentInfoDao.select());
    }

細(xì)心的哥們兒會(huì)發(fā)現(xiàn)我們有些參數(shù)的值是null ,并不能和數(shù)據(jù)庫(kù)相匹配。這是因?yàn)橐话銛?shù)據(jù)庫(kù)的命名習(xí)慣和Java的不同,Java采用小駝峰,MySQL采用蛇形命名法,所以StudentInfo類(lèi)的參數(shù)和MySQL中的字段名對(duì)不上,導(dǎo)致MyBatis無(wú)法映射到類(lèi)的每個(gè)參數(shù)中。那我們?cè)撛趺唇鉀Q這個(gè)問(wèn)題呢?這里我來(lái)提供3個(gè)方法。

4.解決Mybatis參數(shù)映射不到的問(wèn)題

1.改變SQL語(yǔ)句

我們把select * from mybatis改成select user_name as username,delete_flag as deleteFlag,create_time as createTime,uptate_time as uptatetime from mybatis即可。

2.指定映射關(guān)系

我們可以用resultMap來(lái)指定映射關(guān)系,只需要在xml任何一個(gè)位置寫(xiě)一個(gè)由<resultMap></resultMap>標(biāo)簽寫(xiě)的一組指定映射關(guān)系然后再由select標(biāo)簽的resultMap屬性接受即可。內(nèi)部使用<result></result>標(biāo)簽及column,property屬性形容一對(duì)映射關(guān)系。如以下代碼。

    <resultMap id="StudentMap" type="com.mybatis.demomybatis.demos.model.StudentInfo">
        <result column="user_name" property="username"></result>#這里我們?yōu)榱朔奖阒粚?xiě)一個(gè)對(duì)應(yīng)關(guān)系
    </resultMap>
    <select id="select" resultMap="StudentMap">
        select * from mybatis
    </select>

引用方法就是填入resultMap的id。這樣Java就可以返回正確的內(nèi)容了。

3.使用配置文件直接把對(duì)應(yīng)的蛇形命名法轉(zhuǎn)化為小駝峰 

映射沒(méi)對(duì)應(yīng)上的主要原因就是命名規(guī)則不同,但是表達(dá)的內(nèi)容是相同的,所以MyBatis幫我們實(shí)現(xiàn)了命名規(guī)則自動(dòng)轉(zhuǎn)化。只要使用了這個(gè)配置我們就不需要進(jìn)行任何操作就可以讓類(lèi)屬性和SQL字段對(duì)應(yīng)上。yml配置如下:

mybatis:
  configuration: # 配置打印 MyBatis 執(zhí)行的 SQL
    map-underscore-to-camel-case: true  #自動(dòng)駝峰轉(zhuǎn)換

這個(gè)配置同樣適配于用注解方式寫(xiě)SQL。那下面我們來(lái)講講注解是怎么寫(xiě)SQL的吧。

注解

1.創(chuàng)建接口

和XML一樣,也得創(chuàng)建接口:

@Mapper
public interface StudentInfoDao {
}

2.寫(xiě)方法

因?yàn)樗蟹椒◣缀醵家粯?,所以我們只講insert方法和select

insert

直接再方法上加上@Insert(“SQL語(yǔ)句”)即可:

    @Insert("insert into mybatis(user_name,password,age,gender,phone) values(#{username},#{password},#{age}," +
            "#{gender},#{phone})")
    public Integer insert(StudentInfo studentInfo);

非常簡(jiǎn)單。

select 

在XML中我們也說(shuō)了select因?yàn)榉祷貐?shù)的問(wèn)題所以和其他的語(yǔ)句有所不同,注解SQL語(yǔ)句上是相同的。我們要改變類(lèi)和SQL字段的映射關(guān)系也有三種方法,分別是改變SQL語(yǔ)句,指定映射關(guān)系,使用配置文件直接把對(duì)應(yīng)的蛇形命名法轉(zhuǎn)化為小駝峰。第一種和最后一種和XML實(shí)現(xiàn)方式一樣,我們這里只講如何指定映射關(guān)系。

指定映射關(guān)系

我們使用@Results注解,在注解中是@Result注解的集合,我們?cè)贎Result中寫(xiě)映射關(guān)系即可,如以下代碼:

@Select("select * from mybatis")
    @Results(id = "re",value = {
            @Result(column = "uptate_time",property = "updateTime"),
            @Result(column = "create_time",property = "createTime"),
            @Result(column = "delete_flag",property = "deleteFlag")
    })
    public List<StudentInfo> select();

這里的id字段就是給這個(gè)result集合取個(gè)名,以后若要使用就不需要再寫(xiě)這么一大串集合,直接使用@ResultMap注解,里面填上集合id即可。

@Select("select * from mybatis")   
    @ResultMap("id")
    public List<StudentInfo> select();

因?yàn)樽⒔庹娴暮芎?jiǎn)單,所以我們就只需要講這么一點(diǎn),但是不是說(shuō)xml復(fù)雜就是不好用,它在動(dòng)態(tài)SQL方面比注解方式簡(jiǎn)單好多好多倍,在以后的文章中我再和大家提。

總結(jié)

XML和注解的本質(zhì)都是寫(xiě)一個(gè)接口,然后告訴MyBatis這個(gè)注解需要實(shí)現(xiàn)說(shuō)明樣的功能,關(guān)鍵信息是什么,MyBatis就會(huì)配合Spring幫我們實(shí)現(xiàn)這個(gè)方法供我們使用,這真的比原生JDBC好用許多,這也體現(xiàn)了封裝的優(yōu)越性,讓我們省去了建立連接,關(guān)閉連接等各種重復(fù)又繁瑣的操作。

以上就是詳解MyBatis的XML實(shí)現(xiàn)方法(附帶注解方式實(shí)現(xiàn))的詳細(xì)內(nèi)容,更多關(guān)于MyBatis XML實(shí)現(xiàn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java實(shí)現(xiàn)消消樂(lè)中的消除功能

    Java實(shí)現(xiàn)消消樂(lè)中的消除功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)消消樂(lè)中的消除功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • 最新評(píng)論