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 }
-------------------------------------------
新人只求记录学习生活!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!