• Mybatis分页插件PageHelper


      在使用Java Spring开发的时候,Mybatis算是对数据库操作的利器了。不过在处理分页的时候,Mybatis并没有什么特别的方法,一般需要自己去写limit子句实现,成本较高。好在后来出来了个PageHelper分页插件。

    POM依赖

    Mybatis的配置就不多提了。PageHelper的依赖如下。需要其他的版本可以去maven上自行选择

    <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper -->
    <dependency>
        <groupId>com.github.pagehelper</groupId>
        <artifactId>pagehelper</artifactId>
        <version>5.1.7</version>
    </dependency>

    配置文件

    打开Mybatis配置文件,一般在Resource路径下。

    <?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>
    <!-- 全局参数 -->
    <settings>    
      <!-- 使全局的映射器启用或禁用缓存。 -->    
      <setting name="cacheEnabled" value="true"/>    
      <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->    
      <setting name="lazyLoadingEnabled" value="true"/>    
      <!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->    
      <setting name="aggressiveLazyLoading" value="true"/>    
      <!-- 是否允许单条sql 返回多个数据集  (取决于驱动的兼容性) default:true -->    
      <setting name="multipleResultSetsEnabled" value="true"/>    
      <!-- 是否可以使用列的别名 (取决于驱动的兼容性) default:true -->    
      <setting name="useColumnLabel" value="true"/>    
      <!-- 允许JDBC 生成主键。需要驱动器支持。如果设为了true,这个设置将强制使用被生成的主键,有一些驱动器不兼容不过仍然可以执行。  default:false  -->    
      <setting name="useGeneratedKeys" value="true"/>   
      <!-- 指定 MyBatis 如何自动映射 数据基表的列 NONE:不隐射 PARTIAL:部分  FULL:全部  -->    
      <setting name="autoMappingBehavior" value="PARTIAL"/>    
      <!-- 这是默认的执行类型  (SIMPLE: 简单; REUSE: 执行器可能重复使用prepared statements语句;BATCH: 执行器可以重复执行语句和批量更新)  -->    
      <setting name="defaultExecutorType" value="SIMPLE"/>    
      <!-- 使用驼峰命名法转换字段。 -->    
      <setting name="mapUnderscoreToCamelCase" value="true"/>    
      <!-- 设置本地缓存范围 session:就会有数据的共享  statement:语句范围 (这样就不会有数据的共享 ) defalut:session -->    
      <setting name="localCacheScope" value="SESSION"/>    
      <!-- 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER,插入空值时不需要指定类型 -->    
      <setting name="jdbcTypeForNull" value="NULL"/>
    </
    settings><plugins>       <plugin interceptor="com.github.pagehelper.PageHelper">             <property name="dialect" value="mysql"/>            <property name="offsetAsPageNum" value="false"/>            <property name="rowBoundsWithCount" value="false"/>            <property name="pageSizeZero" value="true"/>             <property name="reasonable" value="false"/>             <property name="supportMethodsArguments" value="false"/>            <property name="returnPageInfo" value="none"/>       </plugin> </plugins> </configuration>  

    这里要注意的是PageHelper相关的配置。
    如果你没有加载Mybatis配置文件,那么使用的是Mybatis默认的配置。如何加载Mybatis配置文件呢?
    到你的dataSrouce配置中。
    在配置sqlSessionFactory的时候,指定Mybatis核心配置文件和mapper的路径,代码如下

    @Bean(name = "sqlSessionFactory")
    @Primarypublic SqlSessionFactor sqlSessionFactory(@Qualifier("data") DataSource dataSource) throws Exception {    
      SqlSessionFactoryBean bean = new SqlSessionFactoryBean();    
      bean.setDataSource(dataSource);    
      bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis-mapper/*.xml"));    
      bean.setConfigLocation(new ClassPathResource("mybatis-config.xml"));    
      retsurn bean.getObject();
    } 

    代码演示

    准备一个mapper.xml。

    说明:
    这里配置的mapper.xml存放路径,在Resource/mybatis-mapper文件夹下
    这里配置的mybatis-config.xml文件,在Resource/下
    这里这个查询,是一个典型的多条件查询,我们要做的是对多条件匹配到的记录进行分页。

    <?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.jackpotHan.StudentMapper">
      <resultMap id="students" type="com.jackpotHan.Student">
        <constructor>
          <idArg column="id" javaType="java.lang.Integer" jdbcType="INTEGER" />
          <arg column="name" javaType="java.lang.String" jdbcType="VARCHAR" />
          <arg column="sex" javaType="java.lang.String" jdbcType="VARCHAR" />
          <arg column="grade" javaType="java.lang.String" jdbcType="VARCHAR" />
          <arg column="score" javaType="java.lang.Integer" jdbcType="INTEGER" />
          <arg column="createTime" javaType="java.lang.String" jdbcType="VARCHAR" />
          <arg column="updateTime" javaType="java.lang.String" jdbcType="VARCHAR" />
        </constructor>
      </resultMap>
     
      <sql id="base_column">id, name, type, `group`, geo, createTime, updateTime </sql>
     
      <select id="queryStudents" parameterType="com.jackpotHan.StudentQuery" resultMap="students">
        select <include refid="base_column"/> from geoFence where 1=1
        <if test="sex!= null">
          and sex= #{sex}
        </if>
        <if test="name != null">
          and name like concat('%', #{name},'%')
        </if>
        <if test="grade!= null">
          and `grade` like concat('%', #{grade},'%')
        </if>
        <if test="startTime != null">
          and createTime >= #{startTime}
        </if>
        <if test="endTime != null">
          and createTime <= #{endTime}
        </if>
      </select>
    </mapper>

    在Mapper.java接口中编写对应的方法

    List<Student> queryStudents(StudentQuery query);
    @RequestMapping(value ="/queryStudents", method = RequestMethod.POST)
        @ResponseBody
        public ResponseEntity<Response> queryStudents(@RequestBody StudentQuery query) {
            try {
                Map<String, Object> data = new HashMap<>();
                Integer pageNum = query.getPageNum() != null ? query.getPageNum() : 1;
                Integer pageSize = query.getPageSize() != null ? query.getPageSize() : 10;
                Page page = PageHelper.startPage(pageNum, pageSize, true);
                List<Student> list = studentMapper.queryStudents(query);
                data.put("total", page.getTotal());
                data.put("nowPage", pageNum);
                data.put("data", list);
                return new ResponseEntity<>(
                        new Response(ResultCode.SUCCESS, "查询成功", data), HttpStatus.OK);
            }
            catch(Exception e){
                logger.error("查询失败", e);
                return new ResponseEntity<>(
                new Response(ResultCode.EXCEPTION, "查询失败", null), HttpStatus.INTERNAL_SERVER_ERROR); } }

    说明:
    1、PageHelper的优点是,分页和Mapper.xml完全解耦。实现方式是以插件的形式,对Mybatis执行的流程进行了强化,添加了总数count和limit查询。属于物理分页。
    2、Page page = PageHelper.startPage(pageNum, pageSize, true); - true表示需要统计总数,这样会多进行一次请求select count(0); 省略掉true参数只返回分页数据。

  • 相关阅读:
    Java -- 基于JDK1.8的LinkedList源码分析
    Java -- 基于JDK1.8的ArrayList源码分析
    Android -- AsyncTask源码解析
    Android -- 自定义view实现keep欢迎页倒计时效果
    Android -- 《 最美有物》好看的点赞效果
    Android -- Glide框架详解(一)
    Android -- 从源码解析Handle+Looper+MessageQueue机制
    面试 -- 关于Activity的相关知识
    用最简单的一个例子看maven冲突的解决办法
    【跟我一起读 linux 源码 01】boot
  • 原文地址:https://www.cnblogs.com/JackpotHan/p/9798861.html
Copyright © 2020-2023  润新知