mybatis中,封裝了一個sqlsession 對象(裡面封裝有connection對象),由此對象來對資料庫進行CRUD操作。 運行流程 mybatis有一個配置的xml,用於配置數據源、映射Mapping,xml的文件名可以任取,為了方便,我們還是起mybatis config.xml 我們讀 ...
mybatis中,封裝了一個sqlsession 對象(裡面封裝有connection對象),由此對象來對資料庫進行CRUD操作。
運行流程
mybatis有一個配置的xml,用於配置數據源、映射Mapping,xml的文件名可以任取,為了方便,我們還是起mybatis-config.xml
我們讀取此配置的xml,獲得一個sqlsession,之後由此對象類進行資料庫的CRUD操作
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = factory.openSession();
入門使用
1. 創建實體類和Dao類
2. 配置mybatis-config.xml文件,配置數據源
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 引入外部資源文件-->
<properties resource="jdbc.properties"/>
<!-- 配置數據源環境 -->
<environments default="development">
<environment id="development">
<!-- 資料庫事務管理類型 -->
<transactionManager type="JDBC"/>
<!-- 數據源,type=pooled 說明是使用連接池方式,可以節省資源 -->
<dataSource type="POOLED">
<!-- 調用資源文件里的用戶信息-->
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
</configuration>
3. 定義連接資料庫工具,可以獲得sqlsession對象
Dao類中每次進行CRUD操作,都要執行一次openSession方法
來獲得SqlSession對象
,造成資源的浪費和代碼的重覆
所以,和之前的JdbcUtil
工具類一樣,我們也定義定義一個工具類MyBatisUtil
,用來返回SQLSession對象
static SqlSessionFactory sqlSessionFactory = null;
static {
try {
// 載入mybatis配置文件,並創建SqlSessionFactory實例
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//這個build方法可以接受幾種不同的參數,如Reader/InputSteam等
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
}
}
public static SqlSession getSqlSession() {
return sqlSessionFactory.openSession();
}
public static void closeSqlSession(SqlSession sqlSession){
if (sqlSession != null) {
sqlSession.close();
}
}
4. sql語句寫在mapper中
mapper文件放在了resources下麵
Mybatis中,sql語句則是寫在了xml文件中,這些xml文件也稱為mapper映射文件
mapper標簽如果帶有xmln屬性,IDEA會報解析xml錯誤,得把xmln屬性刪除
<?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">
<!--
namespace: 命名空間,用於標識每一個Mapper XML文件中的語句,預防在不同的Mapper XML文件中存在相同的語句ID
-->
<mapper namespace="employeeMapper">
<!--
resultType: 也稱為自動映射,只有在表的列名與POJO類的屬性完全一致時使用,會比較方便,全類名
-->
<select id="selectAll" resultType="com.wan.bean.Employee">
select * from employee
</select>
</mapper>
5. 在mybatis-config.xml文件中註冊mapper
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 省略數據源配置-->
<mappers>
<mapper resource="com/wan/mapping/employeeMapper.xml"/>
<!--如果還有mapper,則繼續添加 -->
</mappers>
</configuration>
6. dao類通過sqlsession進行查詢
SqlSession sqlSession = MybatisUtil.getSqlSession();
// 調用語句,如果有參數,傳入參數
//參數為命名空間namespace+id,執行xml中的sql語句
List<Employee> list = sqlSession.selectList("employeeMapper.selectAll");
PS:如果是插入、更新和刪除操作,還需要提交操作,預設是不會自動提交的
sqlSession.commit();
補充
1.typeAliases標簽
<select id="selectAll" resultType="com.wan.bean.Employee">
select * from employee
</select>
resultType
屬性需要全類名,我們可以使用typeAliases
標簽來簡化輸入
typeAliases
標簽需要在mybatis-config.xml
文件中進行設置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<properties resource="jdbc.properties"/>
<!--指定一個bean包 -->
<typeAliases>
<package name="com.wan.bean"/>
</typeAliases>
<!--省略配置數據源等-->
</configuration>
之後我們的mapper文件中就可以這樣寫
<!--resultType就可以不用寫全包名 -->
<select id="selectAll" resultType="Employee">
select * from employee
</select>
我這裡只介紹用法,詳解請看下麵的參考鏈接
2.引入mapper的四種方法
1. 文件路徑註冊
<mappers>
<mapper resource="com/wan/mapper/EmployeeMapper.xml" />
</mappers>
2. 包名掃描註冊
<mappers>
<package name="com.wan.mapper" />
</mappers>
使用這種,必須保證xxxMapper.java和xxxMapper.xml兩者名字一模一樣!而且是要在同一包里
3. 類名註冊
<mappers>
<mapper class="com.shizongger.chapter2.mapper.UserMapper" />
</mappers>
4. url註冊
<mappers>
<mapper url="file:/home/shizongger/workspace/Chapter3/src/com/shizongger/chapter2/mapper/RoleMapper.xml" />
</mappers>
SQLSession方法說明
方法名 | 說明 |
---|---|
insert | 插入 |
delete | 刪除 |
update | 更新 |
selectOne | 查找單行結果,返回一個Object |
selectList | 查找多行結果,返回一個List |
使用和之前一樣,第一個參數傳入一個namespce+id,就可以找到指定的mapper文件裡面的sql語句,並執行
CRUD
查詢
Employee中,屬性名和表的列名對應
<select id="selectAll" resultType="Employee">
select * from employee
</select>
如果屬性和表的列名不一致,可以使用列名映射resultMap標簽,(也就是自動轉為別名)
<!--type也是需要全包名,由於之前定義的別名,所以就可以不寫-->
<resultMap id="baseResultMap" type="Employee">
<!--使用映射,把對應的列名映射為對應的屬性 -->
<id property="empno" column="EMPNO" />
<result property="ename" column="ENAME"/>
<result property="job" column="JOB"/>
<result property="mgr" column="MGR"/>
<result property="hiredate" column="HIREDATE"/>
<result property="sal" column="SAL"/>
<result property="comm" column="COMM"/>
<result property="deptno" column="DEPTNO"/>
</resultMap>
<!--引用上面定義的resultMap-->
<select id="selectAll" resultMap="baseResultMap">
select * from employee
</select>
帶條件查詢
<select id="selectById" parameterType="int" resultMap="baseResultMap">
<!-- 如果參數類型是簡單的基本或者包裝類型,#{} 裡面的可以任取,都是可以獲得參數 -->
select * from EMPLOYEE where EMPNO=#{id}
</select>
//使用
Employee e = sqlsession.selectOne("employeeMapper.selectById",7369);
上面的select語句相當於一個預編譯語句
String s = "SELECT * FROM employee WHERE empno=?";
PreparedStatement ps = conn.prepareStatement(s);
ps.setInt(1,empno);
多條件查詢
可以使用where標簽,當然,之前的單條件也可以使用where標簽,where標簽好處是會自動刪除多餘的and
<select id="selectSelective" parameterType="Employee" resultMap="baseResultMap">
select * from EMPLOYEE
<where>
<!--自動刪除多餘的and -->
<!--#相當於從傳入的bean對象(Employee)中通過getDeptno方法獲得屬性值 -->
and deptno=#{deptno}
and sal>=2000
</where>
</select>
大小比較條件
條件中有大小比較,<
號得通過CDATA存放條件
<select id="selectSelective" parameterType="Employee" resultMap="baseResultMap">
select * from EMPLOYEE
<where>
<!--loSal為Employee的一個屬性,#{loSal}相當於是通過Employee對象的get方法來獲得loSal的屬性值 -->
and SAL>=#{loSal}
<!--CDATA中的數據不會被解析器解析 -->
<![CDATA[ and SAL<=#{hiSal} ]]>
</where>
</select>
#與$區別:
${}
用在我們能夠確定值的地方,也就是我們程式員自己賦值的地方。
而#{}
一般用在用戶輸入值的地方!!
模糊查詢:
模糊查詢中需要使用%
等通配符,我們可以在xml中定義好,自動拼接通配符
<select id="selectSelective" parameterType="Employee" resultMap="baseResultMap">
select * from EMPLOYEE
<where>
<if test="ename != null">
<!--使用bind標簽,設置格式,自動拼接通配符 -->
<bind name="pattern" value="'%' + ename + '%'"/>
and ENAME like #{pattern}
</if>
</where>
</select>
動態查詢
Mybatis中提供了if
標簽用來實現動態查詢,和JSTL標簽庫使用類似
<select id="selectSelective" parameterType="Employee" resultMap="baseResultMap">
select * from EMPLOYEE
<where>
<!--#{ename}其實是通過Employee類中的get方法來獲得對象的ename屬性值 -->
<if test="ename != null">
and ename=#{ename}
</if>
<if test="job != null and job.trim().length>0">
and JOB=#{job}
</if>
<if test="deptno != null">
and DEPTNO=#{deptno}
</if>
</where>
</select>
插入
主鍵為序列
某個主鍵是由oracle中的序列生成的
<insert id="insert_1" parameterType="Employee">
<!--
keyProperty: 表示將從序列獲得的值賦予實體的哪個屬性
order: 表示主鍵值生成的方式,可取值:BEFORE | AFTER
由於不同的資料庫對插入的數據時主鍵生成方式是不同,例如:
mysql and ms server: 主鍵生成方式為後生成方式。
oracle: 主鍵生成方式預生成.
-->
<!--調用資料庫中的序列,並賦值給傳入的Employee對象的empno屬性 -->
<selectKey keyProperty="empno" resultType="integer" order="BEFORE">
select EMP_SEQ.nextval from dual
</selectKey>
<!--
如果使用這種整表插入的方式,那當資料庫表的某些列可以為空值時,我將要告訴底層的JDBC驅動如何處理空值的情況,這不是mybatis所需要的,
而是底層有些JDBC驅動所需的特性,實際上就是讓JDBC驅動去調用PrepareStatement.setNull()來設置空值
-->
<!--如果是常用的數據類型int,date等,jdbcType可以省略不寫 -->
insert into EMPLOYEE
values (#{empno},#{ename},#{job},#{mgr,jdbcType=INTEGER},#{hiredate,jdbcType=DATE},#{sal,jdbcType=DOUBLE},#{comm,jdbcType=DOUBLE},#{deptno,jdbcType=INTEGER})
</insert>
復用sql語句
把insert要插入的列名和數值寫在sql標簽里,之後方便重用,之後重用的時候需要使用include
子標簽拼接sql語句
<!--insert into employee(ENAME,JOB..) values(xx,xx) -->
<!--(ENAME,JOB..) -->
<sql id="insert_set_column">
<!-- suffixOverrides屬性,會自動把多餘的“,”刪除 -->
<trim prefix="(" suffix=")" suffixOverrides=",">
empno,
<if test="ename != null">ENAME,</if>
<if test="job != null">JOB,</if>
<if test="mgr != null">MGR,</if>
<if test="hiredate != null">HIREDATE,</if>
<if test="sal != null">SAL,</if>
<if test="comm != null">COMM,</if>
<if test="deptno != null">DEPTNO,</if>
</trim>
</sql>
<!--(xx,xx,xx) -->
<sql id="insert_values">
<trim prefix="values(" suffix=")" suffixOverrides=",">
#{empno},
<if test="ename != null">#{ename},</if>
<if test="job != null">#{job},</if>
<if test="mgr != null">#{mgr},</if>
<if test="hiredate != null">#{hiredate},</if>
<if test="sal != null">#{sal},</if>
<if test="comm != null">#{comm},</if>
<if test="deptno != null">#{deptno},</if>
</trim>
</sql>
<insert id="insert_2" parameterType="Employee">
<selectKey keyProperty="empno" resultType="integer" order="BEFORE">
select EMP_SEQ.nextval from dual
</selectKey>
insert into EMPLOYEE
<!--拼接sql -->
<include refid="insert_set_column"/>
<include refid="insert_values"/>
</insert>
更新
<update id="update_1" parameterType="Employee">
update EMPLOYEE
<set>
<if test="ename != null and ename.trim().length>0">ENAME=#{ename},</if>
<if test="job != null and job.trim().length>0">JOB=#{job},</if>
<if test="mgr != null">MGR=#{mgr},</if>
<if test="hiredate != null">HIREDATE=#{hiredate},</if>
<if test="sal != null">SAL=#{sal},</if>
<if test="comm != null">COMM=#{comm},</if>
<if test="deptno != null">DEPTNO=#{deptno},</if>
</set>
<!-- <where>如果帶多條件的更依然可以使<where>元素動態生成where子句</where> -->
where EMPNO=#{empno}
</update>
<update id="update_2" parameterType="Employee">
update EMPLOYEE
<trim prefix="set" suffixOverrides=",">
<if test="ename != null and ename.trim().length>0">ENAME=#{ename},</if>
<if test="job != null and job.trim().length>0">JOB=#{job},</if>
<if test="mgr != null">MGR=#{mgr},</if>
<if test="hiredate != null">HIREDATE=#{hiredate},</if>
<if test="sal != null">SAL=#{sal},</if>
<if test="comm != null">COMM=#{comm},</if>
<if test="deptno != null">DEPTNO=#{deptno},</if>
</trim>
<!-- <where>如果帶多條件的更依然可以使<where>元素動態生成where子句</where> -->
where EMPNO=#{empno}
</update>
刪除
<delete id="delete" parameterType="Employee">
delete EMPLOYEE EMPNO=#{empno}
<!--條件多的話也可以使用<where>...</where> -->
</delete>
高級使用
1.動態代理
我們之前,上面都是在Dao類中寫上一段sqlsession.selectOne/selectList,還是比較麻煩
所以mybatis提供了一種簡單的方法,使用動態代理(介面類)可以簡化步驟
Mybatis中有這樣的約定:
- 介面方法名與mapper中的id相同
- 介面方法參數與parameterType類型相同
- 介面方法的返回值類型與resultType類型相同
滿足上面的條件,Mybatis就會將介面類中的方法和mapper中的sql語句一一對應起來,而不需要再次新建一個Dao,在Dao類裡面編寫方法
具體步驟:
1. 實體類編寫
2. 新建介面類
如果方法的返回值為void,則mapper中就不需要定義resultType屬性
如果方法返回值是List,mapper中的resultType為泛型T
package com.wan.mapping;
import com.wan.bean.Employee;
import java.util.List;
/**
* @author StarsOne
* @date Create in 2019/9/16 0016 20:38
* @description
*/
public interface EmployeeMapper {
List<Employee> selectAll();
}
2. 編寫mapper.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.wan.mapping.EmployeeMapper">
<!--特例:返回值為list,resultType=bean類-->
<select id="selectAll" resultType="Employee" >
select * from employee
</select>
</mapper>
3. 註冊mapper
這裡我們由於使用了package註冊mapper,一定保證xxmapper.java和xxmapper.xml兩個名字相同,大小寫都要一樣
保證Mapper.xml和介面的那個Mapper在相同的包路徑,在mybatis配置xml文件指定
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--省略數據源配置 -->...
<!-- 註冊SQL映射文件,在這些文件中寫SQL語句 -->
<mappers>
<!--指定整個包中的全部Mapper -->
<package name="com.wan.mapper"/>
</mappers>
</configuration>
4. 使用
使用還是和之前一樣,獲得SqlSession對象,此對象有個getMapper方法,把介面類傳入,就可以回調介面的方法了
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = factory.openSession();
EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
List<Employee> employees = mapper.selectAll();
介面類中的方法名與EmployeeMapper.xml中的對應
使用:
EmployeeMapper mapper = sqlsession.getMapper(EmployeeMapper.class);
mapper.selectById(7369);
2.遍歷列表
Mybatis中提供了foreach標簽,用於遍歷
如果方法參數傳入了一個List,可以使用此標簽遍歷,例子如下:
<!--相當於select * from employee where job in (...)) -->
<select id="selectByJobs" parameterType="list" resultMap="baseResultMap">
select * from EMPLOYEE
<where>
<foreach item="job" collection="list" open="JOB IN(" close=")" separator=",">
#{job}
</foreach>
</where>
</select>
foreach標簽的屬性主要有 item,index,collection,open,separator,close,使用和JSTL標簽裡面的foreach標簽差不多
屬性名 | 說明 |
---|---|
item | 表示集合中每一個元素進行迭代時的別名 |
index | 指定一個名字,用於表示在迭代過程中,每次迭代到的位置, |
open | 表示該語句以什麼開始, |
separator | 表示在每次進行迭代之間以什麼符號作為分隔 符, |
close | 表示以什麼結束。 |
關鍵屬性:collection
- 如果傳入的是單參數且參數類型是一個List的時候,collection屬性值為list
- 如果傳入的是單參數且參數類型是一個array數組的時候,collection的屬性值為array
- 如果傳入的參數是多個的時候,我們就需要把它們封裝成一個Map了,當然單參數也可以封裝成map,map的key就是參數名,所以這個時候collection屬性值就是傳入的List或array對象在自己封裝的map裡面的key
參考:mybatis 中 foreach collection的三種用法
3.考慮線程安全
使用ThreadLocal對象,保證每個線程取出的SqlSession是同一個對象
方法 | 說明 |
---|---|
void set(Object value) | 設置當前線程的線程局部變數的值。 |
public Object get() | 該方法返回當前線程所對應的線程局部變數。 |
public void remove() | 將當前線程局部變數的值刪除,目的是為了減少記憶體的占用,該方法是JDK 5.0新增的方法。 |
protected Object initialValue() | 返回該線程局部變數的初始值,該方法是一個protected的方法,顯然是為了讓子類覆蓋而設計的。 |
static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
//設置
threadLocal.set(sqlsession);
//取出
SqlSession s = threadLocal.get();
4.嵌套查詢
<!-- 結果集映射: 列《》屬性名 -->
<resultMap id="baseResultMap" type="Employee">
<!-- 專門映射主鍵列 -->
<id property="empno" column="EMPNO" />
<result property="ename" column="ENAME"/>
<result property="job" column="JOB"/>
<result property="mgr" column="MGR"/>
<result property="hiredate" column="HIREDATE"/>
<result property="sal" column="SAL"/>
<result property="comm" column="COMM"/>
<result property="deptno" column="DEPTNO"/>
</resultMap>
<!-- 擴展另一個結果映射 -->
<resultMap id="extendBaseResultMap" type="Employee" extends="baseResultMap">
<association property="department" javaType="Department">
<!-- 關聯的嵌套結果 -->
<id property="deptno" column="DEPTNO"/>
<result property="dname" column="DNAME"/>
<result property="location" column="LOC"/>
</association>
</resultMap>
<!--
1.嵌套結果(推薦使用)
優點:性能好,一條語句把所有實體的數據完全查詢出來。
缺點:對SQL編寫的要求高了,因為涉及多表連接查詢
-->
<select id="selectById" resultMap="extendBaseResultMap" parameterType="int">
select e.EMPNO,
e.ENAME,
e.JOB,
e.MGR,
e.HIREDATE,
e.SAL,
e.COMM,
d.DEPTNO,
d.DNAME,
d.LOC
from EMPLOYEE E
inner join DEPARTMENT D
on E.DEPTNO = D.DEPTNO
where E.EMPNO=#{id}
</select>
<!--
2. 嵌套查詢
優點:編寫SQL簡單,無需做多表的連接查詢;關聯的實體通過單獨的SQL語句查詢並單獨封裝。
缺點:執行了N+1條件語句。性能差
-->
<resultMap id="extendBaseResultMap_2" type="Employee" extends="baseResultMap">
<association property="department" column="DEPTNO" select="selectDepartmentById" />
</resultMap>
<select id="selectDepartmentById" parameterType="int" resultType="Department">
select deptno,
dname,
loc as location
from DEPARTMENT where DEPTNO=#{id}
</select>
<select id="selectById_2" resultMap="extendBaseResultMap_2" parameterType="int">
select e.EMPNO,
e.ENAME,
e.JOB,
e.MGR,
e.HIREDATE,
e.SAL,
e.COMM,
e.DEPTNO
from EMPLOYEE E
where E.EMPNO=#{id}
<!-- or e.empno=7902 or e.empno=7844 -->
</select>
5.分頁查詢
分頁的話,像以前那樣使用三層嵌套查詢也可以實現。
不過,有開發者為Mybatis開了個一個插件PageHelper,可以用來更為簡單地使用分頁查詢
1.添加jar包
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<!--自動下載最新版本 -->
<version>REALSE</version>
</dependency>
2.配置攔截器插件
<!--
plugins在配置文件中的位置必須符合要求,否則會報錯,順序如下:
properties?, settings?,
typeAliases?, typeHandlers?,
objectFactory?,objectWrapperFactory?,
plugins?,
environments?, databaseIdProvider?, mappers?
-->
<plugins>
<!-- com.github.pagehelper為PageHelper類所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 使用下麵的方式配置參數,後面會有所有的參數介紹 -->
<property name="param1" value="value1"/>
</plugin>
</plugins>
3.代碼使用
只有在查詢之前調用過startPage
或者是offsetPage
方法,後面的查詢出來的List結果就會進行分頁查詢
下麵的兩個都是查詢第一頁,每一頁有10條數據
//第二種,Mapper介面方式的調用,推薦這種使用方式。
PageHelper.startPage(1, 10);
List<Employee> employees = employeeMapper.selectAll();
//第三種,Mapper介面方式的調用,推薦這種使用方式。
PageHelper.offsetPage(1, 10);
List<Employee> employees = employeeMapper.selectAll();
這裡提一下,這個插件還帶有一個PageInfo
類,裡面有可以記錄各種信息
剛開始,我以為是和我之前自己封裝的Page一樣,詳情請看Jsp學習筆記(4)——分頁查詢
但是,其實不一樣的,這個PageInfo就是一個封裝而已,只是用來存放數據而已,裡面有各種信息
屬性 | 說明 |
---|---|
pageNum | 當前頁號(第幾頁) |
pageSize | 每頁的顯示的數據個數 |
size | 當前頁的顯示的數據個數 |
startRow | 當前頁面第一個元素在資料庫中的行號 |
endRow | 當前頁面最後一個元素在資料庫中的行號 |
pages | 總頁數 |
prePage | 上一頁的頁號 |
nextPage | 下一頁頁號 |
isFirstPage | 是否為第一頁 |
isLastPage | 是否為最後一頁 |
hasPreviousPage | 是否有前一頁 |
hasNextPage | 是否有下一頁 |
navigatePages | 導航頁碼數 |
navigatepageNums | 所有導航頁號 |
navigatePages | 導航條上的第一頁 |
navigateFirstPage | 導航條上的第一頁 |
navigateLastPage | 導航條上的最後一頁 |
有個getTotal
方法,可以獲得查詢結果的總記錄數
PageHelper.startPage(1, 10);
List<Employee> employees = mapper.selectAll();
PageInfo<Employee> pageInfo = new PageInfo<>(employees);