读书人

MyBatis映射文件的resultMap怎么做表关

发布时间: 2013-10-01 12:15:56 作者: rapoo

MyBatis映射文件的resultMap如何做表关联
public class MybatisOrder {.... private Mybatiscustomer customer; private List<MybatisOrderItem> itemList;....public class MybatisOrderItem { private MybatisOrder order;...对应的mapper文件为:
MybatiscustomerMapper.xml:<resultMap id="AssociationSelectMap" type="com.test.mybatis.vo.MybatisOrder" ><id column="ORDERID" property="orderid" jdbcType="DECIMAL" /><result column="ORDERTYPE" property="ordertype" jdbcType="VARCHAR" /><result column="ORDERDATE" property="orderdate" jdbcType="DATE" /><association property="customer" column="CUSTOMERID" select="com.test.mybatis.mapper.MybatiscustomerMapper.getCustomerByID"/> <collection property="itemList" column="ORDERID" javaType="ArrayList" ofType="MybatisOrderItem" select="com.test.mybatis.mapper.MybatisOrderItemMapper.selectItemsByOrderID"/></resultMap><select id="getOrderByID" resultMap="AssociationSelectMap" parameterType="java.math.BigDecimal" >select *from MYBATISORDER where ORDERID = #{orderid,jdbcType=DECIMAL}</select>MybatisOrderItemMapper.xml: <resultMap id="AssociationMap" type="com.test.mybatis.vo.MybatisOrderItem" > <id column="ITEMID" property="itemid" jdbcType="DECIMAL" /> <result column="ITEMTYPE" property="itemtype" jdbcType="VARCHAR" /> <result column="ITEMQUANTITY" property="itemquantity" jdbcType="VARCHAR" /> <result column="ITEMCOST" property="itemcost" jdbcType="VARCHAR" /> <association property="order" column="ORDERID" select="com.test.mybatis.mapper.MybatisOrderMapper.getOrderByID"/> </resultMap> <select id="selectItemByID" resultMap="AssociationMap" parameterType="java.math.BigDecimal" > select *from MYBATISORDERITEMwhere ITEMID = #{itemid,jdbcType=DECIMAL} </select>MybatiscustomerMapper.xml:因为不和别的表做关联,只有简单的id,result配置. <resultMap id="BaseResultMap" type="com.test.mybatis.vo.Mybatiscustomer" > <id column="ID" property="id" jdbcType="DECIMAL" /> <result column="NAME" property="name" jdbcType="VARCHAR" /> </resultMap> <select id="getCustomerByID" resultMap="BaseResultMap" parameterType="java.math.BigDecimal" > select *from MYBATISCUSTOMER where ID = #{id,jdbcType=DECIMAL} </select>

MybatisOrderMapper的getOrderByID会先从MYBATISORDER取数据,然后根据CUSTOMERID调用MybatiscustomerMapper.getCustomerByID,然后根据ORDERID调用MybatisOrderItemMapper.selectItemsByOrderID,对应每一条MYBATISORDER数据,都会分别访问另外两个表各一次.
通过将association和collection的select功能替换为resultMap,再用join方式的SQL可以用一条SQL语句将关联数据取出来:

[html] view plaincopyprint?
  1. <resultMap id="AssociationResultMap" type="com.test.mybatis.vo.MybatisOrder" > <id column="ORDERID" property="orderid" jdbcType="DECIMAL" />
  2. <result column="ORDERTYPE" property="ordertype" jdbcType="VARCHAR" /> <result column="ORDERDATE" property="orderdate" jdbcType="DATE" />
  3. <association property="customer" column="CUSTOMERID"
  4. resultMap="com.test.mybatis.mapper.MybatiscustomerMapper.BaseResultMap"/> <collection property="itemList" column="ORDERID" javaType="ArrayList"
  5. ofType="com.test.mybatis.vo.MybatisOrderItem" resultMap="com.test.mybatis.mapper.MybatisOrderItemMapper.BaseResultMap"/>
  6. </resultMap> <select id="getOrderAssociation" parameterType="String" resultMap="AssociationResultMap">
  7. SELECT * FROM mybatisOrder ord LEFT JOIN mybatiscustomer customer ON ord.customerId = customer.ID
  8. LEFT JOIN mybatisOrderItem item ON ord.orderid = item.orderid WHERE ord.orderid = #{id}
  9. </select>

读书人网 >编程

热点推荐