当前位置:首页 » 硬盘大全 » ibatis遍历缓存
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

ibatis遍历缓存

发布时间: 2023-05-30 03:00:11

⑴ mybatis怎么实现局部缓存

1.1、Mybatis一级缓存测试

1 package me.gacl.test;
2
3 import me.gacl.domain.User;
4 import me.gacl.util.MyBatisUtil;
5 import org.apache.ibatis.session.sqlSession;
6 import org.junit.Test;
7
8 /**
9 * @author gacl
10 * 测试一级缓存
11 */
12 public class TestOneLevelCache {
13
14 /*
15 * 一级缓存: 也就Session级的缓存(默认开启)
16 */
17 @Test
18 public void testCache1() {
19 SqlSession session = MyBatisUtil.getSqlSession();
20 String statement = "me.gacl.mapping.userMapper.getUser";
21 User user = session.selectOne(statement, 1);
22 System.out.println(user);
23
24 /*
25 * 一级缓存默认就会被使用
26 */
27 user = session.selectOne(statement, 1);
28 System.out.println(user);
29 session.close();
30 /*
31 1. 必须是同一个Session,如果session对象已经close()过了就不可能用了
32 */
33 session = MyBatisUtil.getSqlSession();
34 user = session.selectOne(statement, 1);
35 System.out.println(user);
36
37 /*
38 2. 查询条件是一样的
39 */
40 user = session.selectOne(statement, 2);
41 System.out.println(user);
42
43 /*
44 3. 没有执行过session.clearCache()清理缓存
45 */
46 //session.clearCache();
47 user = session.selectOne(statement, 2);
48 System.out.println(user);
49
50 /*
51 4. 没有执行过增删改的操作(这些操作都会清理缓存)
52 */
53 session.update("me.gacl.mapping.userMapper.updateUser",
54 new User(2, "user", 23));
55 user = session.selectOne(statement, 2);
56 System.out.println(user);
57
58 }
59 }

1.2、Mybatis二级缓存测试
1、开启二级缓存,在userMapper.xml文件中添加如下配置
<mapper namespace="me.gacl.mapping.userMapper">
<!-- 开启二级缓存 -->
<cache/>

2、测试二级缓存

1 package me.gacl.test;
2
3 import me.gacl.domain.User;
4 import me.gacl.util.MyBatisUtil;
5 import org.apache.ibatis.session.SqlSession;
6 import org.apache.ibatis.session.SqlSessionFactory;
7 import org.junit.Test;
8
9 /**
10 * @author gacl
11 * 测试二级缓存
12 */
13 public class TestTwoLevelCache {
14
15 /*
16 * 测试二级缓存
17 * 使用两个不同的SqlSession对象去执行相同查询条件的查询,第二次查询时不会再发送SQL语句,而是直接从缓存中取出数据
18 */
19 @Test
20 public void testCache2() {
21 String statement = "me.gacl.mapping.userMapper.getUser";
22 SqlSessionFactory factory = MyBatisUtil.getSqlSessionFactory();
23 //开启两个不同的SqlSession
24 SqlSession session1 = factory.openSession();
25 SqlSession session2 = factory.openSession();
26 //使用二级缓存时,User类必须实现一个Serializable接口===> User implements Serializable
27 User user = session1.selectOne(statement, 1);
28 session1.commit();//不懂为啥,这个地方一定要提交事务之后二级缓存才会起作用
29 System.out.println("user="+user);
30
31 //由于使用的是两个不同的SqlSession对象,所以即使查询条件相同,一级缓存也不会开启使用
32 user = session2.selectOne(statement, 1);
33 //session2.commit();
34 System.out.println("user2="+user);
35 }
36 }

1.3、二级缓存补充说明
1. 映射语句文件中的所有select语句将会被缓存。
2. 映射语句文件中的所有insert,update和delete语句会刷新缓存。
3. 缓存会使用Least Recently Used(LRU,最近最少使用的)算法来收回。
4. 缓存会根据指定的时间间隔来刷新。
5. 缓存会存储1024个对象
cache标签常用属性:
<cache
eviction="FIFO" <!--回收策略为先进先出-->
flushInterval="60000" <!--自动刷新时间60s-->
size="512" <!--最多缓存512个引用对象-->
readOnly="true"/> <!--只读-->

⑵ ibatis中处理缓存有几种方式

ibatis在单独使用的时候,它自己是有一级缓存的,但是这个缓存不支持并发,所以还是不用为好。。
当ibatis和spring整合的时候,由于sqlSession是被SqlSessionDaoSupport管理的,而且是动扒蔽唤态代理出来的,此时ibatis自己的一级缓存就失效了,所以还是借春凯助并和第三方缓存框架,比如ehcache,oscache。

⑶ Hibernate与IBatis的优缺点及可行性分析

优点

简单

易于学习 易于使用 通过文档和源代码 可以比较完全的掌握它的设计思路和实现

实用

提供了数据映射功能 提供了对底层数据访问的封装(例如) 提供了框架 可以使我们更容易的开发和配置我们的dal层

灵活

通过sql基本上可以实现我们不使用数据访问框架可以实现的所有功能 或许更多

功能完整

哗档提供了连接管理 缓存支持 线程支持 (分布式)事物管理 通过配置作关系对象映射等数据访问层需要解决的问题 提供了支持 并在框架中封装了 Hibernate和datamapper 增强系统的可维护性 通过提供dal层 将业务逻辑和数据访问逻辑分离 使系统的设计更清晰 更易维护 更易单元测试 sql和代码的分离 提高了可维护性

缺点

滞后性

还没有明确对 net 的支持 最新版本在 下编译可以 但有些单元测试不能通过

不成熟 工程实践较少 ibatisnet在实际项目中的使用较少 只是理论上可行

半orm 工具支持较少 需要我们自己写sql 并且 net下还未发现可以自动生成业务层类和配置文件的工具 这点和Hibernate不一样 Hibernate会为我们的数据库直接产生sql 并有一些辅助工具 因此使用ibatis比Hibernate要多做一些工作

可行性

没有最好的框架 只有最适合的框架 存在的便是合理的 它存在就说明有它存在的道理 但它未必为我们存在 所以选择一个框架最主要的是看它对你有没有意义 意义有多大 是不是比其他框架带给 你的好处要多 没有绝对的优点也没有绝对的缺点 重要的是看在什么情况下讨论

上面说了部分的ibatis的优点和部分缺点 这些优点从理论上证明ibatis对任何数据持久层都合适 但未必是最好的选择 下面对上面的优缺乱亮乱点分别从两方面讨论

简单

我们都喜欢简单 简单意味着学习成本低 使用中出错的可能性低 同时 简单的东西一般来说功能不够强大 反过来 复杂的东西学习成本高 用起来不方便 并且团队没有很强的技术实力 一般不要使用

实用

解决了项目中需要解决的问题 这是任何实际工程中采用的框架和工具都应具有的性质 否则就不要拿到实际项目中来

灵活

灵活有两层意思 一种是简单易扩展 另一种是功能强大提供了很多选项 ibatis属于键基前者 Hibernate属于后者 两者各有优缺点

功能完整

ibatis的功能完整也是相对的 比我们自己开发的框架应该完整 但对比其他框架肯定也有一些解决不了的问题

增强系统的可维护性 利用ibatis可以做到sql和代码分离 可以设计出一个清晰的数据访问层(dal) 但项目架构是否科学合理 是否以维护 关键不在ibatis 因 为它只是一个数据层框架 但是我们也不得不清楚 要想发挥ibatis的优势 我们需要做一些额外工作 比如最好设计接口 需要将业务层实体和对实 体的访问放在不同的工程中 同时需要维护xml配置文件

滞后性

ibatis组现在还没有提到要支持 net 很多人在 net 下使用ibatis都出现了问题 所以如果要使用 net 开发 ibatis不是一个好选择 还需要等待

不成熟

开源的东西很难说成熟 但一般比我们自己写的框架要成熟 由于我们可以拿到他的源代码 所以关键在于我们能否驾驭它

半orm 工具支持少

这注定了ibatis不能从本质上提升开发效率 我们需要自己写sql 写实体类 写配置文件 但这也是它优越的地方 它没有为我们做的他多 所以我们就 有更多的施展空间 而且它非常适合那些并不能完全控制数据库的系统和需要利用数据库本身提供的高级特性的统计查询系统的开发

使用ibatis需要自己写sql 由于我们的sql不可能完全符合sql标准 比起Hibernate产生的sql来 可移植性差 不过由于我们更改 数据库的可能性较小 对我们来说sql符合标准以便可以在迁移到不同服务器时代价最小并不是十分必要的 另一方面 Hibernate虽然可以屏蔽很多 数据库间的不同 但是却很难利用某些数据库的高级特性 比如oracle的分析统计函数

Hibernate不适合数据库模式不规范 约束不完整 需要大量复杂查询的系统 同时Hibernate的学习成本较高 完全掌握Hibernate也较困难 风险较大

