MyBatis快速进阶--常用组件

184 阅读3分钟

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中执行两次相同的查询时,可以看到输出框中缓存击中: