已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ibatis使用荟萃相对hibernate来说,是一个半自动化的ORM映射框架,它是在jdbc的基础上进行了有限的封装,网上有很多关于ibatis与hibernate的讨论、争议,我在这就不再去论述二者之间的优劣,下面,我从程序员开发的角度来看看ibatis的使用。ibatis已经改名至mybatis,mybaits在动态sql配置、N+1查询方面有比大改进,其它方面改进不多,我觉得ibatis的老用户没有必要升级至mybaits,而且spring尚不支持mybaits(目前mybatis不得不自己提供spring插件)。一、开发sql日志输出ibatis中配置日志输入,需要在log4j的properties文件中进行配置。开发阶段我们将下面两个参数在日志文件中设置为 debug,即可看到详细的sql语句:log4j.logger.java.sql.Connection=DEBUGlog4j.logger.java.sql.Statement=DEBUG如果想看到参数和结果集中的具体数据,可将:log4j.logger.java.sql.PreparedStatement=DEBUGlog4j.logger.java.sql.ResultSet=DEBUG在日志输出上,ibatis没有hibernate来得方便。二、命名空间要启动在ibatis的配置文件中,我们一般都会把useStatementNamespaces=”true”(默认是没有启动的),对于大中型项目一定得这么做,大项目中sql语句块(statement)的重名将不可避免(注:mybatis中已经强制启动)。三、关系映射对于领域对象来说关系映射是重点,这也是每一个ORM框架需要解决的问题,我们一起来看ibatis中的关系映射示例:1、 一对一关系(配置片段为:老公和老婆) select * from t_husband where pk_id = #id# select * from t_husband where pk_id = #id# select * from t_wife where pk_husband_id = #id# 2、 一对多关系(配置片段为:客户和订单) select * from t_order where fk_customer_id = #customerId#3、多对多(配置片段为用户、用户组关系): select * from t_group where pk_id = #id# select * from t_user u left join t_user_group ug on u.pk_id = ug.fk_user_id where ug.fk_group_id = #gid# select * from t_user where pk_id = #id# select * from t_group g left join t_user_group ug on g.pk_id = ug.fk_group_id where ug.fk_user_id = #uid# 4、 继承映射(配置片段为动物父类,猫、狗子类) select * from t_animal where pk_id = #id# selectAnimalById会根据f_type(1:猫、2:狗)的取值正确实例化子类类型。5、多对一关系,自关联关系映射可以参照上面的写出四、解决N+1查询问题ibatis中的一对一、一对多映射配置代码都存在查询N+1问题,何为N+1?比如一对一关系中:有10条老公数据,在执行selectAllHusabnds时,将会产生11条sql,一条是取husbnad集合的,另10条是加载husbnad中的wife对象的。如果在业务中取到husbnad后不使用其中的wife对象,将造成不必要的加载(当然可以用延迟加载解决),如果用到wife系统将额外产生10条查询sql,在系统性能上也存在问题,因此,我们来看看ibatis 中如何解决这个问题。1、一对一的N+1问题,可以用下面的配置代码解决: select *, w.f_name as w_name, w.f_age as w_age from t_husband h, t_wife w where h.pk_id = w.pk_husband_id and h.pk_id = #id# 我们把两张表关联查询后产生的结果集映射到resultMap中,减少了sql的查询,从而提高了系统性能。2、一对多N+1也可采用类似的方法实现。比如,客户和订单一对多关系的N+1方案的配置代码如下,使用了groupBy来指定按什么属性(注意是属性名,而非列名)分组: select c.pk_id, c.f_name, c.f_phone, o.pk_id as pk_o_id, o.f_name as f_o_name, o.f_money from t_customer c left join t_order o on o.fk_customer_id = c.pk_id 3、多对多的N+1问题,可以通过下面的配置解决: select g.pk_id as pk_g_id, g.f_name as f_g_name, u.pk_id as pk_u_id, u.f_name as f_u_name from t_group g left join t_user_group ug on ug.fk_group_id = g.pk_idleft join t_user u on ug.fk_user_id = u.pk_id 但是要注意的是,上面多对多配置代码中的resultMap并没有完整表达领域对象的关系,如果我们在UserResult中加入了resultMap=”many2many.GroupResult”,ibatis中将会出现死循环错误。如果要完整表达领域对象关系,还得在配置文件上想办法,比如:另外定义一个resultMap。ibatis在查询的N+1问题上需要程序员意识到这个问题并且进行手工配置,这点在mybatis中得到了解决,mybatis引入了collection配置节点。如果想立即加载而又不想出现N+1查询问题,就得用我在上面提出的一些配置办法。当然,前提是你得对sql比较熟悉才行,我写sql就是弱项,复杂sql研究研究也写得出来,但是写完来后会很快忘记,下次遇到同类型的sql我还是去“研究”,呵呵,我有点“烦”sql哦,复杂sql别找我!五、动态查询动态查询可谓是ibatis的亮点,ibatis的实现方式也非常优雅,请看下面的配置片段: select * from t_customer (f_name like #name#) (f_phone like #phone#) ibatis会根据传入对象中的条件,组合生成相应的查询语句,其实就是QBE,hibernate虽然也有类似功能,但比较弱,比如:对象中的多个复杂对象做为example的时hibernate无法解决。而mybaits在这一块更是改进很多,使用起来也更加的方便。六、延迟加载延迟加载是所有ORM框架提高效率必用手段之一,ibatis中设置lazyLoadingEnabled=”true”,会延迟加载集合以及复杂对象类型(默认情况下就是延迟加载的,一般字节码增强也要打开,以进一步提高效率)。七、缓存的应用从底层来看,java通过JDBC访问数据库应该是最高效的,任何ORM框架都没有直接通过底层操作来得快,因此,ORM提速的另一个途径就是使用缓存, ibatis可以使用多种缓存框架,而且配置灵活。我们用cacheModel节点定义一个缓存区域。某个sql statement 需要缓存结果时,只需用cacheModel属性指定缓存区域名称即可八、自动化生成工具1、abator插件你可以用abator for eclipse plugin来帮助你从表生成对象、xml映射代码、 CRUD的配置代码、DAO代码(还可选择生成spring集成后风格的DAO代码),abator的配置代码不再贴出,自己上网搜一下。另,abator生成的QBE代码可以研究一下,可用来解决多条件组合查询问题。九、项目中的决择iba
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大脑撕裂伤的护理
- 2026年网络预约出租汽车驾驶员从业资格考试题库及完整答案【历年真题】
- 2026年度中国储备粮管理集团有限公司辽宁分公司公开招聘30人历年真题汇编附答案解析
- 2026年江苏省招聘社区工作者考试题附答案解析
- 2026年(通讯维修工)理论知识考试题库附参考答案【轻巧夺冠】
- 2025中能建数字科技集团有限公司专业人才社会招聘32人历年真题汇编带答案解析
- 2026年网络预约出租汽车驾驶员从业资格考试题库含答案(b卷)
- 2026年中国铁路武汉局集团有限公司招聘高校毕业生726人(信阳有岗)历年真题汇编及答案解析(夺冠)
- 2025广东机电职业技术学院招聘事业编制工作人员5人(第四批)参考题库带答案解析
- 2026年中国铁路武汉局集团有限公司招聘高校毕业生726人历年真题汇编带答案解析
- 劳动争议调解仲裁法知识讲座
- 矮小症诊治指南
- GB 14443-2007涂装作业安全规程涂层烘干室安全技术规定
- 解一元一次方程移项说课稿课件
- 危机管理及风险评估基础知识课件
- 多原子分子的结构和性质
- 中兴视频会议MCU MS9000开局配置
- 江苏股权交易中心章程
- 【水处理计算书+公式】工艺计算A2O-AO-MBBR
- 新品上市通知008附件1f50-21s13c认证f50试验报告
- Driving Theory Test Question+ Driving License Test in China外国人考驾照必备
评论
0/150
提交评论