基于xml文件配置的、将redis作为MyBatis的二级缓存
环境:maven3.6.0 + SpringBoot2.1.0.RELEASE + MyBatis
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springboot2.0-yipinketang-parent</artifactId>
<groupId>com.yipinketang.springboot2.0</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>SpringBoot2.0-yipinketang-mybatis-xml-redisAsCache</artifactId>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional><!--项目不支持传递,子项目不支持热部署-->
<!--<scope>true</scope>--><!--必须添加,否则无法生效-->
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork><!--还需要添加此配置-->
</configuration>
</plugin>
</plugins>
</build>
</project>
工程结构:
mybatis-config.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<!--通过这个配置文件,完成mybatis与数据库的连接 -->
<configuration>
<!--配置全局属性-->
<settings>
<!--使用jdbc的getGeneratedKeys获取数据库自增主键值-->
<setting name="useGeneratedKeys" value="true"/>
<!--使用列标签替换列别名 默认:true-->
<setting name="useColumnLabel" value="true"/>
<!--开启驼峰命名转换:Table{create_time} ->Entity{createTime}-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 使全局的映射器启用或禁用缓存。 -->
<setting name="cacheEnabled" value="true"/>
</settings>
<typeAliases>
<typeAlias alias="Integer" type="java.lang.Integer" />
<typeAlias alias="Long" type="java.lang.Long" />
<typeAlias alias="HashMap" type="java.util.HashMap" />
<typeAlias alias="LinkedHashMap" type="java.util.LinkedHashMap" />
<typeAlias alias="ArrayList" type="java.util.ArrayList" />
<typeAlias alias="LinkedList" type="java.util.LinkedList" />
</typeAliases>
</configuration>
userMapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--这里的namespace一定要是对应mapper包下面的接口,不然会报错:方法绑定异常-->
<mapper namespace="com.yipinketang.app.mapper.OrderMapperByXml">
<!--配置二级缓存-->
<cache type="com.yipinketang.app.cache.MyBatisRedisCache"/>
<resultMap id="BaseResultMap" type="com.yipinketang.app.domain.User">
<id column="id" property="id" jdbcType="BIGINT"></id>
<result column="number" property="number" javaType="java.lang.Integer"></result>
<result column="order_type" property="orderType"></result>
<result column="order_name" property="orderName" jdbcType="VARCHAR"></result>
<result column="creator" property="creator" jdbcType="VARCHAR"></result>
<result column="create_date" property="createDate"></result>
<result column="modify_date" property="modifyDate"></result>
</resultMap>
<sql id="base_column_list">
id, number, order_type, order_name, creator, create_date, modify_date
</sql>
<!--mybatis会自动根据方法名找到这个映射文件中的对应id的方法,即mapper接口中的方法名与这个映射文件中的id值对应
flushCache属性如果设置为true,每次都会刷新缓存,效果等同于没有开启二级缓存-->
<select id="findAll" resultMap="BaseResultMap" flushCache="false">
select
<include refid="base_column_list"/>
from user
</select>
</mapper>
启动程序,用postman分别请求两次:http://127.0.0.1:8000/order/getAllOrder 观察控制台输出:
1、如果如下设置:
控制台输出:
结论:虽然有走缓存,但是还是执行了两次相同的数据库操作,即没有起到二级缓存的作用
原因:sql映射标签中如果属性flushCache=true,表示每次都会刷新二级缓存,每一次查询都会直接从数据库中获取数据
2、如下设置:
控制台输出:
结论:这次根本没有走缓存,每一次查询都会直接从数据库中查询数据
原因:如果在每个sql映射标签中单独使用useCache=false属性,表示关闭该查询的二级缓存能力,这个时候flushCache属性无意义,也不会打印cache日志
3、默认的useCache=true flushCache=false
多次请求,只有第一次请求控制台会看到sql打印
注意:
这个类相当于一个工具类,作用是MyBatisRedisCache没有使用Spring的注解,但是需要使用SpringBoot的RedisTemplate组件,所以通过ApplicationContextHolder获取spring的IOC容器,从而通过getBean方法获取RedisTemplate实例。
ok,至此SpringBoot+MyBatis使用Redis作为二级缓存讲解完毕: