1. 程式人生 > >MyBatis 對映器簡單概述

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 進行執行,並返回結果。