pagehelper分頁插件的簡單實用


結合mybatis實現對pagehelper分頁插件的簡單使用。

一、創建一個maven項目並導入相關依賴

依賴文件:pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.mgy</groupId>
    <artifactId>Mybatis_10_pagehelper</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.16</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.13</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!-- 分頁插件的依賴 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.0.0</version>
        </dependency>

    </dependencies>
</project>

二、創建一個操作實體:Employee.java

package com.mgy.mybatis.bean;

public class Employee {

    private Integer id;
    private String lastName;
    private String email;
    private String gender;
    private EmpStatus empStatus = EmpStatus.LOGOUT;

    public Employee() {
    }

    public Employee(String lastName, String email, String gender) {
        this.lastName = lastName;
        this.email = email;
        this.gender = gender;
    }

    public EmpStatus getEmpStatus() {
        return empStatus;
    }

    public void setEmpStatus(EmpStatus empStatus) {
        this.empStatus = empStatus;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "id=" + id +
                ", lastName='" + lastName + '\'' +
                ", email='" + email + '\'' +
                ", gender='" + gender + '\'' +
                '}';
    }
}

其他操作可能用到的枚舉類:EmpStatus.java

package com.mgy.mybatis.bean;

/**
 * @author MGY
 * @data 2019/11/20 22:00
 */
public enum EmpStatus {

    LOGIN,LOGOUT,REMOVE;
}

 

三、配置全局配置文件: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>

    <typeHandlers>
        <typeHandler handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" javaType="com.mgy.mybatis.bean.EmpStatus" />
    </typeHandlers>

    <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
    </plugins>

    <environments default="dev_mysql">
        <environment id="dev_mysql">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?allowMultiQueries = true&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;userSSL=false&amp;serverTimezone=GMT%2B8" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>

        <environment id="dev_oracle">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="oracle.jdbc.OracleDriver" />
                <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl" />
                <property name="username" value="scott" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>

    <!--
        5、databaseIdProvider: 支持多數據庫廠商的
            type="DB_VENDOR": VendorDatabaseIdProvider
                作用就是得到數據庫廠商的標識(驅動 getDatabaseProductName())
                MySQL、Oracle、SQL Server ...
    -->
    <databaseIdProvider type="DB_VENDOR">
        <!-- 為不同的數據庫廠商起別名 -->
        <property name="MySQL" value="mysql"/>
        <property name="Oracle" value="oracle"/>
        <property name="SQL Server" value="sqlserver"/>
    </databaseIdProvider>

    <!-- 將我們寫好的sql映射文件(EmployeeMapper.xml)一定要注冊到全局配置文件(mybatis-config.xml)中 -->
    <mappers>
        <mapper resource="EmployeeMapper.xml" />
    </mappers>
</configuration>

四、配置一個日志配置文件,方便在控制台查看sql語句的操作:log4j.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
 
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
 
 <appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
   <param name="Encoding" value="UTF-8" />
   <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m  (%F:%L) \n" />
   </layout>
 </appender>
 <logger name="java.sql">
   <level value="debug" />
 </logger>
 <logger name="org.apache.ibatis">
   <level value="info" />
 </logger>
 <root>
   <level value="debug" />
   <appender-ref ref="STDOUT" />
 </root>
</log4j:configuration>

五、創建一個操作數據庫的持久類:EmployeeMapper.java

package com.mgy.mybatis.dao;

import com.mgy.mybatis.bean.Employee;

import java.util.List;

public interface EmployeeMapper {

    Employee getEmpById(Integer id);

    Long addEmps(Employee employee);

    List<Employee> getMySQLEmployees();

    List<Employee> getOracleEmployees();
}

六、配置持久類EmployeeMapper.java的mybatis的映射文件:EmployeeMapper.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: 名稱空間;指定為接口的全類名
    id: 唯一標識
    resultType: 返回值類型
    #{id}: 從傳遞過來的參數中取出 id 值
