1.分页插件PageHelper

作用: 帮你完成分页的功能

思考: 分页的sql语句。

select * from 表名 [where 条件] limit (page-1)*pageSize, pageSize;

page: 当前页码
pageSize: 每页显示的条数。

如何使用:

(1)pom.xml引入pageHelper的jar包

 <!--引入pageHelper-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.11</version>
        </dependency>

(2)mybatis.xml中设置pageHelper的拦截器

<!-- 
    plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
    properties?, settings?, 
    typeAliases?, typeHandlers?, 
    objectFactory?,objectWrapperFactory?, 
    plugins?, 
    environments?, databaseIdProvider?, mappers?
-->  
  <plugins>
        <!-- com.github.pagehelper为PageHelper类所在包名 -->
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
            <property name="param1" value="value1"/>
        </plugin>
    </plugins>

 (3)使用pageHelper

@Test
    public void test01() throws  Exception{
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();
        UserMapper mapper = session.getMapper(UserMapper.class);
        //设置分页属性pageNum:显示第几页  PageSize:每页显示的条数

        PageHelper.startPage(1,5);
        List<User> list = mapper.selectAll();
        //把查询的结果封装到PageInfo类中。  //PageInfo包含了非常全面的分页属性
        PageInfo<User> pageInfo = new PageInfo<>(list);
        System.out.println("总条数:"+pageInfo.getPages());

    }

Mybatis分页插件PageHelper - 简书在实际的项目开发中,常常需要使用到分页,分页方式分为两种:前端分页和后端分页。 前端分页一次ajax请求数据的所有记录,然后在前端缓存并且计算count和分页逻辑,一般前端组...https://www.jianshu.com/p/50fcd7f127f0

PageInfo这个类里面的属性: 

pageNum当前页
pageSize每页的数量
size当前页的数量
orderBy排序
startRow当前页面第一个元素在数据库中的行号
endRow当前页面最后一个元素在数据库中的行号
total总记录数(在这里也就是查询到的用户总数)
pages总页数 (这个页数也很好算,每页5条,总共有11条,需要3页才可以显示完)
list结果集
prePage前一页
nextPage下一页
isFirstPage是否为第一页
isLastPage是否为最后一页
hasPreviousPage是否有前一页
hasNextPage是否有下一页
navigatePages导航页码数
navigatepageNums所有导航页号
navigateFirstPage导航第一页
navigateLastPage导航最后一页
firstPage第一页
lastPage最后一页

原理:

2.mybatis的代码生成器(逆向工程)---generator

作用: 根据表帮你生成实体类,和dao和xml映射文件。就是简单的CRUD。

如何使用:

MyBatis Generator Core – Introduction to MyBatis Generatorhttp://mybatis.org/generator

(1)pom.xml引入mybatis-generator的依赖jar包。(mybatis-generator-core-x.x.x.jar )

       <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-core</artifactId>
            <version>1.4.0</version>
        </dependency>

(2)generatorConfig.xml的配置文件(必须创建在pom.xml同级别的目录下)

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>

    <!--找到mysql驱动jar的位置-->
    <classPathEntry location="D:\repMaven\mysql\mysql-connector-java\8.0.29\mysql-connector-java-8.0.29.jar" />
    <context id="DB2Tables" targetRuntime="MyBatis3">
        <commentGenerator>
            <!--抑制注释-->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!--数据源的配置信息-->
        <jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
                        connectionURL="jdbc:mysql://localhost:3306/myaa?serverTimezone=Asia/Shanghai"
                        userId="root"
                        password="123456">
            <!--解决mysql8.0以后重复生成所有表的问题-->
            <property name="nullCatalogMeansCurrent" value="true" />
        </jdbcConnection>

        <javaTypeResolver >
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
        <!--java实体类的配置-->
        <javaModelGenerator targetPackage="com.wzh.entity" targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!--映射文件的配置-->
        <sqlMapGenerator targetPackage="mapper"  targetProject=".\src\main\resources">
            <property name="enableSubPackages" value="true" />
        </sqlMapGenerator>
        <!--dao数据访问层的配置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.wzh.dao"  targetProject=".\src\main\java">
            <property name="enableSubPackages" value="true" />
        </javaClientGenerator>
        <!--数据库表和实体的映射关系
              schema:数据库名称
              tableName: 表名
              domainObjectName:实体类名

              enableUpdateByExample:是否生成复杂的修改操作
        -->
        <table schema="myaa" tableName="t_user" domainObjectName="User" enableCountByExample="false"
        enableDeleteByExample="false" enableUpdateByExample="false" enableSelectByExample="false">

        </table>

    </context>
</generatorConfiguration>

(3)运行配置文件

@Test
    public void test() throws Exception{
        List<String> warnings = new ArrayList<String>();
        boolean overwrite = true;
        File configFile = new File("generatorConfig.xml");
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
    }

如何去除英文注释:                     在generatorConfig.xml里添加

<commentGenerator>
  <property name="suppressAllComments" value="true" />
</commentGenerator>

解决mybatis逆向工程生成xml时重复生成多次数据库表配置的问题 

(3条消息) 解决mybatis逆向工程生成xml时重复生成多次数据库表配置的问题_1橘猫的博客-CSDN博客https://blog.csdn.net/konley233/article/details/109453156

3.mybatis的缓存---了解

3.1 什么是缓存

缓存是存在于内存中的临时数据。

mysql数据库中的数据存在----表--->磁盘上。 查询---程序IO读取磁盘的数据---添加--io向磁盘添加数据。 

3.2.缓存的好处

使用缓存减少和数据库的交互次数,提高执行效率。

