<label id="oakn9"><ruby id="oakn9"><input id="oakn9"></input></ruby></label>

<button id="oakn9"><acronym id="oakn9"><input id="oakn9"></input></acronym></button>

什么是MyBatis映射器?

MyBatis框架包括兩種類型的XML文件,一類是配置文件,即mybatis-config.xml,另外一類是映射文件,例如XXXMapper.xml等。在 MyBatis的配置文件mybatis-config.xml 包含了<mappers></mappers>節點,這里就是MyBatis映射器。

1、MyBatis映射器發展歷史簡介

映射器是MyBatis中最核心的組件之一,在MyBatis 3之前,只支持XML映射器,所有的SQL語句都必須在XML文件中配置。而從MyBatis 3開始,開始支持接口映射器,其底層利用的是接口綁定技術(注:面試中經常會問到的一個知識點,見下文5.1項介紹)。另外,接口映射器允許通過注解定義SQL語句,用以替代XML文件配置SQL。

2、MyBatis映射器分類

MyBatis映射器分為三類,如下所示:

(1)純xml映射器,利用SqlSession的各種方法實現增刪改查。例如:

Person p = session.selectOne("cn.mybatis.mydemo.mapper.PersonMapper.selectPersonById", 1);

(2)xml映射器+接口映射器的混合類型

先定義接口映射器,然后再定義xml映射器,其中xml映射器的namespace應該對應接口映射器的類名。其用法如下:

PersonMapper pm = session.getMapper(PersonMapper.class);
// 直接調用接口的方法,查詢id為1的Peson數據
Person p2 = pm.selectPersonById(1);

(3)注解+接口映射器的混合形式

此類形式,將原先xml里面的sql配置信息,變成Java注解的形式寫到接口映射器,用法與上面的例子雷同。

3、引入映射器的三種方式

3.1、通過文件類路徑引入XML映射器

<mappers>
 <mapper resource="cn/mybatis/mydemo/mapper/StudentMapper.xml"/>
</mappers>

3.2、通過包名引入映射器接口

<mappers>
    <package name="cn.mybatis.mydemo.mapper" />
</mappers>

3.3、用類注冊引入映射器接口

<mappers>
    <mapper class="cn.mybatis.mydemo.mapper.StudentMapper"/>
</mappers>

3.4、更多介紹請查看官網文檔

mybatis 映射器(mappers)的引入方式

官網文檔提到了四種引入方式,其實最常用的就是本文所列的以上三種形式。

4、準備工作

先用以下SQL語句創建student表。

