006 mybatis关联查询(一对一、一对多)
文章目录
- 一对一查询
- SQL语句
- 方法一:resultType
- 方法二:resultMap
- 创建扩展po类
- Mapper映射文件
- Mapper接口
- 测试代码
- 小结
- 一对多查询
- SQL语句
- 修改po类
- Mapper映射文件
- Mapper接口
- 测试代码
注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发,关联查询用户信息为一对一查询。如果从用户信息出发,查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。
一对一查询
需求
查询所有订单信息,关联查询下单用户信息。
SQL语句
SELECT
orders.*,
user.username,
user.address
FROM
orders LEFT JOIN user
ON orders.user_id = user.id
主信息:订单信息
从信息:用户信息
方法一:resultType
方法二:resultMap
使用resultMap进行结果映射,定义专门的resultMap用于映射一对一查询结果。
创建扩展po类
创建OrdersExt类(该类用于结果集封装),加入User属性,user属性中用于存储关联查询的用户信息,因为订单关联查询用户是一对一关系,所以这里使用单个User对象存储关联查询的用户信息。
public class OrdersExt extends Orders {
private User user;// 用户对象
// get/set。。。。
}
Mapper映射文件
<!-- 查询订单关联用户信息使用resultmap -->
<resultMap type="OrdersExt" id="ordersAndUserRstMap">
<id column="id" property="id"/>
<result column="user_id" property="userId"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
<!-- 一对一关联映射 -->
<!--
property:Orders对象的user属性
javaType:user属性对应 的类型
-->
<association property="user" javaType="com.xd.mybatis.po.User">
<!-- column:user表的主键对应的列 property:user对象中id属性-->
<id column="user_id" property="id"/>
<result column="username" property="username"/>
<result column="address" property="address"/>
</association>
</resultMap>
<select id="findOrdersAndUserRstMap" resultMap="ordersAndUserRstMap">
SELECT
o.id,
o.user_id,
o.number,
o.createtime,
o.note,
u.username,
u.address
FROM
orders o
JOIN `user` u ON u.id = o.user_id
</select>
association:表示进行一对一关联查询映射
property:表示关联查询的结果存储在com.kkb.mybatis.po.Orders的user属性中
javaType:表示关联查询的映射结果类型
Mapper接口
在UserMapper接口中,添加以下接口方法:
public List<OrdersExt> findOrdersAndUserRstMap() throws Exception;
测试代码
public void testfindOrdersAndUserRstMap()throws Exception{
//获取session
SqlSession session = sqlSessionFactory.openSession();
//获限mapper接口实例
UserMapper userMapper = session.getMapper(UserMapper.class);
//查询订单信息
List<OrdersExt> list = userMapper.findOrdersAndUserRstMap();
System.out.println(list);
//关闭session
session.close();
}
小结
使用resultMap进行结果映射时,具体是使用association完成关联查询的映射,将关联查询信息映射到pojo对象中。
一对多查询
需求
查询所有用户信息及用户关联的订单信息。
SQL语句
SELECT
u.*,
o.id oid,
o.number,
o.createtime,
o.note
FROM
`user` u
LEFT JOIN orders o ON u.id = o.user_id
主信息:用户信息
从信息:订单信息
分析
在一对多关联查询时,只能使用resultMap进行结果映射。
1、一对多关联查询时,sql查询结果有多条,而映射对象是一个。
2、resultType完成结果映射的方式的一条记录映射一个对象。
3、resultMap完成结果映射的方式是以[主信息]为主对象,[从信息]映射为集合或者对象,然后封装到主对象中。
修改po类
在User类中加入List orders属性
private List<Orders> orders;
Mapper映射文件
在UserMapper.xml文件中,添加以下代码:
<resultMap type="user" id="userAndOrderRstMap">
<!-- 用户信息映射 -->
<id property="id" column="id"/>
<result property="username" column="username"/>
<result property="birthday" column="birthday"/>
<result property="sex" column="sex"/>
<result property="address" column="address"/>
<!-- 一对多关联映射 -->
<collection property="orders" ofType="orders">
<id property="id" column="oid"/>
<result property="userId" column="id"/>
<result property="number" column="number"/>
<result property="createtime" column="createtime"/>
<result property="note" column="note"/>
</collection>
</resultMap>
<select id="findUserAndOrderRstMap" resultMap="userAndOrderRstMap">
SELECT
u.*,
o.id oid,
o.number,
o.createtime,
o.note
FROM
`user` u
LEFT JOIN orders o ON u.id = o.user_id
</select>
Collection标签:定义了一对多关联的结果映射。
property=“orders”**:关联查询的结果集存储在User对象的上哪个属性。
ofType=“orders”**:指定关联查询的结果集中的对象类型即List中的对象类型。此处可以使用别名,也
可以使用全限定名。
Mapper接口
public List<User> findUserAndOrdersRstMap() throws Exception;
测试代码
@Test
public void testFindUserAndOrdersRstMap() {
SqlSession session = sqlSessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
List<User> result = userMapper.findUserAndOrdersRstMap();
for (User user : result) {
System.out.println(user);
}
session.close();
}