mybatis學習筆記(三):分頁查詢


項目結構:

數據庫測試數據:

db.properties 數據庫配置文件:

# mysql 配置
mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/mybatis
mysql.username=root
mysql.password=root

# oracle 配置
oracle.driver=oracle.jdbc.driver.OracleDriver
oracle.url=jdbc:oracle:thin:@localhost:1521:orcl
oracle.username=scott
oracle.password=tiger

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>

    <!--
        加載 src 路徑下的 配置文件(db.properties);
        下面通過 ${ 鍵 } 獲取對應的值;
    -->
    <properties resource="db.properties"/>

    <!--
        設置類型別名:在映射文件中所有的 com.mybatis.demo.Student 類型都可以使用 student 代替
    -->
    <typeAliases>
        <typeAlias type="com.mybatis.demo.Student" alias="student"/>
    </typeAliases>

    <!-- 設置一個默認的連接環境信息 -->
    <environments default="mysql_developer">

        <!-- 連接環境信息:取一個任意唯一的名字 -->
        <environment id="mysql_developer">
            <!-- mybatis 使用 jdbc 事務管理方式 -->
            <transactionManager type="jdbc"/>
            <!-- mybatis 使用連接池方式來獲取連接 -->
            <dataSource type="pooled">
                <!--
                    配置與數據庫交互的4個必要屬性 ;
                    ${mysql.driver}:表示獲取 db.properties 配置文件中 mysql.driver 的值;
                -->
                <property name="driver" value="${mysql.driver}"/>
                <property name="url" value="${mysql.url}"/>
                <property name="username" value="${mysql.username}"/>
                <property name="password" value="${mysql.password}"/>
            </dataSource>
        </environment>

        <!-- 連接環境信息:取一個任意唯一的名字 -->
        <environment id="oracle_developer">
            <!-- mybatis 使用 jdbc 事務管理方式 -->
            <transactionManager type="jdbc"/>
            <!-- mybatis 使用連接池方式來獲取連接 -->
            <dataSource type="pooled">
                <!-- 配置與數據庫交互的4個必要屬性 -->
                <property name="driver" value="${oracle.driver}"/>
                <property name="url" value="${oracle.url}"/>
                <property name="username" value="${oracle.username}"/>
                <property name="password" value="${oracle.password}"/>
            </dataSource>
        </environment>

    </environments>

    <!-- 加載映射文件 -->
    <mappers>
        <mapper resource="com/mybatis/demo/StudentMapper.xml"/>
    </mappers>

</configuration>

StudentMapper.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">

<!-- namespace 是名稱空間,理論上可以隨便寫,但必須保證唯一 -->
<mapper namespace="studentNamespace">

    <!--
        resultMap 標籤:映射實體與表的關係;
            當實體類中的屬性名 和 表中的字段名 不一樣的時候,<resultMap> 標籤表示的映射關係必須要寫;
            但是如果 實體類中的屬性名 和 表中的字段名 完全一樣的時候,<resultMap> 標籤可以省略不寫;

            id:爲實體類與表的映射 取一個任意的唯一編號;
            type:實體類的全路徑名;
    -->
    <resultMap id="studentMap" type="com.mybatis.demo.Student">
        <!-- property:表示實體類中的屬性; column:表示表中的字段 -->
        <id property="sid" column="id"/>
        <result property="sname" column="name"/>
        <result property="ssal" column="sal"/>
    </resultMap>

    <!--
        分頁查詢:
            parameterType:表示執行此 SQL 語句時傳入的參數類型;
            resultType:表示執行此 SQL 語句時返回的數據類型;
                理論上應該返回 List 集合類型,但這裏只需要寫 list 集合中 元素的類型即可;
            resultMap:表示將查詢出來的記錄根據 <resultMap> 標籤中的映射關係 自動封裝到對應的實體類中;
            注意:
                SQL 語句中的佔位符只需要寫 map 集合中的 key 即可,mybatis 能夠根據 key 自動獲取 value;
    -->
    <select id="findAllWithPage" parameterType="map" resultType="com.mybatis.demo.Student" resultMap="studentMap">
        select * from students limit #{pageStart}, #{pageSize}
    </select>
</mapper>

Student.java 實體類:

package com.mybatis.demo;

/**
 * 實體類
 */
public class Student {
    private int sid;
    private String sname;
    private Double ssal;

    public Student() {
    }

