1. 程式人生 > >spring boot整合Mybatis簡介

spring boot整合Mybatis簡介

什麼是 MyBatis ?         MyBatis 是一款優秀的持久層框架,它支援定製化 SQL、儲存過程以及高階對映。MyBatis 避免了幾乎所有的 JDBC 程式碼和手動設定引數以及獲取結果集。MyBatis 可以使用簡單的 XML 或註解來配置和對映原生資訊,將介面和 Java 的 POJOs(Plain Old Java Objects,普通的 Java物件)對映成資料庫中的記錄。

總體流程:

(1)載入配置並初始化

      觸發條件:載入配置檔案

      配置來源於兩個地方,一處是配置檔案,一處是Java程式碼的註解,將SQL的配置資訊載入成為一個個MappedStatement物件(包括了傳入引數對映配置、執行的SQL語句、結果對映配置),儲存在記憶體中。

(2)接收呼叫請求

      觸發條件:呼叫Mybatis提供的API

      傳入引數:為SQL的ID和傳入引數物件

      處理過程:將請求傳遞給下層的請求處理層進行處理。

(3)處理操作請求

       觸發條件:API介面層傳遞請求過來

       傳入引數:為SQL的ID和傳入引數物件

       處理過程:

        (A)根據SQL的ID查詢對應的MappedStatement物件。

        (B)根據傳入引數物件解析MappedStatement物件,得到最終要執行的SQL和執行傳入引數。

        (C)獲取資料庫連線,根據得到的最終SQL語句和執行傳入引數到資料庫執行,並得到執行結果。

        (D)根據MappedStatement物件中的結果對映配置對得到的執行結果進行轉換處理,並得到最終的處理結果。

        (E)釋放連線資源。

(4)返回處理結果

步驟1:安裝

在pom檔案中新增依賴

<dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.2</version>
</dependency>

步驟2:設定配置

    配置檔案的作用是設定Mybatis操作資料庫的屬性,由於使用的是spring boot中mybatis的外掛,所以直接在application.properties當中便可以對mybatis進行配置,它的配置和其它的外掛一樣,使用mybatis字首

    1:config-location:

       mybatis的xml形式的配置檔案的路徑,這個屬性不能和configuration共同使用.

    2:check-config-location:

       檢查本地xml形式的配置檔案是否存在

    3:mapper-locations

       對映檔案Mapper.xml的路徑

    4:type-aliases-package

       用於搜尋Mapper.xml對映的實體類所在的包,包的分割符是 ",; "

    5.configuration

       mybatis的配置屬性,用這個構建Configuration物件,這個屬性不能和config-location共同使用

       configuration屬性下常用的配置有:

       map-underscore-to-camel-case: true   設定屬性對映方式,代表使用駝峰命名   

  mybatis預設是屬性名和資料庫欄位名一一對應的,即

        資料庫表列:user_name

        實體類屬性:user_name

   但是java中一般使用駝峰命名

        資料庫表列:user_name

        實體類屬性:userName

    default-statement-timeout: 30 設定超時的時間,它決定驅動等待資料庫響應的秒數

    cache-enabled:true  啟用對映快取功能

步驟3:配置Mapper介面掃描的包

在啟動類上添加註解 @MapperScan({"com.example.demo.*.dao"}),啟動之後,會自動掃描識別Mapper.xml檔案對應的介面

也可以通過在每個介面上新增@Mapper介面

步驟3:編寫資料庫對應的實體類        

 public class TPermissionEntiry {

        private Integer id;//許可權ID
        private Integer type;//許可權型別 1:選單許可權 2:資料許可權 3:操作許可權
        private String name;//許可權名稱
        private Integer no;//編號
        private Integer pno;//父編號
        private String url;//連結地址
        private String className;//保留欄位
        private Integer deleteFlag;//刪除標記 0:正常 1:禁用
        private String index;

        省略get,set方法...

}

步驟4:填寫操作的Mapper介面

介面中的每個方法對應著一個sql語句

public interface TPermissionMapper {

        //根據ID刪除一條
        int deleteByPrimaryKey(@Param("id")Integer id);
        //根據對應的類新增一條資料
        int insert(TPermissionEntiry record);
        //根據ID查詢一條
        TPermissionEntiry selectByPrimaryKey(Integer id);

}

步驟5:填寫實現Mapper介面對應的Mapper.xml檔案

Mapper介面的編寫需要遵守相關規範:

  • mapper.xml中的名稱空間namespace等於Mapper介面類的全路徑;
  • mapper.java中的方法名和mapper.xml中的增刪改查的id保持一致;
  • mapper介面中方法的輸入引數型別和mapper.xml中的ParameterType一致,如果是多個引數也可以不用寫;
  • mapper介面中的方法的返回值型別和mapper.xml中的ResultType一致。

遵循以上規範,mybatis就可以自動生成(反射機制)相關的mapper代理的實現類的物件。

例子:我們遵循在步驟2當中mapper-locations的配置,在對應的路徑下新建一個TPermissionMapper.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.hokai.sysManage.dao.TPermissionMapper" >

  <sql id="Base_Column_List" >
    id, type, name, no, pno, url, class_name, delete_flag,index
  </sql>

    <!-- 根據id查詢許可權 -->
  <select id="selectByPrimaryKey" resultMap="com.hokai.sysManage.bo.TPermissionEntiry" parameterType="java.lang.Integer" >
    select
    <include refid="Base_Column_List" />
    from t_permission
    where id = #{id,jdbcType=INTEGER}
  </select>

    <!-- 根據id刪除許可權 -->
  <delete id="deleteByPrimaryKey" parameterType="java.lang.Integer" >
    delete from t_permission
    where id = #{id,jdbcType=INTEGER}
  </delete>

    <!-- 新增一條許可權資料 -->
  <insert id="insert" parameterType="com.hokai.sysManage.bo.TPermissionEntiry" >
    insert into t_permission (id, type, name,
      no, pno, url, class_name,
      delete_flag)
    values (#{id,jdbcType=INTEGER}, #{type,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR},
      #{no,jdbcType=INTEGER}, #{pno,jdbcType=INTEGER}, #{url,jdbcType=VARCHAR}, #{className,jdbcType=VARCHAR},
      #{deleteFlag,jdbcType=INTEGER})
  </insert>

</mapper>

mybatis還提供了一種方式是在Mapper介面的每個方法上添加註解,而不用寫Mapper.xml檔案方式,

兩者比較:

註解在簡單sql執行時比xml方式簡單,註解方式拼接動態 sql 功能有限

xml方式比註解寫起來麻煩,但靈活性較高(拼接動態sql),效率較快(註解其實底層也是將他轉換成xml再執行)

public interface TPermissionMapper {

       //查詢資料
       @Select("select * from t_permission where p.delete_flag = 0 ")
       List<TPermissionEntiry> queryByPage();

       //根據對應的類新增一條資料
       @Insert("insert into t_permission (id, type, name, no, pno, url, class_name, delete_flag) values (#{id,jdbcType=INTEGER}, #{type,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, "#{no,jdbcType=INTEGER}, #{pno,jdbcType=INTEGER}, #{url,jdbcType=VARCHAR}, #{className,jdbcType=VARCHAR}, #{deleteFlag,jdbcType=INTEGER})")
       int insert(TPermissionEntiry record);

}