自己写框架未必比ibatis的好 稳定 强大和可扩展 而且自己开发框架也需要较大的工作量

如果使用dotnet并且要选一个数据层框架 而系统中有相当一部分较复杂的sql 或数据库设计不合理 脏数据多 对性能和资源要求严格 ibatis 是一个比较不错的选择 他的那些缺点并不是致命的 而且也是有一些解决方案的 尤其是 当选用了ibatis的dataaccess作为框架时 我 们可以同时使用Hibernate 和datamapper(ibatisnet的核心组件) 那样将会使风险降到最低 并且整个系统的 框架比较合理

另外 利用ibatis可以统一编码风格 节约开发成本 大家不会再把精力浪费到分页 连接池 主键生成等地方了 可以集中精力进行业务组件的编写

综上 很多时候我们要在是自己开发框架和选用第三方框架和选用什么样的框架问题上进行综合考虑 考虑的标准当然是项目的当前情况和我们希望达到目的的一个平衡

ibatis只是封装了数据访问层 替我们做了部分的对象关系映射 但我们的代价是必须要写xml配置文件 相对于Hibernate我们还要写很多 sql Hibernate通过工具直接从数据库模式生成实体类和基本的配置文件 而且大部分情况下不需要我们写sql 会较大的提升开发效率 但这些也 有很多的局限性 尤其是对环境的要求较高(数据库设计 对象设计 团队的协作等)

个人感觉ibatis对项目比较有意义的地方在于它小巧灵活 可扩展 封装了数据访问层(事务 缓存 异常 日志) 并提供了框架支持

利用ibatis我们可以做到代码和sql的分离 只要sql能够解决的问题 ibatis就能帮我们较容易的解决 同时也使我们的项目对某一框架的依赖 性变小(因为ibatis是非侵入性的) 这将极大的降低项目风险 减少解决复杂问题的时间 使项目的维护变得简单

ibatis对于应用的修改 调试 扩充和维护将会变得容易自然 修改时 我们主要修改的是代表模型的实体对象 xml配置文件中的sql 和/或配置文 件的resultmap(很多时候是不需要的) 同时 sql和代码分离 我们不用在代码的stringbuffer的append方法之间寻找需要修改 的sql 配置文件中的sql便利了我们的调试和对sql的评审及以后的sql重用

利用一些框架在前期一般会拖慢开发效率 因为我们需要付出学习成本 很多时候 使用框架需要写很多配置文件 在使用不熟时开发速度较慢 同时利用框架往往 使系统代码量增大 比如model 和model 模型 开发效率应该还是model 快 四层的架构肯定比两层的代码量大 但对于中后期开发和维护将会极大的提高效率

利用一些较完全的开发框架和代码生成工具 在前期会较大的提高开发效率 但在后期常常会拖慢进度 并有可能成为以后维护的梦魇 比如torque生成实体类和其对应的sql 虽大幅提高了效率 但修改负担较大

比较理想的开发方式是使用简单框架结合简单的代码生成工具 框架提供系统的基础服务 并规范开发 框架一方面提供了开发中某一方面的开发基础支持 比如数 据访问层 事务 日志 公用类 异常等 另一方面 也为开发定义了模式 定义了系统的基本轮廓 同时 通过简单的代码生成工具生成部分低级的代码 比如通 过工具从数据库模式生成实体类 这些类生成后我们可以自由修改

Hibernate是十分强大 比较完善的orm框架 不过这是它的优点也是它的缺点 J EE系统是否采用Hibernate 是一个需要认真评估的问题

要想Hibernate工作的好 数据库的设计必须好 同时对于复杂的数据操作同时需要使用sql Hibernate 对于直接使用sql的支持比Hibernate 要自然 这一点是可以接受的

Hibernate比较复杂 功能强大而灵活 要用好Hibernate确实不是很简单 当然spring框架提供了对Hibernate的封装 使Hibernate的使用变得简单了点

lishixin/Article/program/Java/ky/201311/28363

⑷ iBatis的SqlMap中,我写的这条动态SQL语句,将表名当做参数动态传递,报“表名无效”错误。

因为#value#这种形式的,转换为SQL中的?,而问号只有在赋值属性(字段)的时候才用,表名不能用这个方式写,而且更不要用$value$这种形式替换,因为ibatis编译的SQL会缓存。导致第二次传递进来的表名不会替换,在表可数的情况下,可以传递一个变量,来判断需要查询哪个表。