    public Student(int sid, String sname, Double ssal) {
        this.sid = sid;
        this.sname = sname;
        this.ssal = ssal;
    }

    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public Double getSsal() {
        return ssal;
    }

    public void setSsal(Double ssal) {
        this.ssal = ssal;
    }

    @Override
    public String toString() {
        return "Student{" +
                "sid=" + sid +
                ", sname='" + sname + '\'' +
                ", ssal=" + ssal +
                '}';
    }
}

MybatisUtils.java 工具類:

package com.mybatis.demo;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.Reader;
import java.sql.Connection;

/**
 * 工具類
 */
public class MybatisUtils {

    /**
     * 禁止外界通過 new 方法創建 工具類對象:構造方法私有化;
     */
    private MybatisUtils(){}

    /**
     * 創建一個線程對象,目的是將 SqlSession 和當前線程綁定到一起,線程結束,SqlSession 銷燬;
     */
    private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<>();
    /**
     * SqlSession 工廠
     */
    private static SqlSessionFactory sqlSessionFactory;

    /**
     * 類加載的時候 自動加載 src/mybatis.xml 配置文件
     */
    static {
        try {
            // 加載配置文件
            Reader reader = Resources.getResourceAsReader("mybatis.xml");
            // 根據配置文件構造 SqlSession 工廠
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }
    }

    /**
     * 獲取 SqlSession
     */
    public static SqlSession getSession() {
        // 從當前線程中獲取 SqlSession
        SqlSession sqlSession = threadLocal.get();
        // 如果線程中沒有 SqlSession 的話
        if (sqlSession == null) {
            // 找 SessionFactory 創建一個 SqlSession
            sqlSession = sqlSessionFactory.openSession();
            // 將當前線程與 SqlSession 綁定到一起
            threadLocal.set(sqlSession);
        }
        // 返回 SqlSession 對象
        return sqlSession;
    }

    /**
     * 關閉 SqlSession,並與當前線程分離
     */
    public static void closeSqlSession() {
        // 從當前線程中獲取 SqlSession
        SqlSession sqlSession = getSession();
        // 如果有的話就關閉
        if (sqlSession != null) {
            // 關閉
            sqlSession.close();
            // 分離當前線程與 SqlSession,目的是讓 GC 儘早回收
            threadLocal.remove();
        }
    }

    /**
     * 測試是否連接成功
     */
    public static void main(String[] args){
        Connection connection = MybatisUtils.getSession().getConnection();
        System.out.println(connection);
    }
}

StudentDao.java 測試類:

package com.mybatis.demo;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 持久層:測試分頁查詢
 */
public class StudentDao {

    /**
     * 分頁查詢
     * @param pageStart 當前頁顯示的第一條記錄的索引
     * @param pageSize 當前頁顯示的記錄個數
     */
    public int findAllWithPage(int pageStart, int pageSize) throws Exception{
        // 獲取 SqlSession 對象
        SqlSession sqlSession = MybatisUtils.getSession();
        try {
            // 封裝分頁參數
            Map<String, Integer> map = new HashMap<String, Integer>();
            map.put("pageStart", pageStart);
            map.put("pageSize", pageSize);

            /**
             * 執行 StudentMapper.xml 配置文件中的分頁 SQL 語句:
             *  傳入參數類型(Map)在配置文件中用 parameterType 屬性指定;
             *  返回參數類型(List<Student>)在配置文件中用 resultType 屬性指定;
             *      注意:用 resultType 屬性指定返回值類型的時候,理論上應該返回 list 類型,
             *          但是 mybatis 中只要指定 list 集合中的 元素的類型即可;
             */
            List<Student> list = sqlSession.selectList("studentNamespace.findAllWithPage", map);
            for(Student student : list)
                System.out.println(student);

            return 0;
        }catch (Exception e){
            e.printStackTrace();
            throw e;
        }finally {
            MybatisUtils.closeSqlSession(); // 關閉
        }
    }

    public static void main(String[] args) throws Exception{
        StudentDao dao = new StudentDao();
        // 分頁查詢
        System.out.println("********** 第一頁 *************");
        int ret = dao.findAllWithPage(0, 3);
        System.out.println("********** 第二頁 *************");
        ret = dao.findAllWithPage(3, 3);
        System.out.println("********** 第三頁 *************");
        ret = dao.findAllWithPage(6, 3);

    }
}

測試結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章