CREATE TABLE `student` (
    `id` bigint(20) NOT NULL,
    `name` varchar(20) DEFAULT NULL,
    `address` varchar(20) DEFAULT NULL,
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

然后,定義一個 POJO,如下所示。

public class Student {
    private Long id;
    private String name;
    private String address;
    
    /**setter and getter**/
}

5、XML映射器+接口映射器

用XML定義映射器分為兩個部分:接口定義和XML配置。先定義一個映射器接口,如下所示。

public interface StudentMapper {
    public Student getStudent(Long id);
}

注意:映射器只是一個接口,而不是一個實現類。初學者可能會產生一個很大的疑問:接口不是不能運行嗎?的確,接口不能直接運行,但是MyBatis內部運用了動態代理技術,生成接口的實現類,從而完成接口的相關功能。只要明白 MyBatis 會為這個接口生成一個代理對象,代理對象會去處理映射器接口相關的邏輯即可。

然后,用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="cn.mybatis.mydemo.mapper.StudentMapper">
    <select id="getStudent" parameterType="long" resultType="student">
        SELECT id,name,address FROM Student WHERE id =#{id}
    </select>
</mapper>

有了這兩個文件,就完成了一個映射器的定義。關于XML文件內容介紹,如下所示:

(1)<mapper> 元素中的屬性 namespace 所對應的是一個接口的全限定名,于是 MyBatis 上下文就可以通過它找到對應的接口。

(2)<select> 元素表明這是一條查詢語句,而屬性 id 標識了這條 SQL,屬性 parameterType="long" 說明傳遞給 SQL 的是一個 long 型的參數,而 resultType="student" 表示返回的是一個 Student 類型的返回值。而 student是配置文件 mybatis-config.xml 配置的別名,指代的是 com.mybatis.domain.Student。這條 SQL 中的 #{id} 表示傳遞進去的參數。

注意:我們并沒有配置 SQL 執行后和 Student 的對應關系,它是如何映射的呢?其實,這里采用的是一種被稱為自動映射的功能,MyBatis在默認情況下提供自動映射,只要SQL返回的列名能和POJO的屬性對應起來即可。

最后,在MyBatis的配置文件里面引入這個XML映射器文件:

<mapper resource="cn/mybatis/mydemo/mapper/StudentMapper.xml" />

5.1、接口綁定

接口綁定,就是在MyBatis中任意定義接口,然后把接口里面的方法和SQL語句綁定,我們直接調用接口方法就可以,這樣比起原來了SqlSession提供的方法,可以有更加靈活的選擇和設置。

接口綁定有兩種實現方式,一種是通過注解綁定,就是在接口的方法上面加上 @Select、@Update等注解,里面包含Sql語句來綁定;另外一種就是通過xml里面寫SQL來綁定,在這種情況下,要指定xml映射文件里面的namespace必須為接口的全路徑名。

當Sql語句比較簡單時候,用注解綁定,當SQL語句比較復雜時候,用xml綁定。一般情況下,用xml綁定的比較多。

使用MyBatis的mapper接口調用時要注意的事項有:

(1)Mapper接口方法名和mapper.xml中定義的每個sql的id相同;

(2)Mapper接口方法的輸入參數類型和mapper.xml中定義的每個sql 的parameterType的類型相同;

(3)Mapper接口方法的輸出參數類型和mapper.xml中定義的每個sql的resultType的類型相同;

(4)Mapper.xml文件中的namespace即是mapper接口的類路徑。

5.2、參考

MyBatis常見面試題9:什么是MyBatis的接口綁定?有哪些實現方式?

6、注解+接口映射器

除 XML方式定義映射器外,還可以采用注解方式定義映射器,它只需要一個接口就可以通過 MyBatis 的注解來注入 SQL,如下所示。

public interface StudentMapper2 {
    @Select("select id,name,address from student where id=#{id}")
    public Student getStudent(Long id);
}

注解方式完全等同于XML方式創建映射器,但是使用注解的方式比XML方式要簡單得多。如果注解方式和XML方式同時定義時,XML 方式將覆蓋掉注解方式,一般情況下,MyBatis官方推薦使用的是XML方式,因為XML映射器能完成更復雜的SQL功能。

這個接口可以在 XML 中定義,如下所示:

<mappers>
    <mapper class="cn.mybatis.mydemo.mapper.StudentMapper"/>
</mappers>

7、映射器的使用方法

映射器的使用有兩種方式,一種方式是直接利用SqlSession進行數據庫操作,另外一種方式是SqlSession返回映射器Mapper,利用映射器來執行數據庫操作。如下所示:

public class App
{
    public static void main(String[] args) throws Exception
    {
        // 讀取mybatis-config.xml文件
        InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

        // 初始化mybatis,創建SqlSessionFactory類的實例
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        // 創建Session實例
        SqlSession session = sqlSessionFactory.openSession();

        // 操作數據庫方法一:獲得xml映射文件中定義的操作語句
        Student s = session.selectOne("cn.mybatis.mydemo.mapper.StudentMapper.getStudent", 1);
        // 打印Student對象
        System.out.println(s);

        // 操作數據庫方法二:獲得mapper接口的代理對象
        StudentMapper sm = session.getMapper(StudentMapper.class);
        // 直接調用接口的方法,查詢id為1的Student數據
        Student s2 = sm.getStudent(1);
        // 打印Peson對象
        System.out.println(s2);

        // 提交事務
        session.commit();
        // 關閉Session
        session.close();
    }
}

[站長推薦]-[系統化學習]


[網站公告]-[抵制某公眾號與某知識星球]


添加新評論

久久99国产只有精品