Mybatis---关联查询

商品订单数据模型

在这里插入图片描述

一对一查询

通过订单信息查询订单和用户信息,因为一个订单只能属于一个用户,所以属于一对一查询。

前期准备

使用resultType的思路

创建一个pojo并继承order类,在写上user类的一些属性
在这里插入图片描述

  1. 编写mapper.xml
  2. 编写mapper.java接口
  3. 编写测试方法
  4. 测试

使用resultMap的思路

  1. 在order类中添加user类的属性

在这里插入图片描述

  1. 编写mapper.xml
  2. 编写mapper.java接口
  3. 编写测试方法
  4. 测试

代码

使用resultType

实体类(UserOrder.java):

package www.tl.entity;
public class OrderUser extends Order {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Integer id;
	private String username;
	private String address;
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public static long getSerialversionuid() {
		return serialVersionUID;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "OrderUser ["+"id="+id+", username=" + username + ", address=" + address + "id=" + super.id +  ", number=" + super.number + ", createtime=" + super.createtime
				+ "]";
	}
}

mapper.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">
<!-- namespace:命名空间,用于隔离,使用动态代理开发,与UserMapper接口的类路径一致 -->
<mapper namespace="www.tl.dao.OrderUserMapper">
	<!-- 一对多查询  -->
	<select id="queryOrderUser" resultType="OrderUser">
		select o.id,u.id,u.username,o.number,u.address,o.createtime
		from orders o left join user u
		on o.user_id = u.id
	</select>
</mapper>

接口(mapper.java)

package www.tl.dao;
import java.util.List;
import www.tl.entity.OrderUser;
public interface OrderUserMapper {	
	public List<OrderUser> queryOrderUser();
}

测试方法

package www.tl.daotest;
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 www.tl.dao.OrderUserMapper;
import www.tl.entity.OrderUser;

public class OrderUserTest {
	private SqlSessionFactory sqlSessionFactory;
	@Before
	public void  init() throws Exception {
		/*加载资源文件*/
		String resource = "SqlMapConfig.xml";
		InputStream resourceAsStream = Resources.getResourceAsStream(resource);
		/*创建SqlSessionFactoryBuilder*/
		SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
		/*创建SqlSessionFactory*/
		this.sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);	
	}
	@Test
	public void queryOrderUser() {
		/*创建会话(sqlSession)*/
		SqlSession sqlSession = this.sqlSessionFactory.openSession();
		/*创建OrderMapper*/
		OrderUserMapper orderUserMapper = sqlSession.getMapper(OrderUserMapper.class);
		/*调用sql并输出结果*/
		List<OrderUser> list = orderUserMapper.queryOrderUser();
		for (OrderUser orderUser : list) {
			System.out.println(orderUser);
		}
		sqlSession.close();
	}	
}

使用resultMap

实体类(order.java)

package www.tl.entity;
import java.io.Serializable;
import java.util.Date;
public class Order implements Serializable{
    /**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	public Integer id;
	public Integer userId;
	public String number;
	public Date createtime;
	public String note;
	private User user;
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number == null ? null : number.trim();
    }

    public Date getCreatetime() {
        return createtime;
    }

    public void setCreatetime(Date createtime) {
        this.createtime = createtime;
    }

    public String getNote() {
        return note;
    }

    public void setNote(String note) {
        this.note = note == null ? null : note.trim();
    }
    
	public User getUser() {
		return user;
	}

	public void setUser(User user) {
		this.user = user;
	}

	@Override
	public String toString() {
		return "Order [id=" + id + ", userId=" + userId + ", number=" + number + ", createtime=" + createtime
				+ ", note=" + note + ", user=" + user + "]";
	}	          
}

Mapper.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">
<!-- namespace:命名空间,用于隔离,使用动态代理开发,与UserMapper接口的类路径一致 -->
<mapper namespace="www.tl.dao.OrderMapper">
	<!-- 一对一查询 -->
	<resultMap type="Order" id="OrderUserResultMap">
		<!-- 声明主键  -->
		<id property="id" column="id"/>
		<result property="userId" column="user_id"/>
		<result property="number" column="number"/>
		<result property="createtime" column="createtime"/>
		<!-- 配置一对一属性
			 property:Order类里的User属性名
			 javaType:属性类型 -->
		<association property="user" javaType="User">
			<!-- 声明主键 表示user_id是关联查询对象的唯一标识,列名的确定不来自于数据表而来自于查询语句 -->
			<id property="id" column="user_id"/>
			<result property="username" column="username"/>
			<result property="address" column="address"/>
		</association>
	</resultMap>
	<select id="queryOrderUser" resultMap="OrderUserResultMap">
		select o.id,o.user_id,o.number,o.createtime,u.username,u.address
		from orders o left join user u
		on o.user_id = u.id
	</select>
</mapper>

接口(Mapper.java)

package www.tl.dao;
import java.util.List;
import www.tl.entity.Order;
import www.tl.entity.User;
public interface OrderMapper {
	public List<Order> queryOrderUser();
}

测试方法

package www.tl.daotest;
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 www.tl.dao.OrderMapper;
import www.tl.dao.UserMapper;
import www.tl.entity.Order;

public class OderTest {
	private SqlSessionFactory sqlSessionFactory;
	@Before
	public void  init() throws Exception {
		/*加载资源文件*/
		String resource = "SqlMapConfig.xml";
		InputStream resourceAsStream = Resources.getResourceAsStream(resource);
		/*创建SqlSessionFactoryBuilder*/
		SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
		/*创建SqlSessionFactory*/
		this.sqlSessionFactory = sqlSessionFactoryBuilder.build(resourceAsStream);
		
		
	}
	
	@Test
	public void queryOrderUser() {
		/*创建会话(sqlSession)*/
		SqlSession sqlSession = this.sqlSessionFactory.openSession();
		/*创建OrderMapper*/
		OrderMapper orderMapper = sqlSession.getMapper(OrderMapper.class);
		/*调用sql并输出结果*/
		List<Order> list = orderMapper.queryOrderUser();
		for (Order order : list) {
			System.out.println(order);
		}
	}
	
}

