1.Result Map各种方式
1)隐式的Result Map,返回结果为Product实例
<statement id=”getProduct” resultClass=”com.ibatis.example.Product”>
select
PRD_ID as id,
PRD_DESCRIPTION as description
from PRODUCT
where PRD_ID = #value#
</statement>
上面的 mapped statement定义了 resultClass 属性,并为每个字段指定了别名,用于匹配
Product 类的属性名称。这样就可以了,不需要 result map。缺点在于,您无法指定字段的数据类型,且
不区分大小写,不建议用。
2)基本类型的Result(即String,Integer,Boolean)返回结果为int
<resultMap id=”get-product-result” class=”java.lang.String”>
<result property=”value” column=”PRD_DESCRIPTION”/>
</resultMap>
更简单方法是,在 mapped statement 中使用 resultClass 属性(使用“as”关键字给字段
取别名“value” ) :
<statement id=”getProductCount” resultClass=”java.lang.Integer”>
select count(1) as value
from PRODUCT
</statement>
3)Map方式,返回结果为HashMap
<resultMap id=”get-product-result” class=”java.util.HashMap”>
<result property=”id” column=”PRD_ID”/>
<result property=”code” column=”PRD_CODE”/>
<result property=”description” column=”PRD_DESCRIPTION”/>
<result property=”suggestedPrice” column=”PRD_SUGGESTED_PRICE”/>
</resultMap>
<statement id=”getProductCount” resultClass=”java.util.HashMap”>
select * from PRODUCT
</statement>
2.一对多的配置实现方式,如:Category 拥有 Product 对象的 List
<resultMap id=”get-category-result” class=”com.ibatis.example.Category”>
<result property=”id” column=”CAT_ID”/>
<result property=”description” column=”CAT_DESCRIPTION”/>
<result property=”productList” column=”CAT_ID” select=” getProductsByCatId”/>
</resultMap>
<resultMap id=”get-product-result” class=”com.ibatis.example.Product”>
<result property=”id” column=”PRD_ID”/>
<result property=”description” column=”PRD_DESCRIPTION”/>
</resultMap>
<statement id=”getCategory” parameterClass=”int” resultMap=”get-category-result”>
select * from CATEGORY where CAT_ID = #value#
</statement>
<statement id=”getProductsByCatId” parameterClass=”int” resultMap=”get-product-result”>
select * from PRODUCT where PRD_CAT_ID = #value#
</statement>
3.ibatis通过配置解决N+1的问题,解决大数据量时的效率问题
<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>
利用连接来实现,直接一条SQL语句
4.ibatis对于字段的继承的问题?
如:表字段10个,定义一个映射第1,2字段,再定义一个映射包含1,2字段,还需要3,4字段,是否可以用继承来减少资源实现?
<typeAlias alias="Test" type="com.xxx.Test" />
<resultMap id = "test" type = "Test">
<result property="id" column="id" />
</resultMap>
<resultMap id = "extTest" extends="test">
<result property="name" column="name"/>
</resultMap>
这样使用 extTest 则拥有id,name两个属性,达到复用。