一、分页插件PageHelper

在我们日常使用中,缺少不了分页查询,就好比你百度时,那么多的数据,肯定需要分页来处理。那么我们就可以用分页插件来帮我们快速实现分页查询操作

首先了解一下分页查询的sql语句:

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

其中的page代表你想要查询的页码数,pageSize代表你想要每页显示的数据个数。

那么我们该如何使用分页插件呢?具体步骤如下:

(1)在pom.xml中引入pageHelper的依赖jar包

<!-- 引入pageHelper的jar包 -->
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.3.0</version>
</dependency>

(2) 在mybatis.xml中设置pageHelper的拦截器(写在configuration标签内)

    <plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin></plugins>

注意:这里有一个需要注意的地方,我们的拦截器写的位置是有要求的。在<configuration>标签下的内容,有固定的顺序。如下图所示,常用的几个的顺序应该是<plugins>在前,然后是<enviroments>,最后是<mappers>。顺序如果不对会报错。

(3)使用pageHelper

我们可以在测试里使用,未来就相当于在servlet层中使用。我们分页查询出来的内容记得要封装到pageInfo类中,因为pageInfo类中有get方法,可以调用出我们想要的数据。

注意:要在执行查询的方法之前写PageHelper。

    @Testpublic void testSelect() throws Exception{Reader reader = Resources.getResourceAsReader("mybatis.xml");SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);SqlSession session = factory.openSession();UserMapper sessionMapper = session.getMapper(UserMapper.class);PageHelper.startPage(1,3);List<User> users = sessionMapper.selectAll();//封装到PageInfo类中PageInfo<User> userPageInfo = new PageInfo<User>(users);//getTotal():获取表中数据的总个数//getPages():获取总页数//getPageSize():获取当前页查询到的数据的个数//getList():获取当前页码对应的数据long total = userPageInfo.getTotal();System.out.println("表中一共有"+total+"条数据");System.out.println(users);session.commit();session.close();}

分页拦截器原理:

在我们使用了pageHelper以后,他会在我们执行查询数据库的方法之前,先在sql语句中拼接上我们limit分页关键字以及后面跟的数据,然后再执行查询。

二、Generator----mybatis代码生成器

作用:generator可以帮我们快速生成实体类,dao和xml映射文件,帮我们实现简单的增删改查功能。

这是官网,上面有具体的介绍和使用方法等。MyBatis Generator Core – Introduction to MyBatis Generatorhttp://mybatis.org/generator        这里讲一下java中如何使用。

(1)引入mybatis-generator的jar包

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

(2)generator的配置文件。

注意:这个配置文件必须写在工程目录下。

代码如下:直接复制即可。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><!-- mysql驱动jar的位置 --><classPathEntry location="G:\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><!-- 数据源的配置信息:driverClass,url,user,password的配置 --><jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/mybatis?serverTimezone=Asia/Shanghai"userId="root"password="lrs998563"></jdbcConnection><!-- 解决mybatis逆向工程生成xml时重复生成多次数据库表配置的问题 --><javaTypeResolver><property name="forceBigDecimals" value="false"/></javaTypeResolver><!-- java实体类的配置targetPackage:目标包,设置你的实体类放在哪个包下targetProject:目标工程,设置你包的目录    --><javaModelGenerator targetPackage="com.lrs.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.lrs.dao" targetProject=".\src\main\java"><property name="enableSubPackages" value="true"/></javaClientGenerator><!--数据库表和实体的映射关系schema:数据库名tableName:表名domainObjectName:实体类名enableCountByExample:是否生成复杂添加方法--><table schema="mybatis" tableName="tbl_user" domainObjectName="User"enableCountByExample="false"enableDeleteByExample="false"enableSelectByExample="false"enableUpdateByExample="false"></table></context>
</generatorConfiguration>

需要修改的地方见代码中的注释。其中包含了一个解决mybatis逆向工程生成xml时重复生成多次数据库表配置的问题。再生成后可能会出现这种问题,原因是如果你不是标准的数据库表命名格式,就有可能出现数据库中的所有同名表被多次生成的情况。

(3) 运行配置文件

可以在我们的测试中运行配置文件。直接复制粘贴代码即可。

