如果使用多表查询,那么表之间一定有这三种关系:
使用MyBatis实现多表查询,根据表与表之间的关系不同,具体实现就会有些不同
首先分析问题:
使用resultMap标签手动映射时,它里面还有一个association子标签,
association:联合标签
案例:查询出订单的信息,并且包含该订单的用户信息
public class OrderVo {
private Integer id;
private Integer uid;
private String number;
private Timestamp createtime;
private String des;
private User user;//订单中的用户信息可以放在这个user属性中
}
<select id="findOrderUserList" resultMap="resultMap_order_user">
SELECT o.id,o.uid,o.number,o.createtime,o.des,u.id,u.username
FROM t_orders o JOIN t_user u ON o.uid=u.id
select>
<resultMap id="resultMap_order_user" type="ordervo">
<id column="id" property="id"/>
<result column="uid" property="uid"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<association property="user" javaType="User">
<id column="id" property="id"/>
<result column="username" property="username"/>
association>
resultMap>
使用association标签,将属于用户的字段放入order对象的user属性中
一对多的关系,只需要给第一个表中对应的POJO准备一个放多个第二个表中POJO对象的列表即可
这样第一个表中对应第二个表中的多条数据就可以存放在这个list中
这时就不能使用association标签了,resultMap标签中还有另一个collection子标签
collection:
案例:查询出所有用户,并且包含每个用户的所有订单信息
public class User {
private Integer id;
private String username;
private String password;
private String email;
private String remark;
private List<OrderVo> orderList;
}
<select id="findUserOrder" resultMap="result_user_orders">
SELECT u.id as uid,u.username,u.password,u.email,u.remark,o.id,o.uid,o.des
FROM t_user u INNER JOIN t_orders o ON u.id=o.uid
select>
<resultMap id="result_user_orders" type="User">
<id column="uid" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="email" property="email"/>
<result column="remark" property="remark"/>
<collection property="orderList" ofType="OrderVo">
<id property="id" column="id"/>
<result property="uid" column="uid"/>
<result property="des" column="des"/>
collection>
resultMap>
collection标签可以将属于订单的字段放到一个OrderVo对象中,再将该用户的所有Order放到user的orderList属性中
要实现多对多的关系,那么一定会有一个第三张表作为关系表
我们要把多对多的关系理解为一个双向的一对多:表一中的一条数据对应关系表中的多条记录,表二中的一条数据也对应关系表中的多条记录
两个POJO中分别包含对方对象List的引用
案例:查询每一个角色分别对应哪些用户
(一个用户可以有多个角色,一个角色中可以有多个用户)
public class Role {
private Integer id;
private String name;
private String keyword;
private List<User> userList;
}
<select id="findRoleUserList" resultMap="result_role_users">
SELECT r.id as rid,r.name,r.keyword,u.id as uid,u.username,u.password,u.email
FROM t_role r LEFT JOIN t_role_user ru ON r.id=ru.role_id
LEFT JOIN t_user u ON ru.user_id=u.id
select>
<resultMap id="result_role_users" type="role">
<id column="rid" property="id"/>
<result column="name" property="name"/>
<result column="keyword" property="keyword"/>
<collection property="userList" ofType="User">
<id column="id" property="uid"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="email" property="email"/>
collection>
resultMap>
既然是对多的关系,那么同样,也可以:
查询每一个用户都有哪些角色信息
public class User {
private Integer id;
private String username;
private String password;
private String email;
private String remark;
private List<Role> roleList;
}
<select id="findUserRoleList" resultMap="result_user_roles">
SELECT u.id as uid,u.username,u.password,u.email,u.remark,r.id as rid,r.name,r.keyword
WHERE t_user u LEFT JOIN t_role_user ru ON u.id=ru.user_id
LEFT JOIN t_role r ON ru.role_id=r.id
select>
<resultMap id="result_user_roles" type="user">
<id column="uid" property="id"/>
<result column="username" property="username"/>
<result column="password" property="password"/>
<result column="email" property="email"/>
<result column="remark" property="remark"/>
<collection property="roleList" ofType="role">
<id column="rid" property="id"/>
<result column="name" property="name"/>
<result column="keyword" property="keyword"/>
collection>
resultMap>
总结: