【校招VIP】mybatis

4小时前 收藏 0 评论 0 java开发

【校招VIP】mybatis

转载声明:文章来源https://blog.csdn.net/lrs998563/article/details/125152453

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

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

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。

@Test
public 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映射文件,帮我们实现简单的增删改查功能。
这里讲一下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 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="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共享数据。默认它是关闭。需要手动开启。

一级缓存的演示:

@Test
public 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)测试二级缓存

@Test
public 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查询的顺序:
二级缓存→一级缓存→数据库。
如果二级缓存没有命中,就去一级缓存中查询,一级缓存中也没有命中,就在数据库中查询。

C 0条回复 评论

帖子还没人回复快来抢沙发