Mybatis中的高级映射关系实例

一、基本知识
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>

欢迎大家阅读,本人见识有限,写的博客难免有错误或者疏忽的地方,还望各位大佬指点,在此表示感谢。

  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值