ibatis对象关系实现

转载 2015年11月17日 19:58:41
  hibernate 的强大在于完全的对象化,对于对象之间的关系解决的比较好,如1对1,1对多,多对1,以及多对多。当然也包括继承关系。 
    而ibatis这方面就比较逊色了,不过对于也支持简单的关连查询,如1对1,和1对多。对于一般的情况来说,这两种已经足够了,当然不能层叠更新是一个缺陷,看了半天文档,也没有找到对象之间的层叠更新,估计是不支持。 
以前的版本ibatis处理关连是通过执行两次sql来实现的,如下的实例: 
一对多关联: 
<sqlMap namespace="User"> <typeAlias alias="user" type="com.ibatis.sample.User"/> <typeAlias alias="address" type="com.ibatis.sample.Address"/> <resultMap id="get-user-result" class="user"> <result property="id" column="id"/> <result property="name" column="name"/> <result property="sex" column="sex"/> <result property="addresses" column="id" select="User.getAddressByUserId"/> </resultMap> <select id="getUsers" parameterClass="java.lang.String" resultMap="get-user-result"> <![CDATA[<![CDATA[</span> </span></li> <li class="alt"><span><span class="cdata">
select id,name,sex</span> </span></li> <li class=""><span><span class="cdata">from t_user
</span> </span></li> <li class="alt"><span><span class="cdata">where id = #id#</span>
</span></li> <li class=""><span><span class="cdata">]> </select> <select id="getAddressByUserId" parameterClass="int" resultClass="address"> <![CDATA[<![CDATA[</span> </span></li> <li class=""><span><span class="cdata">
select address,zipcode</span> </span></li> <li class="alt"><span><span class="cdata">
from t_address</span> </span></li> <li class=""><span><span class="cdata">
where user_id = #userid#</span> </span></li> <li class="alt"><span><span class="cdata">]> </select> </sqlMap>
    这里通过在resultMap 中定义嵌套查询getAddressByUserId,我们实现了关联数据的读取。 
    需要注意的是,这里有一个潜在的性能问题,也就是所谓“n+1”Select问题。 
    一对一关联: 
    对于这种情况,我们可以采用一次Select两张表的方式,避免这样的性能开销(假设上面示例中,每个User 只有一个对应的Address记录):
<resultMap id="get-user-result" class="user"> <result property="id" column="id"/> <result property="name" column="name"/> <result property="sex" column="sex"/> <result property="address" column="t_address.address"/> <result property="zipCode" column="t_address.zipcode"/> </resultMap> <select id="getUsers" parameterClass="java.lang.String" resultMap="get-user-result"> <![CDATA[<![CDATA[</span> </span></li> <li class="alt"><span><span class="cdata">
select *</span> </span></li> <li class=""><span><span class="cdata">from t_user,t_address
</span> </span></li> <li class="alt"><span><span class="cdata">
where t_user.id=t_address.user_id</span> </span></li> <li class=""><span>
<
span class="cdata">]> </select>
    在现在的版本中,对于n+1问题,ibatis已经很好的解决了。如下的配置:
<resultMap id=get-product-result” class=”com.ibatis.example.Product”> <result property=”id” column=”PRD_ID”/> <result property=”description” column=”PRD_DESCRIPTION”/> <result property=”category” resultMap=get-category-result” /> </resultMap> <resultMap id=get-category-result” class=”com.ibatis.example.Category”> <result property=”id” column=”CAT_ID” /> <result property=”description” column=”CAT_DESCRIPTION” /> </resultMap> <select id=”getProduct” parameterClass=int” resultMap=get-product-result”> select * from PRODUCT, CATEGORY where PRD_CAT_ID=CAT_ID and PRD_ID = #value# </select>
    可以使用内在的resultMap来解决此问题。 
    同样一对多如下:
<sqlMap namespace="ProductCategory"> <resultMap id=”categoryResult” class=”com.ibatis.example.Category” groupBy=”id”> <result property=”id” column=”CAT_ID”/> <result property=”description” column=”CAT_DESCRIPTION”/> <result property=”productList” resultMap=”ProductCategory.productResult”/> </resultMap> <resultMap id=”productResult” class=”com.ibatis.example.Product”> <result property=”id” column=”PRD_ID”/> <result property=”description” column=”PRD_DESCRIPTION”/> </resultMap> <select id=”getCategory” parameterClass=int” resultMap=”categoryResult”> select C.CAT_ID, C.CAT_DESCRIPTION, P.PRD_ID, P.PRD_DESCRIPTION from CATEGORY C left outer join PRODUCT P on C.CAT_ID = P.PRD_CAT_ID where CAT_ID = #value# </select> </sqlMap>
    注意,需要使用增加groupBy属性来分类

复杂对象ibatis插入,属性为list,怎么一次性插入

转自:http://mzhj.iteye.com/blog/1030359 public class PfStuffInfoVo implements Serializable { ...
  • jubincn
  • jubincn
  • 2012年04月06日 16:47
  • 6537

ibatis批量插入对象

正确写法: dao public Map saveWxcircleList_one(List wdto){ Map map = new HashMap(); List ...
  • dandanforgetlove
  • dandanforgetlove
  • 2015年11月17日 16:54
  • 3984

ibatis 中动态SQL查询和动态标签嵌套的使用

ibatis 动态查询 对于从事 Java EE 的开发人员来说,iBatis 是一个再熟悉不过的持久层框架了,在 Hibernate、JPA 这样的一站式对象 / 关系映射(O/R Mapping...
  • u014475796
  • u014475796
  • 2016年05月09日 17:21
  • 6233

ibatis-多层级对象访问

问题: 多层级对象访问即:对象里包含非基本类型对象时,在xml里配置访问子对象的数据 下面直接上代码例子~ model对象 RegRecord.java: public clas...
  • moshenglin
  • moshenglin
  • 2015年02月13日 16:20
  • 143

ibatis嵌套查询

例子:检索某内容,该内容有三级目录,分为类别、专业、科目,有多个类别,每个类别又包含多个专业,每个专业也包含多个科目,这三级目录关系存在同一个表中,现在需要取出目录关系树状机构信息? 遇到这种问题我们...
  • s13554341560b
  • s13554341560b
  • 2017年07月31日 17:02
  • 295

ibatis插入和更新

INSERT INTO SCHEDULE_JOB_PARAM (JOB_ID, PARAM_KEY, PARAM_DESC
  • u010081710
  • u010081710
  • 2015年12月08日 10:12
  • 845

ibatis 批量插入[类对象]到 oracle 数据库

1.实现目标:  a)使用ibatis实现批量插入数据到oracle数据库  b)插入的是类对象数据列表  c)插入的同时,需要使用数据库sequence生成对象的唯一标识  2.实现过程...
  • luofuIT
  • luofuIT
  • 2015年03月17日 09:54
  • 851

ibatis 对象关系实现

    hibernate 的强大在于完全的对象化,对于对象之间的关系解决的比较好,如1对1,1对多,多对1,以及多对多。当然也包括继承关系。    而ibatis这方面就比较逊色了,不过对于也支持简...
  • zyl623
  • zyl623
  • 2007年01月16日 16:22
  • 780

ibatis对象关系实现

hibernate 的强大在于完全的对象化,对于对象之间的关系解决的比较好,如1对1,1对多,多对1,以及多对多。当然也包括继承关系。     而ibatis这方面就比较逊色了,不过对于也支持简单的关...
  • hdy007
  • hdy007
  • 2007年03月15日 15:19
  • 882

ibatis插入CLOB字段

http://my.oschina.net/zimingforever/blog/81135 问题背景很简单,原先的DO中有一个字段是OutputStream类型,好吧,别问我为什么用这么变...
  • yanghaijianyumi
  • yanghaijianyumi
  • 2014年11月29日 11:35
  • 1412
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ibatis对象关系实现
举报原因:
原因补充:

(最多只允许输入30个字)