ibatis高级特性_第1页
ibatis高级特性_第2页
ibatis高级特性_第3页
ibatis高级特性_第4页
ibatis高级特性_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、iBATIS高级特性1、主要内容l 关联对象l 事务l 延迟加载l 缓存l 动态标签l 读写CLOB和BLOB字段l 与spring的整合2、关联对象 我们的大部分员工习惯了Hibernate的关联对象查询、级联删除、级联保存等特性,那么iBATIS是否提供同样的功能呢?这是大部分人会关心的内容。 答案也许是另人失望的。iBATIS可以关联查询,却没有提供级联保存和级联删除的特性。 下面我们介绍如何处理关联对象之间的查询、保存及删除问题。 关联查询iBatis为我们提供了两种方式关联查询,第一种N+1次查询,第二种新支持的查询方式。两种方式需要根据具体的应用环境,作出合适的选择。前一种由于多了

2、一次和数据库的读取操作,所以读取速度慢了些,但是可以使用延迟加载减少内存的消耗。而后一种方式多了些内存消耗,但是读取速度要快了。定义一个需求:我们在查询订单的同时希望查询出其关联的订单项。 采用N+1次查询首先看看我们的SQL Mapped配置文件如何配置的:我们可以看到,RESULT的select属性指向一个新的查询语句。说明:这个很好的解决了关联查询的问题,而且如果我们配置了全局的延迟加载,当真正用到订单项的时候,iBatis才为我们做查询的动作。但是这却带来了另外一个问题,N+1次查询的问题。也就是多了一次数据库的读操作,有一定的性能损失。 新查询方式首先看看我们的SQL Mapped配

3、置文件如何配置的:我们可以看到,RESULT的resultMap属性指向一个resultMap标签定义。说明:与前面N+1次查询方式比较,由于只读取数据库一次,的确读取速度更快了,但是由于存在更多的内存消耗(N+1方式可以通过延迟加载来减少内存的消耗),所以我们该根据具体的应用情况而选择合适的方式。2.2 级联保存在Hibernate中,我们可以使用级联保存,而iBATIS并没有提供该功能特性,此时我们需要自己保存关联的对象数据。定义一个需求:在保存订单的时候,希望一起保存其关联的订单项。其DAO层可以定义如下两个方法分别保存订单和关联的订单项:BMO层可以作如下调用:这里涉及到的事务等后面讲

4、解事务的时候再说明如何实现。2.3 级联删除 同样iBatis未提供级连删除的特性,我们要删除连关联表一起删除,也需要自己实现,其方式和保存类似,第一次删除关联的子表如订单项,再删除其主表如订单。 3、事务自动事务所谓自己事务,就是说Ibatis API单个方法自动划分为一个事务,不需要显示的开始、提交、结束。其主要针对一种应用程序、一个资源、且一次只能处理一个事务。如图:其配置如下:实现方式:说明:在Spring已经使用AOP申明式事务,所以像上面的配置文件及编码式事务使用到的可能性不大。在蓝本工程的其Spring配置如下:只要SMOImpl匹配的类,其insert*、update

5、*、add*、del*将自动使用事务。事务全局事务定义了一个更大的事务范围,它可以夸数据库、消息队列、甚至包含其它应用程序。下图展示了一个全局的事务系统:下图展示一个全局事务的配置方式:接口和iBATIS的局部事务相同。这样当需要从局部事务切换到全局事务的时候会很方方便,只要更改配置文件,不需要更改接口代码了。4、延迟加载配置方式如下图:该属性默认值为true,若该属性值为true,当采用N+1次查询的时候,iBatis会在需要关联数据的时候才开始执行查询。5、缓存6、动态标签主要分为五类动态标签:6.1 dynamic标签Dynamic可以使用的属性如下:属性功能Prepend(可选)该值作

