一、基本知识
resultMap和resultType区别:有引用类型属性用resultMap
association:"< association property=“user” javaType=“User”>" //一对一映射或多对一
collection:< collection property=“orderDetails” ofType=“OrderDetail”> //一对多映射
property:中的值要和实体类属性名相同
column:中的值要跟SQL语句中查询的列名相同
selectKey:
建立单方面联系:多对一时,让多的一方记住一的,就是说在"一"那方建立引用类型属性(也就是在实体类中建集合属性)
商品、订单、订单详情、用户之间的关系:
1、订单和订单详情:一对多
2、订单详情和商品:多对多
3、订单和用户:一对一
4、用户和商品:多对多
5、商品和订单明细:一对多
二、映射实例
1、一对一映射:订单-----用户
接口:
/**
* 查询所有订单关联用户信息
* 注意:返回类型是一个Order对象
*/
public List<Order> findAllOrderAndUser_o2o();
Mapper映射:
<!-- /** * 查询所有订单关联用户信息 * 注意:返回类型是一个Order对象 */
public List<Order> findAllOrderAndUser_o2o(); -->
<!--id中的值要和接口中的方法名相同-->
<select id="findAllOrderAndUser_o2o" resultMap="orderResultMap">
select u.id "uid",u.username,u.birthday,u.address,o.id
"oid",o.userid,o.orderid,o.createtime,o.note
from t_user u,orders o
where u.id=o.userid
</select>
<!-- 对订单查询结果进行映射 private Integer id; private String orderId; private Date
createtime; private String note; //怎么解决user属性的映射问题?Order->user:1-1 private
User user; !! private Integer id; private String username; private Date birthday;
private String address; -->
<resultMap type="Order" id="orderResultMap">
<id column="oid" property="id"></id>
<result column="orderid" property="orderId"></result>
<result column="createtime" property="createtime"></result>
<result column="note" property="note"></result>
<!--一对一association映射-->
<!--property中的值要和实体类属性名相同-->
<!--column中的值要跟SQL语句中查询的列名相同-->
<association property="user" javaType="User">
<id column="uid" property="id"></id>
<result column="username" property="username"></result>
<result column="birthday" property="birthday"></result>
<result column="address" property="address"></result>
</association>
</resultMap>
2、一对多映射:订单-----订单详情
接口:
/**
* 查询所有订单信息及订单下的订单明细信息,订单
信息与订单明细为一对多关系
*/
public List<Order> findAllOrderAndOrderDetail();
Mapper映射:
<!-- /** * 查询所有订单信息及订单下的订单明细信息,订单 信息与订单明细为一对多关系 */ public List<Order> findAllOrderAndOrderDetail(); -->
<!-- 这里Order类中有引用属性,所以用resultMap,来调用下面映射--->
<select id="findAllOrderAndOrderDetail" resultMap="orderResultMapAndOrderDetail">
select
u.id "uid",u.username,u.birthday,u.address,
o.id "oid",o.userid,o.orderid,o.createtime,o.note,
od.id "odid",od.itemsnum,od.itemsid
from t_user u,orders o,orderdetail od
where u.id=o.userid and o.id=od.ordersid
</select>
<!-- 继承下面的映射 -->
<resultMap type="Order" id="orderResultMapAndOrderDetail" extends="orderResultMap">
<collection property="orderDetails" ofType="OrderDetail">
<!-- 这里odid是SQL语句id的别名--->
<id column="odid" property="id"></id>
<result column="itemsnum" property="itemNum" />
<!-- 这里属于多对一用association--->
<association property="item" javaType="Items">
<id column="itemsid" property="id"></id>
</association>
</collection>
</resultMap>
<resultMap type="Order" id="orderResultMap">
<id column="oid" property="id"></id>
<result column="orderid" property="orderId"></result>
<result column="createtime" property="createtime"></result>
<result column="note" property="note"></result>
<association property="user" javaType="User">
<id column="uid" property="id"></id>
<result column="username" property="username"></result>
<result column="birthday" property="birthday"></result>
<result column="address" property="address"></result>
</association>
</resultMap>
3、多对多映射:订单和商品
接口:
/**
查询所有用户信息
注意:,关联查询订单及订单明细信息,订单明细信息中关联查询商品信息
*/
public List<User> findAllUserAndOrderAndOrderDetailAndItem();
Mapper映射:
<mapper namespace="cn.neuedu.mybatis.dao.UserMapper">
<!-- /** 查询所有用户信息 注意:,关联查询订单及订单明细信息,订单明细信息中关联查询商品信息 */ -->
<select id="findAllUserAndOrderAndOrderDetailAndItem" resultMap="UserAndOrderAndOrderDetailAndItem">
select u.id "uid",u.username,u.birthday,u.address,
o.id "oid",o.orderid,o.createtime,o.note,
od.id "odid",od.itemsnum,
i.id "iid",i.name,i.price,i.detail
from t_user u,orders o,orderdetail od,items i
where u.id=o.userid
and
o.id=od.ordersid
and
od.itemsid=i.id
</select>
<!-- 映射用户信息 -->
<resultMap type="User" id="UserAndOrderAndOrderDetailAndItem">
<id column="uid" property="id"></id>
<result column="username" property="username"></result>
<result column="birthday" property="birthday"></result>
<result column="address" property="address"></result>
<!-- 关联映射订单 -->
<collection property="orders" ofType="Order">
<id column="oid" property="id"></id>
<result column="orderid" property="orderId"></result>
<result column="createtime" property="createtime"></result>
<result column="note" property="note"></result>
<!-- 关联映射订单明细 -->
<collection property="orderDetails" ofType="OrderDetail">
<id column="odid" property="id"></id>
<result column="itemsnum" property="itemNum"/>
<!-- 关联映射商品 -->
<association property="item" javaType="Items
">
<id column="iid" property="id"></id>
<result column="name" property="name"/>
<result column="price" property="price"/>
<result column="detail" property="detail"/>
</association>
</collection>
</collection>
</resultMap>
</mapper>
欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感谢。