public Website selectWebsiteById(int id);WebsiteMapper.xml 中添加相应的映射 SQL 语句,代码如下。
<select id="selectWebsiteById" resultType="net.biancheng.po.Website"> SELECT * FROM website WHERE id=#{id} </select>测试代码如下。
package net.biancheng.test; import java.io.IOException; import java.io.InputStream; import java.util.List; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.log4j.Logger; import net.biancheng.po.Website; public class Test { public static Logger logger = Logger.getLogger(Test.class); public static void main(String[] args) throws IOException { InputStream config = Resources.getResourceAsStream("mybatis-config.xml"); // 根据配置文件构建 SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(config); SqlSession ss = ssf.openSession(); Website site = ss.selectOne("net.biancheng.mapper.WebsiteMapper.selectWebsiteById", 1); logger.debug("使用同一个sqlsession再执行一次"); Website site2 = ss.selectOne("net.biancheng.mapper.WebsiteMapper.selectWebsiteById", 1); // 请注意,当我们使用二级缓存的时候,sqlSession调用了 commit方法后才会生效 ss.commit(); logger.debug("现在创建一个新的SqlSeesion对象在执行一次"); SqlSession ss2 = ssf.openSession(); Website site3 = ss2.selectOne("net.biancheng.mapper.WebsiteMapper.selectWebsiteById", 1); // 请注意,当我们使用二级缓存的时候,sqlSession调用了 commit方法后才会生效 ss2.commit(); } }运行结果如下。
DEBUG [main] - ==> Preparing: SELECT * FROM website WHERE id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
DEBUG [main] - 使用同一个sqlsession再执行一次
DEBUG [main] - 现在创建一个新的SqlSeesion对象在执行一次
DEBUG [main] - ==> Preparing: SELECT * FROM website WHERE id=?
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <== Total: 1
<settings> <setting name="cacheEnabled" value="true" /> </settings>2)在 mapper 文件(如 WebMapper.xml)中设置缓存,默认不开启缓存。需要注意的是,二级缓存的作用域是针对 mapper 的 namescape 而言,即只有再次在 namescape 内(net.biancheng.WebsiteMapper)的查询才能共享这个缓存,代码如下。
<mapper namescape="net.biancheng.WebsiteMapper"> <!-- cache配置 --> <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true" /> ... </mapper>以上属性说明如下。
属性 | 说明 |
---|---|
eviction |
代表的是缓存回收策略,目前 MyBatis 提供以下策略。
|
flushInterval | 刷新间隔时间,单位为毫秒,这里配置的是 100 秒刷新,如果省略该配置,那么只有当 SQL 被执行的时候才会刷新缓存。 |
size | 引用数目,正整数,代表缓存最多可以存储多少个对象,不宜设置过大。设置过大会导致内存溢出。这里配置的是 1024 个对象。 |
readOnly | 只读,默认值为 false,意味着缓存数据只能读取而不能修改,这样设置的好处是可以快速读取缓存,缺点是没有办法修改缓存。 |
<select id="getWebsiteList" resultType="net.biancheng.po.Website" usecache="true"> ... </select>对于 MyBatis 缓存仅作了解即可,因为面对一定规模的数据量,内置的 Cache 方式就派不上用场了,并且对查询结果集做缓存并不是 MyBatis 所擅长的,它专心做的应该是 SQL 映射。对于缓存,采用 OSCache、Memcached 等专门的缓存服务器来做更为合理。
本文链接:http://task.lmcjl.com/news/18798.html