MyBatis 對映器簡單概述
對映器是 MyBatis 中最重要、最複雜的元件,它由一個介面和對應的 XML 檔案(或註解)組成,它可以配置以下內容:
- 描述對映規則
- 提供SQL 語句,並可以配置 SQL 引數型別、返回型別、快取重新整理等資訊
- 配置快取
本次講述兩種實現對映器的方式,XML 檔案形式和註解形式。在此之前,先定義一個 POJO。
定義 POJO
package com.learn.ssm.chapter1.pojo; public class Role{ private Long id; private String roleName; private String note; public Long getId(){ return id; } public void setId(Long id){ this.id = id; } public String getRoleName(){ return roleName; } public void setRoleName(String roleName){ this.roleName = roleName; } public String getNote(){ return note; } public void setNote(String note){ this.note = note; } }
對映器的主要作用就是將 SQL 查詢到的結果對映為一個 POJO,或者將 POJO 的資料插入到資料庫中,並定義一些關於快取等的重要內容。
注意,此時編寫的只是一個介面,並不是一個實現類。介面不能直接執行,但是 MyBatis 運用了動態代理技術使介面能夠執行起來,MyBatis 會為這個介面生成一個代理物件,代理物件會去處理相關的邏輯。
一、用 XML 實現對映器
用 XML 定義對映器分為兩個部分:介面和 XML 。先定義一個對映器介面,程式碼如下:
對映器介面
package com.learn.ssm.chapter1.mapper; public interface RoleMapper{ public Role getRole(Long id); }
在用 XML 方式建立 SqlSession 的配置檔案時,有這樣一段程式碼:
<mapper resource="com/learn/ssm/chapter1/mapper/RoleMapper.xml"/>
它的作用就是引入一個 XML 檔案。
用 XML 方式建立對映器,程式碼如下:
用 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.learn.ssm.chapter1.mapper.RoleMapper"> <select id="getRole" parameterType="long" resultType="role"> select id,role_name,note as id,roleName,note from t_role where id=#{id} </select> </mapper>
有了這兩個檔案,就完成了一個對映器的定義。XML 檔案簡述:
- <mapper> 元素中的屬性 namespace 所對應的是一個介面的全限定名,於是 MyBatis 上下文就可以通過它找到對應的介面。
- <select> 元素表明這是一條查詢語句,而屬性 id 標識了這條 SQL,屬性 parameterType="long" 說明傳遞給 SQL 的是一個 long 型別的引數,而 resultType="role" 表示返回的是一個 role 型別的返回值。而 role 是在之前配置檔案 mybatis-config.xml 配置的別名,指代的是 com.learn.ssm.chapter1.pojo.Role。(<typeAliases><typeAlias alias="role" type="com.learn.ssm.chapter1.pojo.Role"/><typeAliases>)
- 這條 SQL 中的 #{id} 表示傳遞進去的引數。
注意,這裡我們並沒有配置 SQL 執行後和 role 的對應關係,採用的是一種被稱為自動對映的功能。MyBatis 在預設情況下提供自動對映,只要 SQL 返回的列名能和 POJO 對應起來即可。這裡 SQL 返回的 id、role_name 、note 是可以和 POJO 的屬性對應起來的,而且表裡的列名 role_name 通過 SQL 別名的改寫,使其成為 roleName,這樣就使其和 POJO 屬性對應起來,所以此時 MyBatis 就可以把 SQL 查詢的結果通過自動對映的功能對映成為一個 POJO。
二、註解實現對映器
除 XML 方式定義對映器外,還可以採用註解方式定義對映器,它只需要一個介面就可以通過 MyBatis 的註解來注入 SQL,程式碼如下:
通過註解實現對映器
import com.learn.ssm.chapter1.pojo.Role;
public interface RoleMapper2{
@Select("select id,role_name as roleName,note from t_role where id=#{id})
public Role getRole(Long id);
}
這完全等同於 XML 方式建立對映器。如果它和 XML 方式同時定義,XML 方式將會覆蓋掉註解方式,所以 MyBatis 官方推薦使用 XML 方式。此外,XML 方式可以相互引入,而註解是不可以的,所以在複雜場景下,使用 XML 方式會更加靈活和方便。
三、傳送 SQL
1.SqlSession 傳送 SQL
有了對映器就可以通過 SqlSession 傳送 SQL 了。我們以 getRole (事先在 XML 對映檔案定義好的,id 為 getRole)這條 SQL 為例,看看如何傳送 SQL。
Role role = (Role)sqlSession.selectOne("com.learn.ssm.chapter1.mapper.RoleMapper.getRole",1L);
selectOne 方法表示使用查詢並且只返回一個物件,引數是一個 String 物件和一個 Object 物件。String 物件是由一個名稱空間加上 SQL id 組合而成的,它完全定位了一定 SQL ,這樣MyBatis 就會找到對應的 SQL。如果在 MyBatis 中只有一個 id 為 getRole 的 SQL ,那麼也可以簡寫為:
Role role = (Role)sqlSession.selectOne("getRole",1L);
這是 MyBatis 前身 iBatis 所留下的方式。第二個引數是一個 long 引數,long 引數是它的主鍵。
2.用 Mapper 介面傳送 SQL
SqlSession 還可以獲取 Mapper 介面,通過 Mapper 介面傳送 SQL ,程式碼如下:
用 SqlSession 獲取 Mapper 介面,併發送 SQL
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
Role role = roleMapper.getRole(1L);
通過 SqlSession 的 getMapper 方法來獲取一個 Mapper 介面,就可以呼叫它的方法了。因為 XML 檔案或者介面註解定義的 SQL 都可以通過“類的全限定名+方法名”查詢,所以 MyBatis 會啟用對應的 SQL 進行執行,並返回結果。