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>
当执行数据库查询时,返回的结果中,包含一对多的实体关系:
即实体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
- ibatis-复杂类型属性
- ibatis 复杂类型属性(自定义类型的属性)
- 【Ibatis】(十二)、复杂类型集合的属性
- ibatis 复杂类型属性(自定义类型的属性) 避免n+1次select(1:1)
- 【Ibatis】(十三)、复杂类型属性(即自定义类型的属性)
- ibatis 复杂类型(用户自定义类型)
- ibatis的几个类型属性
- Spring注入复杂类型属性
- spring复杂类型属性注入
- bean注入复杂类型属性
- 复杂类型的属性注入
- Spring注入复杂类型属性
- 复杂对象ibatis插入,属性为list,怎么一次性插入
- Ibatis对复杂类型的保存或查询操作
- Spring(8)注入复杂类型属性
- ibatis复杂插入配置
- iBatis查询复杂集合
- ibatis 传递复杂参数
- Squid安装
- Android Studio中mipmap目录和drawable目录有什么区别
- 设计模式之建造者模式
- JSP技术(二)
- LearningSpark9:SparkSQL
- ibatis-复杂类型属性
- CSS规范书写
- linux环境变量
- properties文件的读取Util
- Spring RESTFul Client – RestTemplate Example
- mysql中的if条件语句用法
- vld 内存泄露检测工具vld的实现
- 深入学习 下 java socket
- URAL 1167Bicolored Horses dp练习