MyBatis二级缓存的示例
下面我们通过一个示例来说明MyBatis如何使用MyBatis的二级缓存。
假设我们有一个用户表,表结构如下:
代码语言:javascript复制CREATE TABLE `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`age` int(11) NOT NULL,
`gender` varchar(10) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
我们使用MyBatis框架来操作该表,定义一个UserMapper接口:
代码语言:javascript复制public interface UserMapper {
User getUser(int id);
void updateUser(User user);
}
其中,getUser方法用于获取用户信息,updateUser方法用于更新用户信息。
对于getUser方法,我们可以使用二级缓存来提高查询效率。我们在Mapper.xml中添加以下配置:
代码语言:javascript复制<mapper namespace="com.example.UserMapper">
<cache
eviction="LRU"
flushInterval="60000"
size="512"
readOnly="true"/>
<select id="getUser" resultType="com.example.User" useCache="true">
SELECT * FROM user WHERE id = #{id}
</select>
</mapper>
其中,<cache>标签表示启用二级缓存,并设置了一些缓存的属性。<select>标签中的useCache="true"表示启用二级缓存。
然后,我们在Java代码中调用getUser方法:
代码语言:javascript复制UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.getUser(1);
第一次调用getUser方法时,MyBatis会执行SQL查询语句,获取到用户信息,并将结果缓存到二级缓存中。下次再调用getUser方法时,MyBatis会先从二级缓存中查找用户信息,如果存在,则直接返回缓存中的结果,否则再执行SQL查询语句。
对于updateUser方法,我们不使用二级缓存,因为更新操作会影响到数据库中的数据。我们在Mapper.xml中添加以下配置:
代码语言:javascript复制<mapper namespace="com.example.UserMapper">
<update id="updateUser" parameterType="com.example.User">
UPDATE user SET name=#{name}, age=#{age}, gender=#{gender} WHERE id=#{id}
</update>
</mapper>
然后,我们在Java代码中调用updateUser方法:
代码语言:javascript复制UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User(1, "Tom", 20, "Male");
userMapper.updateUser(user);
调用updateUser方法时,MyBatis不会使用二级缓存,而是直接执行SQL更新语句,将更新后的数据写入到数据库中。