6、为前缀添加到标签的结果内容提前。但是当标签的结果内容体为空的时候,prpend值将不其作用。Open(可选)该值作为前缀添加到标签的结果内容提前。如果结果内容体为空的时候,open值将不被附加到其前面。Open值将在prepend属性值被添加到前缀之前先被添加前缀。例如假设prepend=”when”,而open=”(”,则最终得到的组合是”when (“。Close(可选)该值作为后缀添加到标签的结果内容提后。如果标签的结果内容体为空的时候,close值将不起作用。使用示例如下:6.2 二元标签二元标签的属性如下:属性功能Property(必选)参数对象用于同compareProperty或

7、compareValye作比较的特性Prepend(可选)该值作为前缀添加到标签的结果内容提前。但是当标签的结果内容体为空的时候,prpend值将不其作用。Open(可选)该值作为前缀添加到标签的结果内容提前。如果结果内容体为空的时候,open值将不被附加到其前面。Open值将在prepend属性值被添加到前缀之前先被添加前缀。例如假设prepend=”when”,而open=”(”,则最终得到的组合是”when (“。Close(可选)该值作为后缀添加到标签的结果内容提后。如果标签的结果内容体为空的时候,close值将不起作用。romoveFirstPrepend(可选)该值用于决定第一个嵌

8、套的内容生成标签是否有移除其prepend值compareProperty、compareValye(两个必有其一)用来同property特性值作比较二元动态标签如下:<isEqual>Property属性与compareProperty或pareValye属性值作比较,看是否相同<isNotEqual>Property属性与compareProperty或pareValye属性值作比较,看是否不同<isGreaterThan>Property属性是否大于pareProperty或pareValye属性值<isGreaterEqual>Prope

9、rty属性与compareProperty或pareValye属性值作比较,看是否相同<isLessThan>Property属性与compareProperty或pareValye属性值作比较,看是否相同<isLessEqual>Property属性与compareProperty或pareValye属性值作比较,看是否相同使用示例如下:6.3 一元标签一元标签的属性如下:属性功能Property(必选)参数对象用于同compareProperty或compareValye作比较的特性Prepend(可选)该值作为前缀添加到标签的结果内容提前。但是当标签的结果内容体为

10、空的时候,prpend值将不其作用。Open(可选)该值作为前缀添加到标签的结果内容提前。如果结果内容体为空的时候,open值将不被附加到其前面。Open值将在prepend属性值被添加到前缀之前先被添加前缀。例如假设prepend=”when”,而open=”(”,则最终得到的组合是”when (“。Close(可选)该值作为后缀添加到标签的结果内容提后。如果标签的结果内容体为空的时候,close值将不起作用。romoveFirstPrepend(可选)该值用于决定第一个嵌套的内容生成标签是否有移除其prepend值一元标签如下:<isProperty-Available>确定参

11、数对象中是否存在所指定的字段。对于bean,它寻找一个特性;对象map,它寻找一个键。<isNotProperty-Available>确定参数对象中是否不存在所指定的字段。对于bean,它寻找一个特性;对象map,它寻找一个键。<isNull>确定参数对象中是否为空。对于bean,它寻找一个特性;对象map,它寻找一个键。<isNotNull>确定参数对象中是否不为空。对于bean,它寻找一个特性;对象map,它寻找一个键。<isEmpty>确定参数对象中是否为空、空字符串、空集合或空的String.valueOf().<isNotEmp

12、ty>确定参数对象中是否为非空、非空字符串、非空集合或非空的String.valueOf().使用示例如下:6.4 参数标签参数标签的属性如下:属性功能Prepend(可选)该值作为前缀添加到标签的结果内容提前。但是当标签的结果内容体为空的时候,prpend值将不其作用。Open(可选)该值作为前缀添加到标签的结果内容提前。如果结果内容体为空的时候,open值将不被附加到其前面。Open值将在prepend属性值被添加到前缀之前先被添加前缀。例如假设prepend=”when”,而open=”(”,则最终得到的组合是”when (“。Close(可选)该值作为后缀添加到标签的结果内容提后

13、。如果标签的结果内容体为空的时候,close值将不起作用。romoveFirstPrepend(可选)该值用于决定第一个嵌套的内容生成标签是否有移除其prepend值参数标签如下:标签说明<isParameterPresent>确定参数对象是否存在<isNotParameterPresent>确定参数对象是否不存在使用示例如下:6.5<itetate标签>itetate标签的属性如下:属性功能Property(必选)参数对象用于同compareProperty或compareValye作比较的特性Prepend(可选)该值作为前缀添加到标签的结果内容提前。但

14、是当标签的结果内容体为空的时候,prpend值将不其作用。Open(可选)该值作为前缀添加到标签的结果内容提前。如果结果内容体为空的时候,open值将不被附加到其前面。Open值将在prepend属性值被添加到前缀之前先被添加前缀。例如假设prepend=”when”,而open=”(”,则最终得到的组合是”when (“。Close(可选)该值作为后缀添加到标签的结果内容提后。如果标签的结果内容体为空的时候,close值将不起作用。Conjunction(可选)连接遍历集合(数组)时重复产生的那些SQL片段romoveFirstPrepend(可选)该值用于决定第一个嵌套的内容生成标签是否有

15、移除其prepend值使用示例如下:7、读取CLOB和BLOB字段在使用Oracle数据库时,读取CLOB和BLOB等大类型的数据一直是个比较犯难的事,一般都是通过JDBC代码来实现对CLOB和BLOB数据的读写,效果和性能都是最好的,但是代码也相当复杂,且代码难以重用。使用Spring的OracleLobHandler类处理采用这种方法只对数据源是直接连接Oracle 的JDBC驱动方式有效,如果你采用数据连接池作为数据源,则这种办法无效。根据我们公司的BSS3.0的情况使用可能性不大。所以这里不作介绍了。实现Ibatis的TypeHandlerCallback接口sqlMap 的配置如下:说明:通过实现ibatis的回调接口来实现,也有一定的局限性,需要新增一个类,配置也不方便,还可能会出错。通过配置ParameterMap和ResultMap来实现对LOB类型的读写

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论