-->
<mapper namespace="com.mgy.mybatis.dao.EmployeeMapper">
    <select id="getEmpById" resultType="com.mgy.mybatis.bean.Employee" >
        select id, last_name lastName, email, gender from tbl_employee where id = #{id}
    </select>

    <!--Long addEmps(Employee employee);-->
    <insert id="addEmps" useGeneratedKeys="true" keyProperty="id">
        insert into tbl_employee(last_name, email, gender, empStatus)
        values (#{lastName}, #{email}, #{gender}, #{empStatus})
    </insert>

    <!-- List<Employee> getMySQLEmployees(); -->
    <select id="getMySQLEmployees" resultMap="PageEmp" databaseId="oracle">
        select * from tbl_employee
    </select>

    <!-- List<Employee> getOracleEmployees(); -->
    <select id="getOracleEmployees" resultMap="PageEmp" databaseId="oracle">
        select * from employees
    </select>

    <resultMap id="PageEmp" type="com.mgy.mybatis.bean.Employee">
        <id column="employee_id" property="id" />
        <result column="last_name" property="lastName" />
        <result column="email" property="email" />
        <result column="gender" property="gender" />
    </resultMap>
</mapper>

七、編寫測試類:MyBatisTest.java

package com.mgy.mybatis.test;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.mgy.mybatis.bean.EmpStatus;
import com.mgy.mybatis.bean.Employee;
import com.mgy.mybatis.dao.EmployeeMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import java.util.UUID;

/**
 * 1、接口式編程
 *    原生:         Dao       ===========>    DaoImpl
 *    mybatis:       Mapper    ===========>    xxMapper.xml
 * 2、SqlSession 代表和數據庫的一次會話;用完必須關閉
 * 3、SqlSession 和 connection 一樣,它們都是非線程安全。每次使用都應該去獲取新的對象
 * 4、mapper 接口沒有實現類,但是 mybatis 會為這個接口生成一個代理對象
 *     (將接口和 xml 進行綁定)
 *     EmployeeMapper empMapper = sqlSession.getMapper(EmployeeMapper.class);
 * 5、兩個重要的配置文件:
 *      mybatis 的全局配置文件:包含數據庫連接池信息,事務處理器信息等....系統運行環境信息
 *      sql 映射文件:保存了每一個 sql 語句的映射信息:
 *                    將 sql 抽取出來
 */
public class MyBatisTest {

    public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(inputStream);
    }

    /**
     * 1、根據 xml 配置文件(全局配置文件)創建一個 SqlSessionFactory 對象  有數據源一些運行環境信息
     * 2、sql 映射文件;配置了每一個 sql,以及 sql 的封裝規則等。
     * 3、將 sql 映射文件注冊在全局配置文件中
     * 4、寫代碼:
     *      1)、根據全局配置文件得到 SqlSessionFactory
     *      2)、使用 sqlSessionFactory 獲取到 sqlSession 對象,使用它來執行增刪改查
     *           一個 sqlSession 就是代表和數據庫的一次會話,用完關閉
     *      3)、使用 sql 的唯一標識來告訴 MyBatis 執行哪個 sql。sql 都是保存在 sql 映射文件中的
     * @throws IOException
     */
    @Test
    public void test() throws IOException {

        // 2、獲取sqlSession實例,能直接執行已經映射的sql語句
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession();

        try {
            // selectOne 的參數
            // 參數1  sql的唯一標識:statement Unique identifier matching the statement to use.
            // 參數2  執行sql要用的參數:parameter A parameter object to pass to the statement.
            Employee employee = sqlSession.selectOne("com.mgy.mybatis.dao.EmployeeMapper.getEmpById", 1);
            System.out.println(employee);
        } finally {
            sqlSession.close();
        }
    }

    @Test
    public void test01() throws IOException {

        // 1、獲取 sqlSessionFactory 對象
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        // 2、獲取 sqlSession 對象
        SqlSession sqlSession = sqlSessionFactory.openSession();

        try {
            // 3、獲取接口的實現類對象
            // MyBatis 會為接口自動的創建一個代理對象,代理對象去執行增刪改查方法
            EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
            Employee empById = mapper.getEmpById(1);
            System.out.println(mapper.getClass());
            System.out.println(empById);
        } finally {
            sqlSession.close();
        }
    }

    @Test
    public void testBatch() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();

        // 可以執行批量操作的 sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);

        long start = System.currentTimeMillis();
        try {
            EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
            for (int i = 0; i < 10000; i++) {
                mapper.addEmps(new Employee(UUID.randomUUID().toString().substring(0, 5), "b", "1"));
            }
            sqlSession.commit();
            long end = System.currentTimeMillis();

            /*
             * 批量:(預編譯 sql 一次 ==> 設置參數 10000 次 ===> 執行一次) 執行時長:12394
             * Parameters: 09c31(String), b(String), 1(String)  (BaseJdbcLogger.java:145)
             *
             * 非批量: (預編譯 sql = 設置參數 = 執行 = 10000 次) 執行時長:21923
             * Preparing: insert into tbl_employee(last_name, email, gender) values (?, ?, ?)   (BaseJdbcLogger.java:145)
             * Parameters: 48154(String), b(String), 1(String)  (BaseJdbcLogger.java:145)
            * */
            System.out.println("執行時長:"+ (end - start));

        } finally {
            sqlSession.close();
        }
    }

    /**
     * MySQL 的測試
     * @throws IOException
     */
    @Test
    public void testMySQLPageHelper() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession();

        try {
            EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
            Page<Object> page = PageHelper.startPage(1, 5);
            List<Employee> employees = mapper.getMySQLEmployees();
            for (Employee employee : employees) {
                System.out.println(employee);
            }
            System.out.println("當前頁碼:"+page.getPageNum());
            System.out.println("總記錄數:"+page.getTotal());
            System.out.println("每頁的記錄數:"+page.getPageSize());
            System.out.println("總頁碼:"+page.getPages());

            // 傳入要連續顯示多少頁
            PageInfo<Employee> info = new PageInfo<Employee>(employees, 5);
            for (Employee employee : employees) {
                System.out.println(employee);
            }
            ///xxx
            System.out.println("當前頁碼:"+info.getPageNum());
            System.out.println("總記錄數:"+info.getTotal());
            System.out.println("每頁的記錄數:"+info.getPageSize());
            System.out.println("總頁碼:"+info.getPages());
            System.out.println("是否第一頁:"+info.isIsFirstPage());
            System.out.println("連續顯示的頁碼:");
            int[] nums = info.getNavigatepageNums();
            for (int i = 0; i < nums.length; i++) {
                System.out.println(nums[i]);
            }
        } finally {
            sqlSession.close();
        }
    }

    /**
     * Oracle 測試
     * @throws IOException
     */
    @Test
    public void testOraclePageHelper() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession();

        try {
            EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
            Page<Object> page = PageHelper.startPage(1, 5);
            List<Employee> employees = mapper.getOracleEmployees();
            for (Employee employee : employees) {
                System.out.println(employee);
            }
            System.out.println("當前頁碼:"+page.getPageNum());
            System.out.println("總記錄數:"+page.getTotal());
            System.out.println("每頁的記錄數:"+page.getPageSize());
            System.out.println("總頁碼:"+page.getPages());

            // 傳入要連續顯示多少頁
            PageInfo<Employee> info = new PageInfo<Employee>(employees, 5);
            for (Employee employee : employees) {
                System.out.println(employee);
            }
            ///xxx
            System.out.println("當前頁碼:"+info.getPageNum());
            System.out.println("總記錄數:"+info.getTotal());
            System.out.println("每頁的記錄數:"+info.getPageSize());
            System.out.println("總頁碼:"+info.getPages());
            System.out.println("是否第一頁:"+info.isIsFirstPage());
            System.out.println("連續顯示的頁碼:");
            int[] nums = info.getNavigatepageNums();
            for (int i = 0; i < nums.length; i++) {
                System.out.println(nums[i]);
            }
        } finally {
            sqlSession.close();
        }
    }

    @Test
    public void testEnumUse() {
        EmpStatus login = EmpStatus.LOGIN;
        System.out.println("枚舉的索引:"+login.ordinal());
        System.out.println("枚舉的名字:"+login.name());
    }

    /**
     * 默認 mybatis 在處理枚舉對象的時候保存的是枚舉的名字: EnumTypeHandler
     * 改變使用:EnumOrdinalTypeHandler
     * @throws IOException
     */
    @Test
    public void testEnum() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession();

        try {
            EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
            Employee employee = new Employee("test_enum", "enum@qq.com", "1");
            mapper.addEmps(employee);
            System.out.println("保存成功:"+employee.getId());
            sqlSession.commit();
        } finally {
            sqlSession.close();
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM