mybatis缓存

it2022-05-06  11

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 踩

转载于:https://www.cnblogs.com/panxuejun/p/5851010.html


最新回复(0)