Mybatis使用入門,這一篇就夠了

来源:https://www.cnblogs.com/kexing/archive/2019/09/17/11537439.html
-Advertisement-
Play Games

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>

我這裡只介紹用法,詳解請看下麵的參考鏈接

參考 MyBatis 配置 typeAliases 詳解

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>

參考:配置MyBatis時報錯信息的解決方案

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>

#與$區別:

${}用在我們能夠確定值的地方,也就是我們程式員自己賦值的地方。
#{}一般用在用戶輸入值的地方!!

參考:
MyBatis中#{}和${}的不同和${}的妙用

模糊查詢:

模糊查詢中需要使用%等通配符,我們可以在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>

w3c select標簽、delete標簽等詳解

高級使用

1.動態代理

我們之前,上面都是在Dao類中寫上一段sqlsession.selectOne/selectList,還是比較麻煩

所以mybatis提供了一種簡單的方法,使用動態代理(介面類)可以簡化步驟

Mybatis中有這樣的約定:

  1. 介面方法名與mapper中的id相同
  2. 介面方法參數與parameterType類型相同
  3. 介面方法的返回值類型與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

  1. 如果傳入的是單參數且參數類型是一個List的時候,collection屬性值為list
  2. 如果傳入的是單參數且參數類型是一個array數組的時候,collection的屬性值為array
  3. 如果傳入的參數是多個的時候,我們就需要把它們封裝成一個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);

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 簡單整理常用演算法,記錄在此。 package com.demo.sort; import java.util.Arrays; public class Sort { public static void main(String[] args) { int size = 10; int[] arr = ...
  • 2019-09-17-23:09:48 今天學的內容是有關小數據池的,學的有點懵逼,感覺越來越難學了,但是得堅持下去 明天學習下一個課程時,感覺要跟不上,看來明天得先看好幾遍今天的內容 不然肯定會聽的懵逼 今天看見嗶哩嗶哩很多這樣的視頻,內容和我網上買的一樣的,心塞啊!!!!!!!!!!!! 今天的 ...
  • 本文源碼: "GitHub·點這裡" || "GitEE·點這裡" 一、生活場景 1、場景描述 在移動互聯網沒有普及之前,去飯店吃飯的流程大致如下:選座位,排隊,點菜,結賬。後來移動互聯網普及,通過手機APP就可以操作這些流程,非常的方便快捷:通過手機可以知道某飯店是不是還有空位,到了飯店之後直接入 ...
  • Dockerfile是一個文本文件,按順序包含構建給定鏡像所需的所有命令Docker通過讀取Dockerfile中的指令自動構建圖像 。 Dockerfile遵循特定的格式和指令集,您可以在Dockerfile引用中找到它們。 Docker鏡像由只讀層組成,每個層都代表一個Dockerfile指令。 ...
  • Go Modules 不完全教程 文章轉載自公眾號 Golang 成神之路 , 作者 L Go Modules 是 Golang 官方最近幾個版本推出的原生的包管理方式,在此之前,社區也不乏多種包管理方案。在討論 Go Modules 之前,我們先回顧一下 Golang 的包管理歷史的發展。然後討論 ...
  • 本內容首發公眾號 【電腦視覺聯盟】 ,關註獲取更多資料! 考慮到可能圖片壓縮,將思維導圖的pdf和jpg版本都上傳了百度雲,大家可以下載列印一張A4紙,方便查詢! 公眾號後臺回覆關鍵詞: 20190826 即可下載高清jpg、pdf 搜索 Ctrl + Shift + F7 用法高亮顯示 Ctrl ...
  • 通過第三方庫exifread讀取照片信息。 exifread官網:https://pypi.org/project/ExifRead/ ...
  • package org.fenixsoft.clazz;public class TestClass { private int m; public int inc() { return m + 1; }} // javap -verbose TestClass package zero.desk. ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...