ibatis-复杂类型属性

来源:互联网 发布:高品质音乐软件 编辑:程序博客网 时间:2024/05/22 00:32
复杂类型属性(即自定义类型的属性)


当执行数据库查询时,返回的结果中,包含一对多的实体关系:
即实体Product中包含多个实体Category。


请看以下实例:


<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” column=”PRD_CAT_ID” select=”getCategory”/>
</resultMap>


<resultMap id=”get-category-result” class=”com.ibatis.example.Category”>
<result property=”id” column=”CAT_ID”/>
<result property=”description” column=”CAT_DESCRIPTION”/>
</resultMap>


<statement id=”getProduct” parameterClass=”int” resultMap=”get-product-result”>
select * from PRODUCT where PRD_ID = #value#
</statement>


<statement id=”getCategory” parameterClass=”int” resultMap=”get-category-result”>
select * from CATEGORY where CAT_ID = #value#
</statement>


上面的例子中,Product对象拥有一个类型为Category的category属性。


因为category是复杂类型(用户定义的类型),JDBC不知道如何给它赋值。通过将category属性值和另一个mapped statement联系起来,


为SQL Map引擎如何给它赋值提供了足够的信息。


通过执行“getProduct”,“get-product-result” Result Map使用PRD_CAT_ID(通过getProduct取出来的字段)字段的值去


调用“getCategory”。“get-category-result”Result Map将初始化一个Category对象并赋值给它。


然后整个Category对象将赋值给Product的category属性。


注意:


上面的方法存在一个问题,就是无论何时加载一个Product,实际上都要执行两个SQL语句(分别加载Product和Category)。


只加载一个Product的情况下,这个问题似乎微不足道。但在执行一个获得10个Product的查询时,


每得到一个Product都要分别执行一个加载Category的SQL语句。结果共执行了11次查询:


一次用于得到一个Product List,每得到一个Product对象都要执行另外一次查询,


以获得相应的Category对象(N+1,这个例子是10+1=11)。



解决方法是,使用一个联合查询和嵌套的属性映射来代替两个查询statement。


即尽量避免N+1 Select


上面例子的解决方案是:


<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.id” column=”CAT_ID” />
<result property=”category.description” column=”CAT_DESCRIPTION” />
</resultMap>


<statement id=”getProduct” parameterClass=”int” resultMap=”get-product-result”>
select *
from PRODUCT, CATEGORY
where PRD_CAT_ID=CAT_ID
and PRD_ID = #value#
</statement>

0 0
原创粉丝点击