mybatis接口代理方式實作dao層
- 接口代理方式-實作規則
- 傳統方式實作 Dao 層,我們既要寫接口,還要寫實作類。而 MyBatis 架構可以幫助我們省略編寫 Dao 層接口實作類的步驟。程式員隻需要編寫接口,由 MyBatis 架構根據接口的定義來建立該接口的動态代理對象。
- 實作規則
- 映射配置檔案中的名稱空間必須和 Dao 層接口的全類名相同。
- 映射配置檔案中的增删改查标簽的 id 屬性必須和 Dao 層接口的方法名相同。
- 映射配置檔案中的增删改查标簽的 parameterType 屬性必須和 Dao 層接口方法的參數相同。
- 映射配置檔案中的增删改查标簽的 resultType 屬性必須和 Dao 層接口方法的傳回值相同。
- 代碼示例
- 接口舉例
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
- where标簽
- 作用
- 代替slq語句中的where關鍵字
- 配合if标簽使用,在進行多條件查詢的時候,能夠去除多餘的and關鍵字
- 作用
- 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>
- 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>
- sql标簽
- 作用:用于定義使用頻率高,且複雜的slq代碼段
- 示例
<!-- id:表示此sql代碼端的唯一辨別,在使用include标簽引用的時候,會使用到id屬性的值 --> <sql id="all"> SELECT * FROM student </sql>
- include标簽
- 作用:引用使用sql标簽定義的代碼段
- 示例
<!--查詢全部--> <select id="selectAll" resultType="student"> <include refid="all"/> </select>
mybatis中配置分頁插件
在開發中,分頁是必不可少的,但是目前我們使用的mybatis中是不帶分頁功能的,是以我們要想使用分頁插件,需要在mybatis核心檔案中進行配置。
分頁助手:PageHelper,第三方分頁助手;将複雜的分頁操作進行封裝,進而讓分頁功能變得非常簡單。
分頁插件的使用步驟
- 導入jar包
- 在mybatis核心配置檔案中配置分頁助手插件
<!-- 配置插件 PageInterceptor:指定PageInterceptor類的全限定名 --> <plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"/> </plugins>
- 在java中使用分頁助手
//查詢全部學生方法測試 public void selectAll() { //進行分頁(要先指定分頁規則,再進行sql操作) PageHelper.startPage(1, 2); //查詢所有 List<Student> students = mapper.selectAll(); students.forEach(student -> System.out.println(student)); }
- 分頁助手相關API
- PageHelper:分頁助手功能類
- startPage():設定分頁參數
- PageInfo:分頁相關參數功能類。
- getTotal():擷取總條數
- getPages():擷取總頁數(分頁後)
- getPageNum():擷取目前頁
- getPageSize():擷取每頁顯示條數
- getPrePage():擷取上一頁
- getNextPage():擷取下一頁
- isIsFirstPage():擷取是否是第一頁
- isIsLastPage():擷取是否是最後一頁
- PageHelper:分頁助手功能類
- 代碼示例
//查詢全部功能測試 @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)); }