欢迎来到刘认真的博客

It's not me that's wrong. It's the whole world

mybatis PageHelper分页插件 和 LRU算法缓存读取数据

分页:

PageHelper的优点是,分页和Mapper.xml完全解耦。实现方式是以插件的形式,对Mybatis执行的流程进行了强化,添加了总数count和limit查询。属于物理分页。

一、首先注入依赖:

1  <dependency>
2       <groupId>com.github.pagehelper</groupId>
3       <artifactId>pagehelper</artifactId>
4       <version>4.2.1</version>
5     </dependency>

二、配置xml引入插件:

1 <!--插件 分页-->
2     <!--<plugins>-->
3     <!--<plugin interceptor=""></plugin>-->
4     <!--</plugins>-->
5     <plugins>
6         <plugin interceptor="com.github.pagehelper.PageHelper">
7             <property name="dialect" value="mysql"></property>
8         </plugin>
9     </plugins>

三、查询时调用:指定页码(pageNum)和每页的大小(pageSize)分页,pageNum - 第N页, pageSize - 每页M条数

  PageHelper.startPage([pageNum],[pageSize]);

      List<?> pagelist = queryForList( xxx.class, "queryAll" , param);

        PageHelper.startPage(2,2);

四、显示某些值:

PageHelper的其他API

    String orderBy = PageHelper.getOrderBy();    //获取orderBy语句

    Page<?> page = PageHelper.startPage(Object params);

    Page<?> page = PageHelper.startPage(int pageNum, int pageSize);

    Page<?> page = PageHelper.startPage(int pageNum, int pageSize, boolean isCount);

    Page<?> page = PageHelper.startPage(pageNum, pageSize, orderBy);

    Page<?> page = PageHelper.startPage(pageNum, pageSize, isCount, isReasonable);    //isReasonable分页合理化,null时用默认配置

    Page<?> page = PageHelper.startPage(pageNum, pageSize, isCount, isReasonable, isPageSizeZero);    //isPageSizeZero是否支持PageSize为0,true且pageSize=0时返回全部结果,false时分页,null时用默认配置

1  PageInfo pageInfo=new PageInfo(search);
2         System.out.println("总条数:"+pageInfo.getTotal());
3         System.out.println("总页数:"+pageInfo.getPages());
4         System.out.println("当前页数:"+pageInfo.getPageNum());
5         System.out.println("显示的条数:"+pageInfo.getPageSize());
6         System.out.println("最后一条是第:"+pageInfo.getEndRow());
7         System.out.println("toString:"+pageInfo.getList());

 

LRU算法缓存:

把数据预先加载到内存中,当真正需要数据的时候,访问速度就会加快

加快程序运行的速度

1) 一级缓存
session SqlSession 级别缓存, 默认开启,

2) 二级缓存
SqlSessionFactory 级别缓存, 可以跨session存在, 配置
对象要实现 implements Serializable ,序列化接口

一级缓存和二级缓存区别 ?
二级缓存 范围广,存在时间久
二级缓存,不建议使用, 不会变的数据,量可控, 配置相关数据,菜单

缓存策略:
如果数据量大于缓存的大小时候,如果处理?

FIFO: 先进先出
LRU: 最近最常使用

1    <!--配置算法缓存-->
2     <cache
3             eviction="LRU"
4             flushInterval="60000"
5             size="1024"
6             readOnly="true"
7     />

 

1 <settings>
2         <setting name="cacheEnabled" value="true"/>
3     </settings>

 

 

 

源码:

HouseDAO.xml:
 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 3 <mapper namespace="com.etc.dao.HouseDAO">
 4 
 5     <!--配置算法缓存-->
 6     <cache
 7             eviction="LRU"
 8             flushInterval="60000"
 9             size="1024"
10             readOnly="true"
11     />
12 
13     <!--查询单个条件 相当于switch=choose  when=case otherwise=default-->
14     <select id="searchSim" resultType="house">
15         select * from t_house
16         <where>
17             <choose>
18                 <when test="title!=null">
19                     title like '%${title}%'
20                 </when>
21                 <when test="price!=null">
22                     price=#{price}
23                 </when>
24                 <otherwise>
25                     1=1
26                 </otherwise>
27             </choose>
28         </where>
29     </select>
30     <!--查询多个条件 if 如果存在就拼接
31     select * from t_house where title like '%?%' and price=?
32     -->
33     <select id="searchOdd" resultType="house">
34         select * from t_house
35         <where>
36             <if test="title!=null">
37                 title like '%${title}%'
38             </if>
39             <if test="price!=null">
40                 and price=#{price}
41             </if>
42         </where>
43     </select>
44     <!--查询in collection集合名 item:参数名 open close=() separator用逗号拼接
45                 select * from t_house where id in (1,2,3)
46     -->
47     <select id="searchByIds" resultType="house">
48         select * from t_house where id in
49         <foreach collection="ids" item="id" open="(" close=")" separator=",">
50             #{id}
51         </foreach>
52     </select>
53     <!--更新(只更新存在的值)-->
54     <update id="update">
55         update t_house
56         <set>
57             <if test="title!=null">
58                 title=#{title},
59             </if>
60             <if test="price!=null">
61                 price=#{price}
62             </if>
63         </set>
64         where id =#{id}
65     </update>
66 
67 </mapper>

 