List<String> warnings = new ArrayList<String>();boolean overwrite = true;File configFile = new File("generator.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);

注意:new File( )中的xml文件名是你配置文件的文件名,不要忘记修改成自己的。

运行以后就生成好了dao,实体类和mapper映射文件。里面包含了一些基础的增删改查方法。(没有查询所有)。没有的方法可以像以前一样自己写。

三、mybatis的缓存

什么是缓存?

缓存就是存在与内存中的临时数据。mysql数据库中的数据存在表中,表中的数据存在我们电脑的磁盘里,所以我们就算关掉数据库,关掉电脑,我们数据库中的数据也会存在。

缓存的好处

使用缓存可以减少和数据库之间的交互次数,提高代码的执行效率。可以理解为我们电脑的内存,固态,机械硬盘,缓存可以相当于内存,那么效率孰高孰低一目了然。

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

缓存中适合放入的数据:

(1)经常查询,且不回经常改变的数据。

(2)数据的正确与否对最终影响结果不大的。

缓存中不适合放入的数据:

(1)经常改变的数据

(2)数据的正确与否对最终结果影响很大的。即对数据安全性要求很高。

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

mybatis中的缓存

mybatis支持两种缓存

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

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

一级缓存的演示:

@Testpublic void testSelect() throws Exception{Reader reader = Resources.getResourceAsReader("mybatis.xml");SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);SqlSession session = factory.openSession();UserMapper sessionMapper = session.getMapper(UserMapper.class);PageHelper.startPage(1,3);List<User> users = sessionMapper.selectAll();System.out.println(users);List<User> users1 = sessionMapper.selectAll();System.out.println(users1);}

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

可以看到sql语句被执行了两遍,相当于第二次查询并没有在缓存中执行。

二级缓存的演示:

二级缓存默认是关闭的,需要我们手动开启。

(1)开启二级缓存。

在mybatis.xml中加入如下代码,注意放入的位置。在分页插件中我们就讲过里面的顺序问题,settings应该放在plugins的前面。

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

(2)在映射文件中的mapper下使用二级缓存。只需加入一句:<cache>

加入这个代码后,映射文件里的所有查询都使用了二级缓存。

(3)实体类中实现序列化接口

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

(4)测试二级缓存

@Testpublic void testSlectById() 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(2);System.out.println(user);session.close();SqlSession session1 = factory.openSession();UserMapper mapper1 = session1.getMapper(UserMapper.class);User user1 = mapper1.selectByPrimaryKey(2);System.out.println(user1);}

为了区别一级缓存,我们先在执行完一遍查询以后,先关闭一级缓存,然后新建SqlSession在执行同样的查询。可以看到,数据库查询只执行了一次。

mybatis查询的顺序:

二级缓存→一级缓存→数据库。

如果二级缓存没有命中,就去一级缓存中查询,一级缓存中也没有命中,就在数据库中查询。

