Mybatis框架|高级映射查询|一对多


一、resultMap实现一对多映射

需求查询某一个用户的所有信息及其订单的编号和订单的创建日期
对应sql语句为:
SELECTuser.id,user.username,user.sex,user.address,user.birthday,orders.idreders_id,orders.number,orders.creattime FROM USER LEFT JOIN orders ON user.id=orders.user_id WHERE user.id=1;

在这里插入图片描述

1. 两张表的pojo

在User表的pojo中加入了一个Orders的链表,将订单对象封装到了User对象中。

User表的pojo。

package com.gql.pojo;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
 * 类说明:
 *		User_JavaBean
 * @guoqianliang1998.
 */
public class User implements Serializable{

	private static final long serialVersionUID = 1L;
	private int id;
	private String username;
	private String sex;
	private String address;
	private Date birthday;
	//用户关联多个订单对象
	private List<Orders> orderList;
	
	public List<Orders> getOrderList() {
		return orderList;
	}
	public void setOrderList(List<Orders> orderList) {
		this.orderList = orderList;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	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;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
}

Orders表的pojo。

package com.gql.pojo;

import java.io.Serializable;
import java.util.Date;

/**
 * 类说明:
 *		Orders_JavaBean
 * @guoqianliang1998.
 */
public class Orders implements Serializable{

	private static final long serialVersionUID = 1L;
	private int id;
	private Date creattime;
	private String number;
	private int user_id;
	private int count;
	private User user;
	
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public Date getCreattime() {
		return creattime;
	}
	public void setCreattime(Date creattime) {
		this.creattime = creattime;
	}
	public String getNumber() {
		return number;
	}
	public void setNumber(String number) {
		this.number = number;
	}
	public int getUser_id() {
		return user_id;
	}
	public void setUser_id(int user_id) {
		this.user_id = user_id;
	}
	public int getCount() {
		return count;
	}
	public void setCount(int count) {
		this.count = count;
	}
}

2.dao层接口

package com.gql.mapper;
import java.util.List;
import com.gql.pojo.Orders;
import com.gql.pojo.User;

/**
 * 类说明:
 *		Orders订单的dao层接口
 * @guoqianliang1998.
 */
public interface OrdersMapper {

	//一对多查询某一个用户
	User getUserById(int id);
}

3.dao层xml配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gql.mapper.OrdersMapper">

	<select id="getUserById" parameterType="int" resultMap="getUserByIdResultMap">
		SELECT 
		user.id,
		user.username,
		user.sex,
		user.address,
		user.birthday,
		orders.id reders_id,
		orders.number,
		orders.creattime
		FROM USER
		LEFT JOIN orders ON user.id=orders.user_id
		WHERE user.id=#{id};
	</select>
	<resultMap type="com.gql.pojo.User" id="getUserByIdResultMap">
		<id column="id" property="id"/>
		<result column="username" property="username"></result>
		<result column="sex" property="sex"></result>
		<result column="address" property="address"></result>
		<result column="birthday" property="birthday"></result>
		<collection property="orderList" ofType="com.gql.pojo.Orders">
			<id column="orders_id" property="id"/>
			<result column="number" property="number"></result>
			<result column="creattime" property="creattime"></result>
		</collection>
	</resultMap>
</mapper>

4.使用resultMap实现一对多测试

package com.gql.mapper;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import com.gql.mapper.custom.OrdersMapperCustom;
import com.gql.pojo.Orders;
import com.gql.pojo.User;
import com.gql.pojo.custom.OrdersCustom;

public class OrderMapperTest {
	private SqlSessionFactory sqlSessionFactory;
	@Before
	public void init() throws IOException{
		String resource = "mybatis-config.xml";
		InputStream in = Resources.getResourceAsStream(resource);
		sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);		
	}

	@Test
	public void testGetUserById(){
		SqlSession session = sqlSessionFactory.openSession();
		OrdersMapper mapper = session.getMapper(OrdersMapper.class);
		User user = mapper.getUserById(1);
		System.out.println(user.getOrderList().size());
	}
}

成功打印出对象的链表属性的大小为3,说明成功将3个订单绑定到一个用户上。

DEBUG [main] - ==>  Preparing: SELECT user.id, user.username, user.sex, user.address, user.birthday, orders.id reders_id, orders.number, orders.creattime FROM USER LEFT JOIN orders ON user.id=orders.user_id WHERE user.id=?; 
DEBUG [main] - ==> Parameters: 1(Integer)
DEBUG [main] - <==      Total: 3

在debug界面也可以看到成功绑定:
在这里插入图片描述

发布了413 篇原创文章 · 获赞 1081 · 访问量 23万+

猜你喜欢

转载自blog.csdn.net/weixin_43691058/article/details/104293634