Mybatis學習筆記(三):映射器與Mapper接口

什麼是映射器

Mybatis框架爲開發人員準備了專門用於寫sql的地方,程序員可以將每個模塊的sql都寫在一起便於維護,這個地方就叫做映射器,其本質上就是由一個個映射文件組成,而映射文件本質上是個xml文件。
在這個xml中包含了輸入映射(將代碼中傳遞的參數映射到sql參數中)、輸出映射(sql執行得到的結果封裝爲POJO對象)、動態sql(給sql添加判斷條件,複用sql等等)、參數封裝等等,因此將所有映射文件稱爲映射器。

<?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.xxx.mapper.DeptMapper" >
    <insert id="insertDept" parameterType="dept">
        insert into dept(dept_name,loc) values (#{deptName},#{loc})
    </insert>
    <sql id="colum">
        dept_no deptNo,dept_name deptName,loc
    </sql>
    <select id="selectDept" parameterType="map" resultType="dept">
        select <include refid="colum"/> from dept where dept_no=#{deptNo}
    </select>
</mapper>

映射文件中可以寫什麼

CRUD

對應着數據庫的經典操作CRUD,在映射文件中使用insert、select、delete和update四個標籤標示,在標籤中可以寫對應的sql語句,它支持以佔位符的方式傳遞參數,還可以寫sql片段來複用sql語句,也可以寫resultMap結果映射標籤,還可以定義緩存規則。

輸入映射

參數的來源是由parameterType指定參數類型,目前支持基本數據類型、pojo對象類型,數組或map類型的參數映射,基本包含了絕大部分傳遞參數的方式,自從使用pojo對象傳遞參數後parameterMap就被廢棄了。

輸出映射

當從數據庫中查詢出記錄後把這些結果封裝到pojo對象中的工作就是輸出映射,主要是通過resultType指定封裝的類型,同輸入映射類似,輸出映射也包含了絕大部分的映射方式,開發人員還可以手動選擇將哪個列封裝到哪個屬性中,這就需要通過定義resultMap標籤來定義了。

resultMap標籤

<resultMap id="" type="">
        <result ></result>
        <id></id>
        <association property=""></association>
        <collection property=""></collection>
    </resultMap>

在此標籤中通過result定義數據庫列和屬性的對應關係,通過id指定主鍵,association指定一對一的關聯,collection指定一對多的關聯。

sql片段

<sql id="colum">
        dept_no deptNo,dept_name deptName,loc
    </sql>
    <select id="selectDept" parameterType="map" resultType="dept">
        select <include refid="colum"/> from dept where dept_no=#{deptNo}
    </select>

sql片段主要的作用就是用來封裝一些公共的sql,當需要使用時直接通過include方式包含進去,可以節省很多重複的語句。

緩存

mybatis爲我們提供了一級緩存、二級緩存和自定義緩存,一級緩存指sqlsession級別的緩存,二級緩存對應sqlSessionFactory級別的緩存,默認情況下指開啓一級緩存,可以通過總配置文件中settings標籤設置是否開啓二級緩存,如果想實現自定義緩存,則需要實現mybatis提供的Cache接口,在映射文件中通過cache標籤註冊即可。

<cache type="" ></cache>

動態sql

此功能是mybatis對編寫sql語句的增強功能,可以在編寫sql時通過if、choose、when、otherwise、foreach、test、bind標籤對條件進行判斷,類似於編程的方式生成sql語句,只有標籤的判斷條件爲真時纔會把標籤體中的sql加入到最終生成的sql語句中。

什麼是Mapper接口

mapper接口其實就是一個普通的java接口,一個接口對應着一個映射文件,接口提供功能,配置文件負責做具體的事情,接口中一個方法對應着映射文件中的一個CRUD類型的標籤,方法的參數和返回值對應標籤的輸入映射和輸出映射,在代碼中調用接口便可以執行映射文件中的sql並獲取到返回結果。它們產生關聯的方式是mapper的命名空間必須是對應接口的全類名,方法名必須爲對應標籤的id值

<mapper namespace="com.xxx.mapper.DeptMapper" >
<select id="selectDept" parameterType="map" resultType="dept">
        select <include refid="colum"/> from dept where dept_no=#{deptNo}
</select>
public interface DeptMapper {
      public Dept selectDept(HashMap map);
}

映射文件和Mapper接口的關係

首先通過sqlSession.getMapper獲取到Mapper對象,調用mapper對象中的方法,框架會通過namespace定位到具體的映射文件,通過調用的方法名定位到具體的標籤,通過標籤的paramterType對其中的sql參數賦值,查到結果後通過resultType或resultMap封裝POJO對象並返回。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章