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>
通过将association和collection的select功能替换为resultMap,再用join方式的SQL可以用一条SQL语句将关联数据取出来:[html] view plaincopyprint?
- <resultMap id="AssociationResultMap" 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"
- resultMap="com.test.mybatis.mapper.MybatiscustomerMapper.BaseResultMap"/> <collection property="itemList" column="ORDERID" javaType="ArrayList"
- ofType="com.test.mybatis.vo.MybatisOrderItem" resultMap="com.test.mybatis.mapper.MybatisOrderItemMapper.BaseResultMap"/>
- </resultMap> <select id="getOrderAssociation" parameterType="String" resultMap="AssociationResultMap">
- SELECT * FROM mybatisOrder ord LEFT JOIN mybatiscustomer customer ON ord.customerId = customer.ID
- LEFT JOIN mybatisOrderItem item ON ord.orderid = item.orderid WHERE ord.orderid = #{id}
- </select>