我的Mybatis入门(三)一对一和一对多查询

一对一查询(一个订单对应一个用户)

修改Order.class

Order.class添加用户信息

public class Order {
	private int id;
	private int userId;
	private int orderNo;
	private String address;

	private User user;
	
	@Override
	public String toString(){
		return "Order.id:"+id+"Order.userId:"+userId+"Order.orderNo:"+orderNo+"Order.address:"+address+"Order.user:"+user;
	}
}
在OrderMapper.xml中编写一对一(一个订单对应一个用户)sql
<!-- 一对一关系(一个订单对应一个人) -->
	<resultMap type="Order" id="key">
	<!-- 
		id和result都是映射单列值到一个属性或字段的简单数据类型。
		唯一不同的是,id是作为唯一标识的,当和其他对象实例对比的时候,这个id很有用
	 -->
		<id column="id" property="id"/>
		<result column="user_id" property="userId"/>
		<result column="orderNo" property="orderNo"/>
		<result column="address" property="address"/>
		<!-- association :配置一对一属性 -->
		<!-- property:order里面的User属性名 -->
		<!-- javaType:属性类型 -->
		<association property="user" javaType="User">
			<!-- 我的疑惑点:不明白映射关系,到底哪个字段映射到哪个里边 -->
			<!-- 连表查询后,两张表的信息合成一张表c展示,把c表中的单列值user_id映射到user的id属性 -->
			<!-- 如果此处不配置映射关系,下边sql即使写了,查出来也是默认值,因为没映射 -->
			<id column="user_id" property="id"/>
			<result column="name" property="name"/>
			<result column="age" property="age"/>
		</association>
	</resultMap>
	<select id="getAllOrders" resultMap="key">
		select 
		o.id,
		o.user_id,
		o.orderNo, 
		o.address,
		u.id as uid,
		u.name ,
		u.age
		from order2 o left join user2 u 
		on o.user_id = u.id
	</select>

我最开始不明白映射关系,不知道最终bean对象中的数据是怎么映射过来的。

  1. column代表数据库表的列名,property代表bean对象中的属性。从数据库中的column映射到bean对象中对应的属性。result与id作用相同,都是将数据库字段和bean的属性关联起来
  2. 结合相同sql语句在navcat查询的结果(图一)和
<result column="user_id" property="userId"/>
<result column="orderNo" property="orderNo"/>

对比即可明显发现,将user_id跟Order中的userId属性关联;orderNo和Order中的orderNo属性关联,很容易就能搞清楚映射关系了
图一

在OrderMapper.java中添加getAllOrders方法
/**
  * 测试一对一查询
  * */
public List<Order> getAllOrders();
在测试类中添加测试方法
/**
	 * 测试一对一查询
	 */
	@Test
	public void getAllOrder() throws Exception {
		// 基本操作
		InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		SqlSession sqlSession = sqlSessionFactory.openSession();
		// sqlSession获取Mapper
		OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
		List<Order> order = mapper.getAllOrders();
		for (int i = 0; i < order.size(); i++) {
			System.out.println(order.get(i));
		}
	}

查询结果如下
在这里插入图片描述

一对多查询(一个用户多个订单)

User.class添加订单列表
public class User {
	private int id;
	private int age;
	private String name;
	private List<Order> orderList;
	
	@Override
	public String toString() {
		if(orderList!=null &&orderList.size()>0){
			for(int i=0 ;i<orderList.size();i++){
				System.out.println(orderList.get(i).toString());
			}
		}
		return "id:" + id + "name:" + name + "age:" + age;
	}
}
修改OrderMapper.xml文件
<!-- 一个人对应多个订单 -->
	<resultMap type="User" id="key2">
		<!-- sql语句给user的id起了一个别名叫uid。此处就可以把user的id映射到User对象的id中,而不必担心与Order的id冲突 -->
		<id column="uid" property="id"/>
		<result column="name" property="name"/>
		<result column="age" property="age"/>
		<!-- property对应bean对象中List<Order> 属性, -->
		<collection property="orderList" javaType="List" ofType="Order">
			<id column="id" property="id"/>
			<result column="user_id" property="userId"/>
			<result column="orderNo" property="orderNo"/>
			<result column="address" property="address"/>
		</collection>
	</resultMap>
	
	<select id="getUsers" resultMap="key2">
		select 
		u.id as uid,
		u.name ,
		u.age,
		o.id,
		o.user_id,
		o.orderNo, 
		o.address
		from user2 u left join  order2 o
		on o.user_id = u.id
	</select>
  • 注意:此处有个细节点,多表查询的时候很容易出现重复字段,比如id,navcat会默认添加id(1),如下图二所示。这样不方便我们编写映射关系。大神告诉我可以给重复字段起别名,比如u.id as uid,这样就避免了字段重复,方便我们编写映射关系了如图三。
    图二
    图三
在OrderMapper.java中添加getAllOrders方法
/**
  * 测试一对多查询(一个用户多个订单)
  * */
public List<User> getUsers();
在测试类中添加测试方法
/**
  * 测试一对多查询
  */
@Test
public void getAllUsers() throws Exception {
	// 基本操作
	InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
	SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
	SqlSession sqlSession = sqlSessionFactory.openSession();
	// sqlSession获取Mapper
	OrderMapper mapper = sqlSession.getMapper(OrderMapper.class);
	List<User> order = mapper.getUsers();
	for (int i = 0; i < order.size(); i++) {
		System.out.println(order.get(i));
	}
}

查询结果如下
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值