一对多查询

在这里插入图片描述

通过用户信息查询订单信息,一个用户可以有多个订单,所以采用一对多查询。

开发思路

  1. 在user类中添加order类属性(因为是一对多查询,返回的一定是个结果集,最好用集合进行封装)
    在这里插入图片描述
  2. 编写mapper.xml
  3. 编写mapper.java接口
  4. 编写测试方法
  5. 测试

代码

实体类(User.java)

package www.tl.entity;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
public class User implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private Integer id;
	private String username;
	private String sex;
	private Date birthday;
	private String address;
	private List<Order> order;

	public List<Order> getOrder() {
		return order;
	}
	public void setOrder(List<Order> order) {
		this.order = order;
	}
	public Integer getId() {
		return id;
	}
	public void setId(Integer 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 Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", sex=" + sex + ", birthday=" + birthday + ", address="
				+ address + ", order=" + order + "]";
	}
}

mapper.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">
<!-- namespace:命名空间,用于隔离,使用动态代理开发,与UserMapper接口的类路径一致 -->
<mapper namespace="www.tl.dao.UserMapper">
	<!--一对多查询  -->
	<resultMap type="User" id="UserOrderResultMap">
		<id property="id" column="id"/>
		<result property="username" column="username"/>
		<result property="address" column="address"/>
		<!-- 一对多关联 
			property:Usre类中order属性
			javaType:java泛型
			ofType:list集合里的数据类型
		 -->
		<collection property="order" javaType="List" ofType="Order">
			<id property="userId" column="user_id"/>
			<result property="number" column="number"/>
			<result property="createtime" column="createtime"/>
		</collection>
	</resultMap>
	<select id="queryUserOrders" resultMap="UserOrderResultMap">
		select u.id,u.username,u.address,o.number,o.createtime
		from user u left join orders o
		on u.id=o.user_id
	</select>
</mapper>

接口(mapper.java)

package www.tl.dao;
import java.util.List;
import www.tl.entity.QueryVo;
import www.tl.entity.User;
public interface UserMapper {
	public List<User> queryUserOrders();
}

测试方法

package www.tl.daotest;
import java.io.InputStream;
import java.util.ArrayList;
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 www.tl.dao.UserMapper;
import www.tl.entity.QueryVo;
import www.tl.entity.User;

public class MapperTest {

	private SqlSessionFactory sqlSessionFactory;
	@Before
	public void init()throws Exception {
		/*加载资源*/
		String resource = "SqlMapConfig.xml";
		InputStream ins = Resources.getResourceAsStream(resource);
		/*创建SqlSessionFactoryBulider*/
		SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
		/*创建SqlSessionFactory*/
		this.sqlSessionFactory = sqlSessionFactoryBuilder.build(ins);
	}
	
	@Test
	public void queryUserOrders() {
		SqlSession sqlSession = this.sqlSessionFactory.openSession();
		UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
		List<User> users = userMapper.queryUserOrders();
		for (User user : users) {
			System.out.println(user);
		}
		
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值