Mybatis 关联查询(一对一与一对多)

数据库表与表之间的关系:

Mybatis 关联查询(一对一与一对多)_第1张图片

1、一对一查询

需求:查询所有订单信息,关联查询下单用户信息。

注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询。如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。

sql语句:

SELECT
	o.id,
	o.user_id userId,
	o.number,
	o.createtime,
	o.note,
	u.username,
	u.address
FROM
	`order` o
LEFT JOIN `user` u ON o.user_id = u.id

 1.1 方法一:使用resultType

        使用resultType,改造订单pojo类,此pojo类中包括了订单信息和用户信息,这样返回对象的时候,mybatis自动把用户信息也注入进来了。

1.1.1 改造pojo类

OrderUser类继承Order类后OrderUser类包括了Order类的所有字段,只需要定义用户的信息字段即可,如下图:

Mybatis 关联查询(一对一与一对多)_第2张图片

1.1.2 Mapper.xml,在UserMapper.xml添加sql,如下:


1.1.3 Mapper接口:在UserMapper接口添加方法,如下图:

Mybatis 关联查询(一对一与一对多)_第3张图片

1.1.4 测试方法:在UserMapperTest添加测试方法,如下

@Test
public void testQueryOrderUser() {
	// mybatis和spring整合,整合之后,交给spring管理
	SqlSession sqlSession = this.sqlSessionFactory.openSession();
	// 创建Mapper接口的动态代理对象,整合之后,交给spring管理
	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

	// 使用userMapper执行根据条件查询用户
	List list = userMapper.queryOrderUser();

	for (OrderUser ou : list) {
		System.out.println(ou);
	}

	// mybatis和spring整合,整合之后,交给spring管理
	sqlSession.close();
}

1.1.5 结果

Mybatis 关联查询(一对一与一对多)_第4张图片

1.2 方法二:使用resultMap

使用resultMap,定义专门的resultMap用于映射一对一查询结果。

1.2.1 改造pojo类

在Order类中加入User属性,user属性中用于存储关联查询的用户信息,因为订单关联查询用户是一对一关系,所以这里使用单个User对象存储关联查询的用户信息。改造Order如下图:

Mybatis 关联查询(一对一与一对多)_第5张图片

1.2.2 Mapper.xml,这里resultMap指定orderUserResultMap,如下:


	
	
	
	
	
	
	
	
	
		
		
		
		
	


1.2.3 Mapper接口:编写UserMapper如下图:

Mybatis 关联查询(一对一与一对多)_第6张图片

1.2.4 测试

@Test
public void testQueryOrderUserResultMap() {
	// mybatis和spring整合,整合之后,交给spring管理
	SqlSession sqlSession = this.sqlSessionFactory.openSession();
	// 创建Mapper接口的动态代理对象,整合之后,交给spring管理
	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

	// 使用userMapper执行根据条件查询用户
	List list = userMapper.queryOrderUserResultMap();

	for (Order o : list) {
		System.out.println(o);
	}

	// mybatis和spring整合,整合之后,交给spring管理
	sqlSession.close();
}

1.2.5 结果

Mybatis 关联查询(一对一与一对多)_第7张图片

2 一对多查询

案例:查询所有用户信息及用户关联的订单信息。

用户信息和订单信息为一对多关系。

sql语句:

SELECT
	u.id,
	u.username,
	u.birthday,
	u.sex,
	u.address,
	o.id oid,
	o.number,
	o.createtime,
	o.note
FROM
	`user` u
LEFT JOIN `order` o ON u.id = o.user_id

2.1 改造pojo类

在User类中加入List orders属性,如下图:

Mybatis 关联查询(一对一与一对多)_第8张图片

2.2 Mapper.xml,在UserMapper.xml中添加sql,如下:


	
	
	
	
	

	
	
		
		
		
		
		
	



2.3 Mapper接口,编写UserMapper接口,如下:
Mybatis 关联查询(一对一与一对多)_第9张图片

2.4 测试方法,在UserMapperTest增加测试方法,如下

@Test
public void testQueryUserOrder() {
	// mybatis和spring整合,整合之后,交给spring管理
	SqlSession sqlSession = this.sqlSessionFactory.openSession();
	// 创建Mapper接口的动态代理对象,整合之后,交给spring管理
	UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

	// 使用userMapper执行根据条件查询用户
	List list = userMapper.queryUserOrder();

	for (User u : list) {
		System.out.println(u);
	}

	// mybatis和spring整合,整合之后,交给spring管理
	sqlSession.close();
}

2.5 结果

Mybatis 关联查询(一对一与一对多)_第10张图片

你可能感兴趣的:(Java,EE,mybatis,一对一,一对多,关联查询)