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
- 踩