目录
1.分页查询
1.1 引入pageHeler依赖
<!--引入pageHeler-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
1.2. 在mybatis.xml 文件中设置拦截器
<!--设置pageHelper拦截器-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>
注意:代码的上下顺序
1.3 运行
PageHeler原理:
2.mybatis的代码生成器 ——generator
作用: 根据表生成实体类,和dao和xml映射文件。简单的CRUD。
官方文档:
MyBatis Generator Core – Introduction to MyBatis Generator
2.1 引入generator 依赖
<!--引入mybatis generator-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.4.0</version>
</dependency>
2.2 创建并配置 generator.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="E:\repMaven\mysql\mysql-connector-java\8.0.28\mysql-connector-java-8.0.28.jar" />
<context id="DB2Tables" targetRuntime="MyBatis3">
<!--抑制注释 suppressAllComments:抑制全部注释-->
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据源(库)的配置信息-->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai"
userId="root"
password="1234">
</jdbcConnection>
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--java实体类的配置-->
<javaModelGenerator targetPackage="com.zsy.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.zsy.dao" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true" />
</javaClientGenerator>
<!--数据库表和实体的映射关系
schema:数据库名称
tableName: 表名
domainObjectName:实体类名
enableCountByExample:是否生成复杂的添加操作
enableUpdateByExample:是否生成复杂的修改操作
enableSelectByExample:是否生成复杂的查询操作
enableDeleteByExample:是否生成复杂的删除操作
-->
<table schema="mydb" tableName="t_student" domainObjectName="Student"
enableCountByExample="false" enableUpdateByExample="false" enableSelectByExample="false" enableDeleteByExample="false">
</table>
</context>
</generatorConfiguration>
2.3 运行
package com.zsy.test;
import org.junit.Test;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
/**
* @author : zhou
* @date : 18:41 2022/6/6
*/
public class Test01 {
@Test
public void test02() throws Exception{
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);
}
}
注意:
使用 mybatis - generator快速生成时,其生成的映射文件的节点可能会重复生成
解决:
在 generator.xml 文件下的 jdbcConnection 加上
<property name="nullCatalogMeansCurrent" value="true" />
3. 缓存
缓存是存在于内存中的临时数据。 使用缓存减少和数据库的交互次数,提高执行效率。
适合放入缓存:
经常查询并且不经常改变的;数据的正确与否对最终结果影响不大的;
不适合放入缓存:
经常改变的数据;数据的正确与否对最终结果影响很大的;---数据安全性要求不高。例如:商品的库存,银行的汇率,股市的牌价;
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.1一级缓存
//一级缓存 必须查询同一个数据
//基于sqlSession完成的一级缓存
@Test
public void test01() throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();
StudentMapper sm = session.getMapper(StudentMapper.class);
//第一次查询编号=1的用户信息时--缓存中不存在 1 的用户,则向数据库查询-发送sql语句并把查询的结果放入缓存中。
Student s1 = sm.selectByPrimaryKey(1);
System.out.println(s1);
Student s2 = sm.selectByPrimaryKey(1);
System.out.println(s2);
运行结果:
第一次查询编号 1 的用户时,若缓存中不存在,则向数据库发送sql语句,并把结果存入缓存中
如果 关闭 SqlSession 会清空缓存,再次查询 1 的用户会再向数据库发生sql语句
3.2 二级查询
开启二级查询
在mybatis.xml 中配置
<settings>
<!--开启二级缓存-->
<setting name="cacheEnabled" value="true"/>
</settings>
配置映射文件
实体类实现序列化接口
测试
//二级查询
@Test
public void test02() throws Exception{
Reader reader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);
SqlSession session = factory.openSession();
StudentMapper sm = session.getMapper(StudentMapper.class);
//第一次查询编号=1的用户信息时--缓存中不存在 1 的用户,则向数据库查询-发送sql语句并把查询的结果放入缓存中。
//查询的结果放入一级缓存和二级缓存。 若二级缓存能命中 关闭一级查询 再次查询 1 的用户,不会再向数据库发生sql语句
Student s1 = sm.selectByPrimaryKey(1);
System.out.println(s1);
session.close();
SqlSession session1 = factory.openSession();
StudentMapper sm1 = session1.getMapper(StudentMapper.class);
Student s2 = sm1.selectByPrimaryKey(1);
System.out.println(s2);
}
查询顺序: 二级缓存----一级缓存----数据库。
映射语句文件中的所有 select 语句将会被缓存。
映射语句文件中的所有 insert,update 和 delete 语句会刷新缓存。
缓存会使用 Least Recently Used(LRU,j较少使用的)算法来收回。
根据时间表(比如 no Flush Interval,没有刷新间隔),缓存不会以任何时间顺序来刷新。
缓存会存储列表集合或对象(无论查询方法返回什么)的 1024 个引用。
缓存会被视为是 read/write(可读/可写)的缓存,意味着对象检索不是共享的,而且可以安
全地被调用者修改,而不干扰其他调用者或线程所做的潜在修改