MyBatis Generator
MyBatis 的开发团队提供了一个很强大的代码生成器,包含了数据库表对应的POJO 、Mapper 接口、 Mapper XML 文件。这些代码文件中几乎包含了全部的单表操作方法,使用 逆向工程可以极大程度上方便我们使用 MyBatis,还可以减少很多重复操作。那么该如何配置使用呢?
1.在pom.xml中集成MBG插件,开启自动覆盖后,如果已经存在配置文件会被重写。
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<!--开启自动覆盖-->
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
</dependencies>
</plugin>
插件生效后,会在插件栏看到:
2.在resources路径下新建一个generatorConfig.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>
<!-- context:生成一组对象的环境
id:必选,上下文id,用于在生成错误时提示
defaultModelType:指定生成对象的样式
1,conditional:类似hierarchical;
2,flat:所有内容(主键,blob)等全部生成在一个对象中,推荐使用;
3,hierarchical:主键生成一个XXKey对象(key class),Blob等单独生成一个对象,其他 简单属性在一个对象中(record class)
targetRuntime:
1,MyBatis3:默认的值,生成基于MyBatis3.x以上版本的内容,包括XXXBySample;
2,MyBatis3Simple:类似MyBatis3,只是不生成XXXBySample;
-->
<context id="context1" targetRuntime="MyBatis3Simple" defaultModelType="flat">
<!-- 生成的Java文件的编码 -->
<property name="javaFileEncoding" value="UTF-8"/>
<!--解决了逆向工程不能实现覆盖的bug,生成器插件版本在1.3.7以上才能调用-->
<plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />
<commentGenerator>
<!-- 是否去除自动生成注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/mybatis" userId="root"
password="123456" />
<!-- java模型创建器
targetPackage:生成的类要放的包,真实的包受enableSubPackages属性控制;
targetProject:目标项目,指定一个存在的目录下,生成的内容会放到指定目录中
-->
<javaModelGenerator targetPackage="com.xuan.mybatis.entity"
targetProject="src/main/java">
<!-- 设置一个根对象,生成的实体会继承这个类-->
<property name="rootClass"value="com.xuan.mybatis.entity.BaseEntity" />
</javaModelGenerator>
<!-- 生成SQL mapper的XML文件-->
<sqlMapGenerator targetPackage="sqlmapper" targetProject="src/main/resources">
</sqlMapGenerator>
<!-- 生成Mapper接口
type:
1,ANNOTATEDMAPPER:会生成使用Mapper接口+Annotation的方式创建(SQL生成在
annotation中),不会生成对应的XML;
2,MIXEDMAPPER:使用混合配置,会生成Mapper接口,并适当添加合适的Annotation,但
是XML会生成在XML中;
3,XMLMAPPER:会生成Mapper接口,接口完全依赖XML;
注意,如果context是MyBatis3Simple:只支持ANNOTATEDMAPPER和XMLMAPPER
-->
<javaClientGenerator targetPackage="com.xuan.mybatis.mapper"
targetProject="src/main/java" type="XMLMAPPER" />
<!-- shema 数据库 tableName表名 -->
<table schema="${jdbc_username}" tableName="t_user">
</table>
</context>
</generatorConfiguration>
3.执行上图中的插件即可生成。
缓存
MyBatis 包含一个非常强大的查询缓存特性,使用缓存可以使应用更快地获取数据,避免频繁的数据库交互,从而提高项目的执行效率。
一级缓存
一级缓存默认会启用,想要关闭一级缓存可以在Mapper文件的标签上配置flushCache=“true”。一级缓存存在于 SqlSession 的生命周期中,在同一个 SqlSession 中查询时, MyBatis 会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个 Map对象中。
如果同一个 SqlSession 中执行的方法和参数完全一致,那么通过算法会生成相同的键值,当 Map 缓存对象中己经存在该键值时,则会返回缓存中的对象;任何的 INSERT 、UPDATE 、 DELETE 操作都会清空一级缓存。
二级缓存
二级缓存也叫应用缓存,存在于 SqlSessionFactory 的生命周期中,缓存是以namespace为单位的,不同namespace下的操作互不影响。
要开启二级缓存,你需要在你的 SQL Mapper文件中添加配置:
<cache eviction=“LRU" flushInterval="60000" size="512" readOnly="true"/>
同时,在MyBatis的核心配置文件中 cacheEnabled参数是二级缓存的全局开关,默认值是 true,如果把这个参数设置为 false,即使有后面的二级缓存配置,也不会生效。二级缓存与一级缓存的作用一致,只是扩大了生命周期。
事实上所有的缓存都是在做同样的事情.
示意图
1.每次与数据库的连接都会优先从缓存中获取数据
2.先查二级缓存,再查一级缓存,都没有的命中时候才会去执行数据库
从图中可以看出,二级缓存被多个sqlSerssion共享,因此容易出现脏读。建议避免使用二级缓存,在业务层使用可控制的缓存(Redis)代替更好。而一级缓存是SqlSession独享的,一个SqlSession就是一个线程,是相对安全的,建议开启。
在一个sqlSession中执行两次相同的查询时,可以看到输出框中缓存击中: