天天看點

mybatis——使用代理對象進行資料庫操作

mybatis接口代理方式實作dao層

  1. 接口代理方式-實作規則
    • 傳統方式實作 Dao 層,我們既要寫接口,還要寫實作類。而 MyBatis 架構可以幫助我們省略編寫 Dao 層接口實作類的步驟。程式員隻需要編寫接口,由 MyBatis 架構根據接口的定義來建立該接口的動态代理對象。
    • 實作規則
      1. 映射配置檔案中的名稱空間必須和 Dao 層接口的全類名相同。
      2. 映射配置檔案中的增删改查标簽的 id 屬性必須和 Dao 層接口的方法名相同。
      3. 映射配置檔案中的增删改查标簽的 parameterType 屬性必須和 Dao 層接口方法的參數相同。
      4. 映射配置檔案中的增删改查标簽的 resultType 屬性必須和 Dao 層接口方法的傳回值相同。
  2. 代碼示例
    • 接口舉例
      package com.itheima.mapper;
      
      import com.itheima.bean.Student;
      
      import java.util.List;
      
      /*
          持久層接口
       */
      public interface StudentMapper {
          
          //根據id查詢學生資訊
           Student selectById(Integer id);
      }
                 
    • 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.itheima.mapper.StudentMapper">
             <!--根據id查詢使用者-->
          	<!--
      			id屬性對應接口中的方法名
      			resultType:對應接口中方法的傳回值類型
      			parameterType:對應方法的參數
      			#{}隻有一個參數時,括号裡的變量名随便寫,多個參數後面再說。
      		-->
          <select id="selectById" resultType="student">
              SELECT * FROM student WHERE id=#{id}
          </select>
      </mapper>
                 

動态SQL

​ 在我們做複雜的業務邏輯的時候,簡單的slq語句已經不能支援,是以我們要使用動态sql

  1. ​ where标簽
    • 作用
      1. 代替slq語句中的where關鍵字
      2. 配合if标簽使用,在進行多條件查詢的時候,能夠去除多餘的and關鍵字
  2. if标簽
    • 作用:進行條件判斷的标簽,如果條件不成立,則标簽中的sql代碼段就不執行
    • 示例
      <!--多條件查詢-->
      <select id="selectCondition" parameterType="student" resultType="student">
      	SELECT * FROM student
      	<where>
      		<if test="id != null">
      			id = #{id}
      		</if>
      		<if test="name != null">
      			AND `name` = #{name}
      		</if>
      		<if test="age != null">
      			AND age = #{age}
      		</if>
      	</where>
      </select>
                 
  3. forEach标簽
    • 作用:當參數為集合或數組類型的時候,需要為sql語句加入數量不固定的參數
    • 示例
      <!--使用forEach周遊多個條件查詢-->
      <!--
      	collection:要周遊的參數的類型,集合就寫list,數組就行array
      	item:為周遊出來的元素起一個名字,可随意寫
      	open:周遊開始的時候需要加入sql語句的字元
      	close:周遊結束後需要加入sql語句的字元
      	separator:每一次周遊都要加入sql語句的字元
      -->
      <select id="selectByIds" parameterType="list" resultType="student">
      	SELECT * FROM student
      	<where>
      		<foreach collection="list" item="id" open="id IN (" close=")" separator=",">
      			#{id}
      		</foreach>
      	</where>
      </select>
                 
  4. sql标簽
    • 作用:用于定義使用頻率高,且複雜的slq代碼段
    • 示例
      <!--
      	id:表示此sql代碼端的唯一辨別,在使用include标簽引用的時候,會使用到id屬性的值
      -->
      <sql id="all">
      	SELECT * FROM student
      </sql>
                 
  5. include标簽
    • 作用:引用使用sql标簽定義的代碼段
    • 示例
      <!--查詢全部-->
      <select id="selectAll" resultType="student">
      	<include refid="all"/>
      </select>
      
                 

mybatis中配置分頁插件

​ 在開發中,分頁是必不可少的,但是目前我們使用的mybatis中是不帶分頁功能的,是以我們要想使用分頁插件,需要在mybatis核心檔案中進行配置。

​ 分頁助手:PageHelper,第三方分頁助手;将複雜的分頁操作進行封裝,進而讓分頁功能變得非常簡單。

​ 分頁插件的使用步驟

  1. 導入jar包
mybatis——使用代理對象進行資料庫操作
  1. 在mybatis核心配置檔案中配置分頁助手插件
    <!--
    配置插件
    	PageInterceptor:指定PageInterceptor類的全限定名
    -->
    <plugins>
    	<plugin interceptor="com.github.pagehelper.PageInterceptor"/>
    </plugins>
               
  2. 在java中使用分頁助手
    //查詢全部學生方法測試
    public void selectAll() {
    	//進行分頁(要先指定分頁規則,再進行sql操作)
    	PageHelper.startPage(1, 2);
    	//查詢所有
    	List<Student> students = mapper.selectAll();
    	students.forEach(student -> System.out.println(student));
    }
               
  3. 分頁助手相關API
    1. PageHelper:分頁助手功能類
      1. startPage():設定分頁參數
    2. PageInfo:分頁相關參數功能類。
      1. getTotal():擷取總條數
      2. getPages():擷取總頁數(分頁後)
      3. getPageNum():擷取目前頁
      4. getPageSize():擷取每頁顯示條數
      5. getPrePage():擷取上一頁
      6. getNextPage():擷取下一頁
      7. isIsFirstPage():擷取是否是第一頁
      8. isIsLastPage():擷取是否是最後一頁
  4. 代碼示例
    //查詢全部功能測試
    @Test
    public void selectAll() {
    	//進行分頁(要先指定分頁規則,再進行sql操作)
    	PageHelper.startPage(1, 2);
    	//查詢所有學生資訊
    	List<Student> students = mapper.selectAll();
    	//擷取學生list集合的分頁資訊,要傳入擷取到的學生資訊
    	PageInfo<Student> pageInfo = new PageInfo<>(students);
    	//擷取總記錄條數
    	long total = pageInfo.getTotal();
    	//擷取總分頁數
    	int size = pageInfo.getPages();
    	System.out.println("總記錄數:" + total);
    	System.out.println("總分頁數:" + size);
    	students.forEach(student -> System.out.println(student));
    }