部门准备转做其他业务(小道消息啊,呵呵) ,技术选型方面准备考虑使用SpringMVC+Spring+iBATIS(第三版以后称为“MyBATIS”,以下统一称为“iBATIS”。如果第二版和第三版对比时,称第三版为“MyBATIS”)。而且,部门准备请另外一部门同事来讲解一下iBATIS。借此机会,我看了一些iBATIS的资料,同时也整理出一些问题。发布出来,希望大家帮忙解答。(以后这些问题解决了,我也会发布一些文章来跟踪介绍。)背景介绍完毕,直接上题:
映射相关:
- iBATIS中,主键映射使用的是<selectKey>。 Oracle、MySQL对主键自动增加实现方式不同。DB2不清楚如何实现。 在使用Oracle、DB2、MySQL中,该如何处理?
- 在iBATIS中如何继承关系如何实现?
- iBATIS中有映射参数有两种形式:内联映射(inline mapping)和外部映射(external mapping)。这两个有什么区别?各自的优缺点是什么?使用时,改如何选择?
- 如何实现动态多列选择(dynamic-column list selection)?
- 在iBATIS的配置文件中,可以使用<typeAlias>进行模型类名的简化。如果多人开发的话,会增加命名冲突等问题发生的可能性。有没有一个最佳实践,来提高重用性,同事规避这些问题的发生?
- 使用过iBATIS调用存储过程吗?该如何整?
内部实现机制
- 据了解iBATIS中没有为update加锁。如何解决在高并发情况下的同步问题?
- iBATIS使用单一一个Jar包也能实现功能。不过,据了解如果使用cglib这个运行时代码生成库,可以提延迟加载的性能。这个的实现原理是什么?这个增加框架是否推荐使用?为什么?
- 向数据库新增数据时,保存后,对象的ID是否会自动的回填到原来的对象中?
缓存相关:
- 据了解iBATIS中有四种内置MEMORY、LRU、FIFO、OSCACHE高速缓存类型。如果这四个缓存类型不满足需求。如何实现扩展高速缓存,实现自己的缓存类型?
- 在配置缓存时,iBATIS清除缓存是把所有的缓存都清楚还是只清楚一个实例模型相关的?
- iBATIS的缓存对于开发人员来说是否是透明的?需要自己编写和缓存相关的代码吗?
- iBATIS中和高速缓存策略相关的最佳实践是什么?能否分享一下?
优化相关:
- iBATIS中也可以懒加载。如何实现“按需加载”?
- iBATIS中有哪些优化策略?有没有这方面的最佳实践?
- iBATIS的事务管理器有JDBC、JTA、EXTERNAL三种。如果使用Spring来管理事务的话该如何配置?使用EXTERNAL?
实践相关:
- 能否用实例说明一下 “N+1查询”问题 ?如何解决“N+1查询”问题?
- iBATIS的动态SQL效率如何?如果过多的使用动态SQL,是否会影响效率?
- iBATIS的最佳实践都有哪些?
其他
- 为什么不使用MyBATIS(iBATIS的第三版)?
- iBATIS都有哪些扩展点?会对我们的开发工作有何促进?
与Hibernate对比的一些问题
- Hibernate中,模型对象有瞬时、持久化、脱管和移除四个生命周期。iBATIS的对象有生命周期吗?分别是什么?。
- Hibernate中有OpenViewInSession模式,用来应对Session失效(或者是过期)。iBATIS下有这方面的问题吗?如何应对这个问题?
- 在Hibernate中有一级缓存、二级缓存等。在iBATIS中是否也有与Hibernate对应的缓存架构和概念?
- Hibernate中有乐观锁和悲观锁。在iBATIS中是否也有这方面的机制?