1.Mybatis代码生成器
mybatis代码生成器可以为我们省去基本的增删改查操作,帮我们自动创建dao接口,entity实体类,和mapper映射文件
第一步,在pom.xml文件中添加依赖
<dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.4.0</version> </dependency>
第二步,编写mybatis-generator.xml文件也就是mybatis代码生成器的配置文件
<?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>
<!--添加数据库的连接jar包的位置,在项目的左边最下的external libraries中找到复制全路径-->
<classPathEntry location="E:\repMaven\mysql\mysql-connector-java\8.0.29\mysql-connector-java-8.0.29.jar" />
<!--
targetRuntime :MyBatis3 生成 exmple
MyBatis3Simple 不生成exmple
-->
<context id="DB2Tables" targetRuntime="MyBatis3Simple">
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<commentGenerator>
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/vue01?serverTimezone=Asia/Shanghai"
userId="root"
password="990412">
<!--解决mysql8.0以后重复生成所有表的问题-->
<property name="nullCatalogMeansCurrent" value="true" />
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL(decimal) 和 NUMERIC(numeric) 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver >
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--实体类的配置, targetProject:生成实体类的位置 -->
<javaModelGenerator targetPackage="com.gjx.entity" targetProject=".\src\main\java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!--映射文件mapper的配置-->
<sqlMapGenerator targetPackage="mapper" targetProject=".\src\main\resources">
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!--dao包即接口层的配置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.gjx.dao" targetProject=".\src\main\java">
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!--
数据库表的配置
-->
<table schema="" tableName="tbl_user" domainObjectName="User">
</table>
<table schema="" tableName="t_stu" domainObjectName="Stu">
</table>
<table schema="" tableName="t_teacher" domainObjectName="Teacher">
</table>
</context>
</generatorConfiguration>
第三步,执行mybatis-generator.xml文件
可以在主函数里运行以下代码,也可以在单元测试中运行一下代码,以下代码只需要将xml文件替换成自己的代码生成器的配置文件即可
public class run {
@Test
public void run() throws Exception{
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File("mybatis-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);
}
}
2.分页插件pageHelper
在查询所有时,可以使用pagehelper插件实现分页查询的效果
第一步,在pom.xml文件中引入依赖
<dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.3.0</version> </dependency>
第二步,在mybatis的配置文件中,加入分页拦截器,放在environments标签上方
<plugins> <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin> </plugins>
第三步,使用pageHelper
PageHelper.startPage(pageNum,pageSize)放在查询所有的方法之上才能生效,查询之后的结果list存放到PageInfo对象里,方便我们后期与前端页面的交互。
public class TestStu {
public SqlSession base() throws Exception{
Reader resourceAsReader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resourceAsReader);
SqlSession session = factory.openSession();
return session;
}
public void end(SqlSession session){
session.commit();
session.close();
}
@Test
public void testSelectAll() throws Exception{
SqlSession session = base();
StuMapper stuMapper = session.getMapper(StuMapper.class);
PageHelper.startPage(1,4);
List<Stu> stus = stuMapper.selectAll();
PageInfo<Stu> stuPageInfo = new PageInfo<>(stus);
System.out.println(stuPageInfo);
end(session);
}
}
3.mybatis缓存
mybatis支持两种缓存,一级缓存(基于SqlSession级别的缓存),二级缓存(基于SqlSessionFactory级别的缓存)
(1)一级缓存,默认开启,不能关闭
(2)二级缓存,默认关闭,可以手动开启和关闭
一级缓存:一级缓存,同一个sqlSession请求同一条数据,第一次请求时,从一级缓存中查找,没有命中,则向数据库发送sql语句,从数据库查找,查找到的结果以hashMap的形式存放入一级缓存中,下一次查询同一个结果时,先从一级缓存中查找,如果命中的话就不再向数据库发送sql语句。
public class TestStu {
public SqlSession base() throws Exception{
Reader resourceAsReader = Resources.getResourceAsReader("mybatis.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(resourceAsReader);
SqlSession session = factory.openSession();
return session;
}
public void end(SqlSession session){
session.commit();
session.close();
}
@Test
public void testSelectByPrimaryKey() throws Exception{
SqlSession session = base();
StuMapper stuMapper = session.getMapper(StuMapper.class);
Stu stu = stuMapper.selectByPrimaryKey(1);
System.out.println(stu);
Stu stu1 = stuMapper.selectByPrimaryKey(1);
System.out.println(stu1);
}
}
同一个sqlSession请求同一条数据时的流程
不同sqlSession的一级缓存数据不共享
二级缓存:默认关闭状态,可以手动开启
mybatis配置文件的顺序为
properties,settings,typeAliases,typeHandlers,objectFactory,objectWrapperFactory,
plugins,environments,databaseIdProvider,mappers
(1)在mybatis配置文件中开启二级缓存<settings>
<!--开启二级缓存--> <setting name="cacheEnabled" value="true"/> </settings>
报以下这种错就是因为配置文件中标签顺序不对 ,修改配置文件中的标签顺序即可
(2)在映射文件中使用二级缓存
(3)使用二级缓存,实体类要实现序列化接口
(4)二级缓存的演示
一级缓存和二级缓存的关系:没有关闭会话时,数据可存放在一级缓存中,关闭会话之后,数据才会存放在二级缓存中,
和缓存有关的设置/属性:
1、cacheEnabled=true:false:关闭缓存(二级缓存关闭)(一级缓存一直可用的)
2、每个select标签都有useCache="true": false:不使用二级缓存,一级缓存依然使用
3、每个增删改标签的:flushCache="true":(一级二级都会清除)增删改执行完成后就会清楚缓存;
4、sqlSession.clearCache();只是清除当前session的一级缓存;
5、localCacheScope:本地缓存作用域:(一级缓存SESSION);当前会话的所有数据保存在会话缓存中; STATEMENT:可以禁用一级缓存;
注:新会话进入时会先查询二级缓存,再查询一级缓存,最后查询数据库