zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Java内存模型
    Thread.sleep(0)的作用
    Java中用到的线程调度算法是什么
    怎么检测一个线程是否持有对象监视器
    为什么要使用线程池
    ThreadLocal
    生产者消费者模型的作用
    线程间通信
    线程安全
    c#常日期转换(转)
  • 原文地址:https://www.cnblogs.com/LiuOOP/p/11239308.html
Copyright © 2011-2022 走看看