476
社区成员
发帖
与我相关
我的任务
分享
以上是两张表,省份表与地市
ProvinceMapper
@CacheNamespace(implementation=org.mybatis.caches.ehcache.EhcacheCache.class)
public interface ProvinceMapper {
@Select("select id,province_name provinceName,province_code provinceCode,order_num orderNum from province where id=#{id}")
Province get(Integer id);
}
CityMapper
public interface CityMapper {
@Select("select id,city_name,city_code,province_id from city where id=#{id}")
@Results(value={
@Result(property="id",column="id",id=true),
@Result(property="cityName",column="city_name"),
@Result(property="cityCode",column="city_code"),
@Result(property="province",column="province_id",javaType=Province.class,
one=@One(select="org.qh.mapper.ProvinceMapper.get"))
})
City get(Integer id);
}
我用如下的代码进行测试
@Test
public void test2() {
SqlSession session = null;
/*
session = sqlSessionFactory.openSession();
ProvinceMapper provinceMapper = session.getMapper(ProvinceMapper.class);
Province province = provinceMapper.get(9);
session.close();
*/
session = sqlSessionFactory.openSession();
CityMapper cityMapper = session.getMapper(CityMapper.class);
City city = cityMapper.get(7);
assertNotNull(city);
session.close();
session = sqlSessionFactory.openSession();
cityMapper = session.getMapper(CityMapper.class);
city = cityMapper.get(7);
assertNotNull(city);
session.close();
}
输出日志
net.sf.ehcache.config.ConfigurationHelper - CacheDecoratorFactory not configured for defaultCache. Skipping for 'org.qh.mapper.ProvinceMapper'.
org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection
org.apache.ibatis.datasource.pooled.PooledDataSource - Created connection 168242572.
org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@a072d8c]
org.qh.mapper.CityMapper.get - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@a072d8c]
org.qh.mapper.CityMapper.get - ==> Preparing: select id,city_name,city_code,province_id from city where id=?
org.qh.mapper.CityMapper.get - ==> Parameters: 7(Integer)
org.qh.mapper.ProvinceMapper.get - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@a072d8c]
org.qh.mapper.ProvinceMapper.get - ==> Preparing: select id,province_name provinceName,province_code provinceCode,order_num orderNum from province where id=?
org.qh.mapper.ProvinceMapper.get - ==> Parameters: 9(Integer)
org.qh.mapper.ProvinceMapper.get - <== Total: 1
org.qh.mapper.CityMapper.get - <== Total: 1
org.apache.ibatis.transaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@a072d8c]
org.apache.ibatis.transaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@a072d8c]
org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 168242572 to pool.
org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection
org.apache.ibatis.datasource.pooled.PooledDataSource - Checked out connection 168242572 from pool.
org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@a072d8c]
org.qh.mapper.CityMapper.get - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@a072d8c]
org.qh.mapper.CityMapper.get - ==> Preparing: select id,city_name,city_code,province_id from city where id=?
org.qh.mapper.CityMapper.get - ==> Parameters: 7(Integer)
org.qh.mapper.ProvinceMapper.get - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@a072d8c]
org.qh.mapper.ProvinceMapper.get - ==> Preparing: select id,province_name provinceName,province_code provinceCode,order_num orderNum from province where id=?
org.qh.mapper.ProvinceMapper.get - ==> Parameters: 9(Integer)
org.qh.mapper.ProvinceMapper.get - <== Total: 1
org.qh.mapper.CityMapper.get - <== Total: 1
org.apache.ibatis.transaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@a072d8c]
org.apache.ibatis.transaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@a072d8c]
org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 168242572 to pool.
很明显city的子查询每一次都要查询province
如果先查询一次Province,将查询结果会被缓存中,之后子查询会用到缓存
@Test
public void test2() {
SqlSession session = null;
session = sqlSessionFactory.openSession();
ProvinceMapper provinceMapper = session.getMapper(ProvinceMapper.class);
Province province = provinceMapper.get(9);
session.close();
session = sqlSessionFactory.openSession();
CityMapper cityMapper = session.getMapper(CityMapper.class);
City city = cityMapper.get(7);
assertNotNull(city);
session.close();
session = sqlSessionFactory.openSession();
cityMapper = session.getMapper(CityMapper.class);
city = cityMapper.get(7);
assertNotNull(city);
session.close();
}
net.sf.ehcache.config.ConfigurationHelper - CacheDecoratorFactory not configured for defaultCache. Skipping for 'org.qh.mapper.ProvinceMapper'.
org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection
org.apache.ibatis.datasource.pooled.PooledDataSource - Created connection 1440671952.
org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0]
org.qh.mapper.ProvinceMapper.get - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0]
org.qh.mapper.ProvinceMapper.get - ==> Preparing: select id,province_name provinceName,province_code provinceCode,order_num orderNum from province where id=?
org.qh.mapper.ProvinceMapper.get - ==> Parameters: 9(Integer)
org.qh.mapper.ProvinceMapper.get - <== Total: 1
net.sf.ehcache.store.disk.Segment - put added 0 on heap
org.apache.ibatis.transaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0]
org.apache.ibatis.transaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0]
org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 1440671952 to pool.
org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection
org.apache.ibatis.datasource.pooled.PooledDataSource - Checked out connection 1440671952 from pool.
org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0]
org.qh.mapper.CityMapper.get - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0]
org.qh.mapper.CityMapper.get - ==> Preparing: select id,city_name,city_code,province_id from city where id=?
org.qh.mapper.CityMapper.get - ==> Parameters: 7(Integer)
org.qh.mapper.CityMapper.get - <== Total: 1
org.apache.ibatis.transaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0]
org.apache.ibatis.transaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0]
org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 1440671952 to pool.
org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection
org.apache.ibatis.datasource.pooled.PooledDataSource - Checked out connection 1440671952 from pool.
org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0]
org.qh.mapper.CityMapper.get - ooo Using Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0]
org.qh.mapper.CityMapper.get - ==> Preparing: select id,city_name,city_code,province_id from city where id=?
org.qh.mapper.CityMapper.get - ==> Parameters: 7(Integer)
org.qh.mapper.CityMapper.get - <== Total: 1
org.apache.ibatis.transaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0]
org.apache.ibatis.transaction.jdbc.JdbcTransaction - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@55dee8d0]
org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 1440671952 to pool.
net.sf.ehcache.store.disk.Segment - fault removed 0 from heap
net.sf.ehcache.store.disk.Segment - fault added 0 on disk
很明显缓存起到作用了。
通过以上测试,难道说mybatis对于子查询不会将结果放入缓存中吗,非得之前查询过,子查询才能用缓存。
这是怎么回事,是我的代码写的问题,还是mybatis的bug?