mybatis缓存

mybatis的延迟加载和缓存技术开始 
mybatis一级缓存 
这里写图片描述 
mybatis的二级缓存

mybatis默认是没有开启二级缓存的。 
开启二级缓存需要在mybatis的全局配置文件sqlMapConfig.xml中加入 

除了开启二级缓存开关外,还需要在各自的mapper.xml中开启二级缓存。 
这里写图片描述

原理图: 
这里写图片描述 
如上图:sqlsession1去查询id为1的用户信息,查询到用户信息就会查询数据存放在二级缓存区域(hashmap)中
sqlsession2去查询id为1的用户信息,首先去缓存中查找是否存在数据,如果存在就直接从二级缓存中取出数据。 
二级缓存和一级缓存的区别:二级缓存的范围更大,多个sqlsession 
可以共享usermapper的二级缓存。 
二级缓存是根据mapper的namespace来划分的,相同namaspace下的mapper共享二级缓存,反之 
如果sqlsession3去执行相同mapper下sql,并执行commit()操作,则清空该命名空间下的二级缓存

二级缓存的测试代码:

这里写图片描述

上面涂黄部分要特别注意,sqlsession关闭时才可以把数据写到二级缓存区域中,如果本namespace下的sqlsession执行了commit()操作,二级缓存就会清空

 

禁用二级缓存 
也可以禁用单个查询的二级缓存,这样要保证每次查询的都是最新数据。 
这里写图片描述

刷新二级缓存(就是清空缓存,切记) 
这里写图片描述 
总结:一般情况下,执行commit()操作之后,都要刷新缓存,因此flushCache都设为true,来避免数据的脏读。

mybatis cache的参数设置 
flushInterval(刷新间隔),可以为任意整数,单位为毫秒值,这个比较有用。

 

 

整合方法 
mybatis提供了一个cache接口,如果要实现自己的缓存逻辑,实现cache接口即可 
mybatis和ehcache整合,mybatis和ehcache整合包中提供了一个cache接口的实现类。 
这里写图片描述

二级缓存的应用场景(实际开发中用 刷新间隔) 
这里写图片描述

二级缓存额局限性 
这里写图片描述 
细粒度缓存,就是修改一个商品信息(即执行commit()方法),只修改缓存中这一个商品的信息,其余的信息不清空。

mybatis的延迟加载和缓存技术结束

mybatis和spring的整合(重点掌握)开始

1、整合的思路: 
(1)首先需要spring通过单例方式管理sqlSessionFactory 
(2)spring和mybatis整合生成代理对象,使用SqlSessionFactory创建sqlSession会话(此步是由spring和mybatis整合自动完成) 
(3)持久层的mapper,dao都需要由spring来管理 
2、环境的搭建 
这里写图片描述 
上面的sqlmap目录下的User.xml是为了原始dao开发使用的。还要加载spring,mybatis,mybatis-srping等jar包。 
3、在spring的配置文件中配置sqlSessionFactory和数据源 
sqlSessionFactory在mybatis和spring的整合包下 
这里写图片描述 
上图中:使用C3P0配置数据库连接池,属性参数名要按照规定写,不能自己定义,否则会报错,而使用dbcp就可以自定义参数名,这点注意。 
在加载配置文件时,都要加上类路径名classpath 
在使用原始dao开发时,属性name值要与UserDaoImpl类中变量名一致(特别是大小写) 
4、*原始Dao的开发(和spring整合后)* 
4.1 User.xml(也称mapper.xml更准确) 
这里写图片描述
和spring整合后,需要使用spring来管理mapper,spring配置文件为applicationContext.xml 
还有mybatis的配置文件来加载User.xml 
这里写图片描述 
4.2 UserDAO 
这里写图片描述 
基本上不用改变 
4.3 UserDaoImpl(重点在Dao的实现类上) 
这里写图片描述
上图中的代码最重要的就是继承了SqlSessionDaoSupport通过this.getSqlSession()来得到SqlSession会话 
这里也不需要写sqlSession的事务提交(更新操作不用写)和sqlSession关闭 
4.4 测试代码 
这里写图片描述

5、使用mapper代理来开发 (mybatis和spring整合后) 
和利用原始dao开发差不多,只是不需要dao接口的实现类 
而是根据一个规范来实现dao接口生成代理对象

5.1规范: 
(1)mapper.xml中的namespace命名空间等于mapper.java的全路径名 
这里写图片描述
(2)mapper.xml和mapper.java应在同一个目录下 
这里写图片描述 
(3)mapper.xml中的statement语句的输入参数paramType类型应与mapper.java中方法中传递的参数类型一致
这里写图片描述 
这里写图片描述
(4)mapper.xml中的statement语句的输出参数resultType类型应与mapper.java中方法返回值类型一致 
这里写图片描述 
这里写图片描述
5.2 让spring来管理mapper,在配置文件中 
这里写图片描述 
重点在这里,使用mybatis和spring的整合包中MapperFactoryBean来实现mapper接口生成代理对象 
属性值有mapperInterface和sqlSessionFactory 
总结:此方法存在一个大问题,需要针对每个mapper进行配置,太麻烦 
终极解决方案: 通过mapper批量扫描,从mapper包中扫描出mapper接口,自动创建代理对象并且在spring容器中注册 
这里写图片描述

<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
  • 1

上面代码,不能使用ref而是使用value,刚开始用错了。 
开发中推荐使用自动扫描, 
mybatis和spring的整合(重点掌握)结束 
mybatis的逆向工程(了解会用就行) 
这里写图片描述
generator.xml的配置,这里要记住,上图中最下边table后面的一长串值等于false的属性,是为了不生成其他与我们无关的example等代码 
下面需要mybatis-generator-core-1.3.2.jar和generator.xml文件在同于目录下,并且建立src目录接收生成的文件
这里写图片描述
生成后的如下图 
这里写图片描述 
没有了example的无用类了,比较干净,推荐使用

 
2
posted @ 2016-09-07 20:50  跨境电商杂货铺  阅读(697)  评论(0编辑  收藏  举报