Mybatis的关联查询,一对一可以通过<association>实现,一对多和多对多通过<collection>实现。
一. 一对一的关联查询
对user_t表和book_t表进行连接查询。sql语句类似如下:
select b.book_id,b.name,b.publishers,a.id,a.user_name
from user_t a
inner join book_t b on b.book_id=a.id
在User类中添加Book类的对象,还要加上getter()和setter(),以便在UserMapper.xml中进行映射。如下示:
public class User { private Integer id; private String userName; private String password; private Integer age;
//添加Book对象,还有getter(),setter()方法 private Book book; public Book getBook() { return book; } public void setBook(Book book) { this.book = book; } //以下还有其他的getter(),setter(),本文忽略不写 // ...... }
UserMapper.xml如下示:
在<resultMap>中,数据表user_t的字段映射User对象的属性。
<id>表示主键,<result>里面是其他字段。
而其中的 <association> 中的property,对应在User类中新添加的Book类对象属性
<!--新建resultMap,其中的<id>为主键,--> <resultMap id="userIdMap" type="com.model.User" > <id column="id" property="id"/> <result column="user_name" property="userName" /> <!-- association 中的property对应User类中新添加的Book类对象属性 --> <association property="book" javaType="com.model.Book"> <result column="book_id" property="bookId" /> <result column="name" property="name" /> <result column="publishers" property="publishers" /> </association> </resultMap> <!-- 根据id连接user表和book表,结果映射为上面新建的resultMap --> <select id="selectBookInfoByUserId" resultMap="userIdMap"> select b.book_id,b.name,b.publishers,a.id,a.user_name from user_t a inner join book_t b on b.book_id=a.id </select>
二、一对多的关联查询
一个User拥有多个Role。查看某个用户拥有哪些角色的sql语句,类似如下:
SELECT a.userName,a.name,b.uid,b.role_id FROM user_info a
INNER JOIN sys_user_role b
ON a.uid=b.uid
WHERE a.userName="admin"
同样的,在User类中添加roleIdList类的对象,还要加上getter()和setter(),以便在UserMapper.xml中进行映射如下所示:
public class User { private String uid; //帐号 private String userName; //名称 private String name; //密码 private String password; //添加roleIdList属性和对应的getter(),setter() private List<SysUserRole> roleIdList; public List<SysUserRole> getRoleIdList() { return roleIdList; } public void setRoleIdList(List<SysUserRole> roleIdList) { this.roleIdList = roleIdList; } }
在UserMap添加如下:
<!-- 一对多关联查询 --> <resultMap id="userRoleIdMap" type="com.example.demo.pojo.User" > <id column="uid" property="uid" /> <result column="userName" property="userName" /> <result column="password" property="password" /> <collection property="roleIdList" ofType="com.example.demo.pojo.SysUserRole" > <id column="role_id" property="roleId"/> <result column="uid" property="uid" /> </collection> </resultMap> <select id="findRoleIdByUserName" resultMap="userRoleIdMap" parameterType="java.lang.String"> SELECT a.userName,a.name,b.uid,b.role_id FROM user_info a INNER JOIN sys_user_role b ON a.uid=b.uid WHERE a.userName=#{userName} </select>
三、多对多查询
1.需求
查询用户及用户购买的商品信息。
2.sql语句
查询主表:用户表
关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所有关联表:orders、orderdetail、items。
SELECT
orders.*,
USER.username, USER.sex, USER.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id, items.name items_name, items.detail items_detail, items.price items_price FROM orders, USER, orderdetail, items WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id AND orderdetail.items_id = items.id
3.映射思路
将用户信息映射到user中。
在User类中添加订单列表属性List<Orders> orderslist,将用户创建的订单映射到orderslist;
在Orders中田间订单明细列表属性List<OrderDetail> orderdetails,将订单的明细映射到orderdetails;
在OrderDetail中添加Items属性,将订单明细所对应的商品映射到Items。
4. mapper.xml
<select id="findUserAndItemsResultMap" resultMap="UserAndItemsResultMap"> SELECT orders.*, USER.username, USER.sex, USER.address, orderdetail.id orderdetail_id, orderdetail.items_id, orderdetail.items_num, orderdetail.orders_id, items.name items_name, items.detail items_detail, items.price items_price FROM orders, USER, orderdetail, items WHERE orders.user_id = user.id AND orderdetail.orders_id=orders.id AND orderdetail.items_id = items.id </select>
5.定义resultMap
<!-- 查询用户及购买商品 -->
<resultMap type="joanna.yan.mybatis.entity.User" id="UserAndItemsResultMap"> <!-- 1.用户信息 --> <id column="user_id" property="id"/> <result column="username" property="username"/> <result column="sex" property="sex"/> <result column="address" property="address"/> <!-- 2.订单信息 --> <!-- 一个用户对应多个订单,使用collection映射 --> <collection property="ordersList" ofType="joanna.yan.mybatis.entity.Orders"> <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"/> <!-- 3.订单明细 --> <!-- 一个订单包括多个明细 --> <collection property="orderdetails" ofType="joanna.yan.mybatis.entity.Orderdetail"> <id column="orderdetail_id" property="id"/> <result column="items_id" property="itemsId"/> <result column="items_num" property="itemsNum"/> <result column="orders_id" property="ordersId"/> <!-- 4.商品信息 --> <!-- 一个订单明细对应一个商品 --> <association property="items" javaType="joanna.yan.mybatis.entity.Items"> <id column="items_id" property="id"/> <result column="items_name" property="name"/> <result column="items_detail" property="detail"/> <result column="items_price" property="price"/> </association> </collection> </collection> </resultMap>
6.mapper.java
public interface OrdersCustomMapper {
//查询订单,关联查询用户信息
public List<OrdersCustom> findOrdersUser() throws Exception; //查询订单,关联查询用户信息,使用resultMap public List<Orders> findOrdersUserResultMap() throws Exception; //查询订单(关联用户)及订单明细 public List<Orders> findOrdersAndOrderDetailResultMap() throws Exception; //查询用户购买商品信息 public List<User> findUserAndItemsResultMap() throws Exception; }
更多详情,参考博客 :https://www.cnblogs.com/Joanna-Yan/p/6923464.html