四、mybatis第四节相关推荐

  1. (王道408考研操作系统)第四章文件管理-第一节7:文件共享

    文章目录 一:基于索引结点的共享方式(硬链接) (1)介绍 (2)Linux演示 二:基于符号链的共享方式(软链接) (1)介绍 (2)Linux演示 所谓文件共享就是指 使多个用户(进程)共享同一个 ...

  2. 第四章第四节数据资产盘点-数据资产梳理

    第四章第四节数据资产盘点-数据资产梳理 在完成业务价值链.数据场景梳理后,盘点业务流程环节中产生的重要数据 ,仍以贷款为例,如图所示: 比如在授信业务节点会产生客户信息和授信合同信息等数据快,这个业务 ...

  3. 第四章第十节数据资产盘点-形成数据资产目录

    第四章第十节数据资产盘点-形成数据资产目录 在形成数据资产目录分类以后,需进一步拆解主要业务活动,识别业务活动涉及的业务对象对应的属性分类以及属性信息.形成分类统一.层级稳定.名称规范.分布明确的数据 ...

  4. 第四章第六节数据资产盘点-系统现状调研情况

    第四章第六节数据资产盘点-系统现状调研情况 在进行系统数据资产盘点之前,首先需要了解企业内部采集.生产沉淀下来的有哪些数据,筛选数据产生的源头系统,制定数据资源的采集模板,针对关键源头系统的数据字典进 ...

  5. 第四章第十一节数据资产盘点-设计数据资产标签

    第四章第十一节数据资产盘点-设计数据资产标签 在形成数据资产目录以后,开始设计数据资产标签体系,例如对于一个字段"客户名称"来说,需要给这个客户名称打上一个标签,比安全等级是几级? ...

  6. 第四章 第七节:神奇的参数

    Python基础入门(全套保姆级教程) 第四章 第七节:神奇的参数 带有装饰器的函数的参数问题:*,** args,kwages, 了解详细情况看代码看结论. def guanjia(game):# ...

  7. ❤️导图整理数组6:四数组的四数之和,详解Counter类实现哈希表计数,力扣454❤️

    此专栏文章是对力扣上算法题目各种方法的总结和归纳, 整理出最重要的思路和知识重点并以思维导图形式呈现, 当然也会加上我对导图的详解. 目的是为了更方便快捷的记忆和回忆算法重点(不用每次都重复看题解), ...

  8. 陈宝林《最优化理论与算法》超详细学习笔记 (四)————第四章 对偶理论

    陈宝林<最优化理论与算法>超详细学习笔记 (四)----第四章 对偶理论 1. 对偶问题的提出 2. 线性规划的对偶理论 2.1 原问题与对偶问题的关系 2.2 对偶问题的基本性质 3. ...

  9. 实现光晕效果_马自达6车灯升级激光四透镜实现四近四远光

    汽车前照明大灯升级案例 车型:马自达6 灯泡色温:5600K 透镜案例:米石激光 TMF激光 原车灯泡型号:H1 H1 雾灯:H3 原车瓦数:80-100W 升级方式:支架 安装方式:有 密封胶性质: ...

  10. JavaScript学习 第四课(四)

    JavaScript学习 第四课(四) 学习内容 一.JavaScript的构成 二.浏览器对象模型(Browser Object Model) 三.window对象包含的方法 四.window对象的 ...

最新文章

  1. RDKit | 基于化合物结构式图像估算分子式(OpenCV、CNN)
  2. 树状数组(Binary Indexed Tree) 总结
  3. latex二元关系符号
  4. linux设备驱动学习(二)——字符设备编写及测试
  5. Druid-目前最好的连接池
  6. 尺度不变性是指什么不变_不变性如何提供帮助
  7. intellij idea 如何将普通项目转换为maven项目
  8. 万恶之源 - Python基础数据类型一
  9. 如何用adb连接android手机
  10. 程序员必会10种算法
  11. 3K热敏电阻测温程序
  12. P3376 dinic
  13. BZOJ 3689 异或之
  14. python获取四六级成绩单
  15. 意外的计算机音乐,富有灵魂的音乐 Realwav SVEN 意外发烧
  16. 数据库综合案例(商店买商品)
  17. 打包C#软件两种典型出错的解决方法,以及如何快速定位你的问题出在哪里
  18. linux服务器运维实战记录,linux运维好书推荐《高性能Linux服务器运维实战》
  19. Java实现简单的UDP编程
  20. 计算机控制系统的数学模型是用,计算机控制与仿真-第2章控制系统的数学模型.ppt...

热门文章

  1. wine东方财富分时成交量不显示问题解决
  2. Django Model各种操作 Meta 常用字段 一对多操作 多对对操作 F Q查询 聚合函数
  3. Python学习之生成滚动广告屏
  4. 【微信小程序控制硬件16 】 安信可 ESP32-S 开发板实现移植腾讯物联开发平台蓝牙 llsync 协议,实现一键蓝牙快速配网+远程控制。(附带源码)
  5. oracle 常见游标,Oracle常见游标使用
  6. 硬件视频会议设备在与云视频会议对接时,如何提高利用率
  7. 大学生参加计算机培训有用吗?想转行学计算机技术
  8. linux通过钩子阻断端口,用钩子钩住你的中断处理函数
  9. div、p标签超出换行
  10. sketch最强切图工具Sketch Measure(含最详细的讲解)