mybatis-config.xml:

 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration PUBLIC
 3         "-//mybatis.org//DTD Config 3.0//EN"
 4         "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <configuration>
 6 
 7     <settings>
 8         <setting name="cacheEnabled" value="true"/>
 9     </settings>
10 
11     <!-- 别名 -->
12     <typeAliases>
13         <package name="com.etc.entity"></package>
14     </typeAliases>
15 
16     <!--插件 分页-->
17     <!--<plugins>-->
18     <!--<plugin interceptor=""></plugin>-->
19     <!--</plugins>-->
20     <plugins>
21         <plugin interceptor="com.github.pagehelper.PageHelper">
22             <property name="dialect" value="mysql"></property>
23         </plugin>
24     </plugins>
25 
26     <!-- 配置环境变量 -->
27     <!-- 开发 测试  预生产 生产 -->
28     <environments default="development">
29         <environment id="development">
30             <transactionManager type="JDBC"/>
31             <dataSource type="POOLED">
32                 <property name="driver" value="com.mysql.jdbc.Driver"/>
33                 <property name="url"
34                           value="jdbc:mysql://127.0.0.1:3310/mybatis"/>
35                 <property name="username" value="root"/>
36                 <property name="password" value="123456"/>
37             </dataSource>
38         </environment>
39     </environments>
40 
41 
42     <!-- 配置mappers -->
43     <mappers>
44         <mapper resource="HouseDAO.xml"></mapper>
45     </mappers>
46 
47 </configuration>

 

HouseTest:
 1 package com.etc.dao;
 2 
 3 import com.etc.entity.House;
 4 import com.github.pagehelper.PageHelper;
 5 import com.github.pagehelper.PageInfo;
 6 import org.apache.ibatis.io.Resources;
 7 import org.apache.ibatis.session.SqlSession;
 8 import org.apache.ibatis.session.SqlSessionFactory;
 9 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
10 import org.junit.Test;
11 
12 import java.io.IOException;
13 import java.io.InputStream;
14 import java.util.List;
15 
16 public class HouseTest {
17 
18     @Test
19     public void test() throws IOException {
20         //加载配置文件 会话工厂
21         InputStream inputStream= Resources.getResourceAsStream("mybatis-config.xml");
22         SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
23 
24         //会话   ==相当于数据库连接
25         SqlSession session=sqlSessionFactory.openSession();
26 
27         HouseDAO houseDAO=session.getMapper(HouseDAO.class);
28 
29         House house=new House();
30 //        house.setTitle("he");
31 //        house.setPrice(1300.0);
32 //        house.setId(1);
33 
34 //        List<House> search=houseDAO.searchSim(house);
35 
36         //分页插件使用
37         PageHelper.startPage(2,2);
38         List<House> search=houseDAO.searchOdd(house);
39 //        List<House> search=houseDAO.searchByIds(Arrays.asList(1,2,3));
40 //        houseDAO.update(house);
41         for (House h:search)
42             System.out.println(h);
43 
44         //实例化这个才能使用下边的条件查询
45         PageInfo pageInfo=new PageInfo(search);
46         System.out.println("总条数:"+pageInfo.getTotal());
47         System.out.println("总页数:"+pageInfo.getPages());
48         System.out.println("当前页数:"+pageInfo.getPageNum());
49         System.out.println("显示的条数:"+pageInfo.getPageSize());
50         System.out.println("最后一条是第:"+pageInfo.getEndRow());
51         System.out.println("toString:"+pageInfo.getList());
52 
53         session.commit();
54         session.close();
55 
56 
57 //        System.out.println("第二次查询");
58 //
59 //        SqlSession session2=sqlSessionFactory.openSession();
60 //
61 //        HouseDAO houseDAO2=session2.getMapper(HouseDAO.class);
62 //
63 //        List<House> search2=houseDAO2.searchOdd(house);
64 //        for (House h:search2)
65 //            System.out.println(h);
66 //
67 //        session2.commit();
68 //        session2.close();
69 
70     }
71 }

 

posted @ 2019-07-24 17:05  刘认真  阅读(887)  评论(0编辑  收藏  举报