mybatis--高级结果映射之一对一、一对多、多对多

20 篇文章 0 订阅

高级结果映射

一、数据模型分析

1、  明确每张表存储的信息

2、  明确每张表中关键字段(主键、外键、非空)

3、  明确数据库中表与表之间的外键关系

4、  明确业务中表与表的关系(建立在具体的业务)

二、一对一映射

1、需求

查询订单信息,关联查询用户信息

 

2、SQL语句

主信息:orders

从信息:user

SELECT 
  orders.`id`,
  orders.`user_id`,
  orders.`number`,
  user.`username`,
  user.`sex` 
FROM
  orders,
  USER 
WHERE orders.`user_id` = user.`id`

3、使用resultType输出映射

3.1创建扩展类
OrdersExt:
package po;

public class OrdersExt extends Orders{
	
	private String username;
	
	private String sex;

	public String getUsername() {
		return username;
	}

	public void setUsername(String username) {
		this.username = username;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}
	
	

}

Orders:
package po;

import java.util.Date;
import java.util.List;

public class Orders {
    private Integer id;

    private Integer userId;

    private String number;

    private Date createtime;

    private String note;
    
    //订单明细集合
    private List<Orderdetail> detailList;
    
   
 
3.2映射文件
<!-- 一对一映射之resultMap -->
	<select id="findOrdersAndUserRstMap" resultMap="OrdersAndUserRstMap">
		SELECT
		orders.`id`,
		orders.`user_id`,
		orders.`number`,
		user.`username`,
		user.`sex`
		FROM
		orders,
		USER
		WHERE orders.`user_id` = user.`id`
	</select>
3.3Mapper接口
public interface OrdersMapper {
	//一对一映射之resultType
	public List<OrdersExt> findOrdersAndUser();
3.4测试代码
@Test
	public void testFindOrdersAndUser() {
		// 创建OrdersMapper对象
		SqlSession sqlSession = sqlSessionFactory.openSession();

		OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);

		List<OrdersExt> list = mapper.findOrdersAndUser();

		sqlSession.close();
	}
3.5小结

使用resultType来进行一对一结果映射,查询出的列的个数和映射的属性的个数要一致。

而且映射的属性要存在于一个大的对象中,它是一种平铺式的映射,即数据库查询出多少条记录,则映射成多少个对象。

 

4、使用resultMap输出映射

使用resultMap来进行一对一结果映射,它是将关联对象添加到主信息的对象中,具体说是对象嵌套对象的一种映射方式。

4.1修改扩展类
package po;

public class OrdersExt extends Orders{
	
	private String username;
	
	private String sex;
	
	//用户信息
	private User user;

4.2映射文件
<!-- OrdersAndUserRstMap -->
	<resultMap type="com.hcx.mybatis.po.OrdersExt" id="OrdersAndUserRstMap">
		<!-- 订单信息 -->
		<id column="id" property="id" />
		<result column="user_id" property="userId" />
		<result column="number" property="number" />

		<!-- 用户信息(一对一) -->
		<!-- association:一对一关联映射 -->
		<!-- property:关联信息查询的结果将要映射的扩展类中的对象属性名称 -->
		<!-- id标签:建议在关联查询时必须写上,不写不会报错,但是会影响性能 -->
		<association property="user" javaType="com.hcx.mybatis.po.User">
			<id column="user_id" property="id" />
			<result column="username" property="username" />
			<result column="sex" property="sex" />
		</association>
	</resultMap>

	<!-- 一对一映射之resultMap -->
	<select id="findOrdersAndUserRstMap" resultMap="OrdersAndUserRstMap">
		SELECT
		orders.`id`,
		orders.`user_id`,
		orders.`number`,
		user.`username`,
		user.`sex`
		FROM
		orders,
		USER
		WHERE orders.`user_id` = user.`id`
	</select>
4.3Mapper接口
//一对一之resultMap
public List<OrdersExt> findOrdersAndUserRstMap();
4.4测试代码
@Test
	public void testFindOrdersAndUserRstMap() {
		// 创建OrdersMapper对象
		SqlSession sqlSession = sqlSessionFactory.openSession();

		OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);

		List<OrdersExt> list = mapper.findOrdersAndUserRstMap();

		sqlSession.close();
	}

5、小结

在一对一结果映射时,使用resultType更加简单方便,如果有特殊要求(对象嵌套对象)时,需要使用resultMap进行映射,

比如:查询订单列表,然后在点击列表中的查看订单明细按钮,这个时候就需要使用resultMap进行结果映射。

而resultType更适用于查询明细信息,比如,查询订单明细列表。

 

三、一对多映射

1、需求

查询订单信息,关联查询订单明细信息及用户信息


2、SQL语句

主信息:orders

从信息:orderdetail、user

SELECT 
  orders.`id`,
  orders.`user_id`,
  orders.`number`,
  user.`username`,
  user.`sex`,
  orderdetail.`id` detailId,
  orderdetail.`items_id`,
  orderdetail.`items_num` 
FROM
  orders,
  USER,
  orderdetail 
WHERE orders.`user_id` = user.`id` 
  AND orders.`id` = orderdetail.`orders_id`

3、修改扩展类

package po;

import java.util.List;

public class OrdersExt extends Orders{
	
	private String username;
	
	private String sex;
	
	private User user;
	
	///订单明细信息
	private List<Orderdetail> detailList;


Orderdetail:
package po;

public class Orderdetail {
    private Integer id;

    private Integer ordersId;

    private Integer itemsId;

    private Integer itemsNum;
    
    //商品信息
    private Items items;

4、映射文件

<!-- OrdersAndDetailRstMap -->
	<!-- extends:可以继承一个已有的resultMap,指定resultMap的唯一标示即可 -->
	<!-- 注意:继承时,只能继承type类型是一样的resultMap -->
	<resultMap type="com.hcx.mybatis.po.OrdersExt" id="OrdersAndDetailRstMap"
		extends="OrdersAndUserRstMap">
		<!-- 订单明细信息(一对多) -->
		<!-- collection:映射一对多关系 -->
		<!-- property:映射的多的那个集合的属性 -->
		<!--ofType: 集合内的对象的类型 -->
		<collection property="detailList" ofType="com.hcx.mybatis.po.Orderdetail">
			<id column="detailId" property="id" />
			<result column="items_id" property="itemsId" />
			<result column="items_num" property="itemsNum" />
		</collection>

	</resultMap>

	<!-- 一对多映射 -->
	<select id="findOrdersAndDetailRstMap" resultMap="OrdersAndDetailRstMap">
		SELECT
		orders.`id`,
		orders.`user_id`,
		orders.`number`,
		user.`username`,
		user.`sex`,
		orderdetail.`id` detailId,
		orderdetail.`items_id`,
		orderdetail.`items_num`
		FROM
		orders,
		USER,
		orderdetail
		WHERE
		orders.`user_id` = user.`id`
		AND orders.`id` = orderdetail.`orders_id`
	</select>

5、Mapper接口

//一对多
	public List<OrdersExt> findOrdersAndDetailRstMap();

6、测试代码

@Test
	public void testFindOrdersAndDetailRstMap() {
		// 创建OrdersMapper对象
		SqlSession sqlSession = sqlSessionFactory.openSession();

		OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);

		List<OrdersExt> list = mapper.findOrdersAndDetailRstMap();

		sqlSession.close();
	}

四、多对多映射

多对多映射是一对多映射的特例

1、需求

 

查询用户信息,关联查询该用户购买的商品信息

 

2、SQL语句

主信息:user

从信息:items、orders、orderdetail

SELECT 
  orders.`id`,
  orders.`user_id`,
  orders.`number`,
  user.`username`,
  user.`sex`,
  orderdetail.`id` detailId,
  orderdetail.`items_id`,
  orderdetail.`items_num`,
  items.`name`,
  items.`price` 
FROM
  orders,
  USER,
  orderdetail,
  items 
WHERE orders.`user_id` = user.`id` 
  AND orders.`id` = orderdetail.`orders_id` 
  AND orderdetail.`items_id` = items.`id`

3、修改PO类

在User类中添加List<Orders> orders;

 

public class User implements Serializable{
	private int id;
	private String username;// 用户姓名
	private String sex;// 性别
	private Date birthday;// 生日
	private String address;// 地址
	
	//订单信息
	private List<Orders> orders;
	
 

 

在Orders类中添加List<Orderdetail> detailList;

 

public class Orders {
    private Integer id;

    private Integer userId;

    private String number;

    private Date createtime;

    private String note;
    
    //订单明细集合
    private List<Orderdetail> detailList;
    
 

 

在Orderdetail中添加Items items;

 

public class Orderdetail {
    private Integer id;

    private Integer ordersId;

    private Integer itemsId;

    private Integer itemsNum;
    
    //商品信息
    private Items items;
 

 

4、Mapper接口

//多对多
	public List<User> findUserAndItemsRstMap();

5、映射文件

<!-- UserAndItemsRstMap -->
	<resultMap type="com.hcx.mybatis.po.User" id="UserAndItemsRstMap">
		<!-- 用户信息 -->
		<id column="user_id" property="id" />
		<result column="username" property="username" />
		<result column="sex" property="sex" />
		<!-- 订单信息(一对多) -->
		<collection property="orders" ofType="com.hcx.mybatis.po.Orders">
			<id column="id" property="id" />
			<result column="user_id" property="userId" />
			<result column="number" property="number" />
			<!-- 订单明细信息(一对多) -->
			<collection property="detailList" ofType="com.hcx.mybatis.po.Orderdetail">
				<id column="detailId" property="id" />
				<result column="items_id" property="itemsId" />
				<result column="items_num" property="itemsNum" />
				<!-- 商品信息(一对一) -->
				<association property="items" javaType="items">
					<id column="items_id" property="id" />
					<result column="name" property="name" />
					<result column="price" property="price" />
				</association>
			</collection>
		</collection>
	</resultMap>

	<!-- 多对多 -->
	<select id="findUserAndItemsRstMap" resultMap="UserAndItemsRstMap">
		SELECT
		orders.`id`,
		orders.`user_id`,
		orders.`number`,
		user.`username`,
		user.`sex`,
		orderdetail.`id` detailId,
		orderdetail.`items_id`,
		orderdetail.`items_num`,
		items.`name`,
		items.`price`
		FROM
		orders,
		USER,
		orderdetail,
		items
		WHERE orders.`user_id` = user.`id`
		AND orders.`id` =
		orderdetail.`orders_id`
		AND orderdetail.`items_id` = items.`id`
	</select>

6、测试代码

@Test
	public void testFindUserAndItemsRstMap() {
		// 创建OrdersMapper对象
		SqlSession sqlSession = sqlSessionFactory.openSession();

		OrdersMapper mapper = sqlSession.getMapper(OrdersMapper.class);

		List<User> list = mapper.findUserAndItemsRstMap();

		sqlSession.close();
	}

 
 
 
 
 
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值