如果是第一次执行查询该数据,那么会先查询数据库,并把查询的结果放到缓存中,以后可以直接从缓存中获取数据,从而减少对数据库的访问频率。之后再查询的时候,程序会先看缓存中是否有目标数据,如果有直接在缓存中获取结果,如果没有那么还会在数据库中查询 

3.3 什么样的数据适合放入缓存

经常查询并且不经常改变的;

数据的正确与否对最终结果影响不大的;

3.4 什么样的数据不适合放入缓存

经常改变的数据;

数据的正确与否对最终结果影响很大的;---数据安全性要求不高。

例如:商品的库存,银行的汇率,股市的牌价;

3.5 mybatis也支持缓存

正如大多数持久层框架一样,MyBatis 同样提供了一级缓存二级缓存的支持

1. 一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当
Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空。
2. 二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在
于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。
3. 对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存 Namespaces)的进行
了 C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。

mybatis支持两种缓存

(1)一级缓存----基于SqlSession级别的缓存。默认一级缓存是开启的,不能关闭。

(2)二级缓存--基于SqlSessionFactory级别的缓存,它可以做到多个SqlSession共享数据。默认它是关闭。需要手动开启。

3.5.1 演示一级缓存

如果第一次查询,缓存不能命中,则向数据库查询,即发送sql语句,把查询结果放入一级缓存中,再次查询该语句的时候,先在缓存中查询,如果没有再去数据库查询

 一级缓存默认就会被使用,

1.必须是同一个 Session,如果 session 对象已经 close()过了就不可能用了

2. 查询条件是一样的

3. 没有执行过 session.clearCache()清理缓存

4. 没有执行过增删改的操作(这些操作都会清理缓存)

//一级缓存---必须查询同一个数据
    @Test
    public void test02() throws  Exception{
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();
        //第一次查询编号=1的用户信息--缓存不能命中,则向数据库查询-发送sql语句、把查询的结果放入缓存中。
        //底层就是一个hashmap---(1,user)
        UserMapper mapper = session.getMapper(UserMapper.class);
        User user = mapper.selectByPrimaryKey(1);
        System.out.println(user);

        User user1 = mapper.selectByPrimaryKey(1);
        System.out.println(user1);
    }
    //一级缓存---基于sqlSession完成的一级缓存
    @Test
    public void test03() throws  Exception{
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
        SqlSession session = factory.openSession();

        UserMapper mapper = session.getMapper(UserMapper.class);
        User user = mapper.selectByPrimaryKey(1);
        System.out.println(user);
        session.close();
        //开启新的SqlSession
        SqlSession session1 = factory.openSession();
        UserMapper mapper1 = session1.getMapper(UserMapper.class);
        User user1 = mapper1.selectByPrimaryKey(1);
        System.out.println(user1);
    }

 当我们查询同一个数据时,sql语句只执行了一次,第二次查询的时候就没有再去数据库中执行查询了。如果缓存中没有这个数据,那么它就会在数据库中执行查询,然后把查询的结果存到缓存中。

3.5.2 演示二级缓存

如果第一次查询,缓存不能命中,则向数据库查询,即发送sql语句,把查询结果同时放入一级缓存和二级缓存中,再次查询该语句的时候,先在二级缓存中查询,如果没有,再去一级缓存中查询,还是没有的话,再去数据库查询

(1)mybatis.xml中开启二级缓存


    plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
    properties?, settings?, 
    typeAliases?, typeHandlers?, 
    objectFactory?,objectWrapperFactory?, 
    plugins?, 
    environments?, databaseIdProvider?, mappers?
 

  <settings>
        <!--开启二级缓存-->
        <setting name="cacheEnabled" value="true"/>
    </settings>

(2)在映射文件中使用二级缓存

   <!--使用二级缓存 这里面的所有查询都使用了二级缓存-->
  <cache/>

 (3)实体类一定要实现序列化接口

二级缓存实际底层的原理是HashMap,调用缓存就相当于进行IO操作。在java中,对java对象进行IO操作时,需要让类实现序列化,也就是类要有Serializable接口。所以我们的实体类中也要加序列化接口。

 (4)测试二级缓存

 //二级缓存的测试
    @Test
    public void test04() throws Exception{
        Reader resourceAsReader = Resources.getResourceAsReader("mybatis.xml");
        SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(resourceAsReader);
        SqlSession session=factory.openSession();

        UserMapper mapper = session.getMapper(UserMapper.class);
        //第一次查询编号=1的用户信息--缓存不能命中,则向数据库查询-发送sql语句、把查询的结果放入缓存中。
        //底层就是一个hashmap---(1,user);
        //查询的结果放入一级缓存和二级缓存。 如果二级缓存能命中
        User user = mapper.selectByPrimaryKey(1);
        System.out.println(user);
        session.close();
        //开启新的SqlSession
        SqlSession session1=factory.openSession();
        UserMapper mapper1 = session1.getMapper(UserMapper.class);
        User user1 = mapper1.selectByPrimaryKey(1);
        System.out.println(user1);
    }

如果部分select语句不想要二级缓存的话,加入 useCache="false"

查询顺序: 二级缓存---->一级缓存---->数据库。

3.5.3.补充说明

映射语句文件中的所有 select 语句将会被缓存。
映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存。
缓存会使用 Least Recently Used(LRU,最近最少使用的)算法来收回。
根据时间表(比如 no Flush Interval,没有刷新间隔),缓存不会以任何时间顺序来刷新。
缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。
缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安
全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改

<cache
eviction="FIFO" //回收策略为先进先出
flushInterval="60000" //自动刷新时间 60s
size="512" //最多缓存 512 个引用对象
readOnly="true"/> //只读

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