共计 6396 个字符,预计需要花费 16 分钟才能阅读完成。
本篇文章给大家分享的是有关 Mybatis_day05 中怎么实现关联查询,丸趣 TV 小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着丸趣 TV 小编一起来看看吧。
关联查询
一对一查询
案例:查询所有订单信息,关联查询下单用户信息。
注意:因为一个订单信息只会是一个人下的订单,所以从查询订单信息出发关联查询用户信息为一对一查询。如果从用户信息出发查询用户下的订单信息则为一对多查询,因为一个用户可以下多个订单。
方法一:
使用 resultType,定义订单信息 po 类,此 po 类中包括了订单信息和用户信息:
Sql 语句:
SELECT orders.*, user.username, userss.address FROM orders, user WHERE orders.user_id = user.id
定义 po 类
Po 类中应该包括上边 sql 查询出来的所有字段,如下:
public class OrdersCustom extends Orders { private String username;// 用户名称 private String address;// 用户地址 get/set。。。。 OrdersCustom 类继承 Orders 类后 OrdersCustom 类包括了 Orders 类的所有字段,只需要定义用户的信息字段即可。
Mapper.xml
!-- 查询所有订单信息 -- select id= findOrdersList resultType= com.pp.mybatis.po.OrdersCustom SELECT orders.*, user.username, user.address FROM orders, user WHERE orders.user_id = user.id
/select
Mapper 接口:
public List OrdersCustom findOrdersList() throws Exception; 测试: Public void testfindOrdersList()throws Exception{ // 获取 session SqlSession session = sqlSessionFactory.openSession(); // 获限 mapper 接口实例 UserMapper userMapper = session.getMapper(UserMapper.class); // 查询订单信息 List OrdersCustom list = userMapper.findOrdersList(); System.out.println(list); // 关闭 session session.close(); }
小结:
定义专门的 po 类作为输出类型,其中定义了 sql 查询结果集所有的字段。此方法较为简单,企业中使用普遍。
方法二:
使用 resultMap,定义专门的 resultMap 用于映射一对一查询结果。
Sql 语句:
SELECT orders.*, user.username, user.address FROM orders, user WHERE orders.user_id = user.id
定义 po 类
在 Orders 类中加入 User 属性,user 属性中用于存储关联查询的用户信息,因为订单关联查询用户是一对一关系,所以这里使用单个 User 对象存储关联查询的用户信息。
public class Orders { private Integer id; private Integer userId; private String number; private Date createtime; private String note; private User user; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getUserId() { return userId; } public void setUserId(Integer userId) { this.userId = userId; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } public Date getCreatetime() { return createtime; } public void setCreatetime(Date createtime) { this.createtime = createtime; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } public User getUser() { return user; } public void setUser(User user) { this.user = user; } @Override public String toString() { return Orders{ + id= + id + , userId= + userId + , number= + number + \ + , createtime= + createtime + , note= + note + \ + , user= + user + } } }
Mapper.xml
!-- 查询订单关联用户信息使用 resultmap -- resultMap type= com.pp.po.Orders id= orderUserResultMap 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.pp.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= findOrdersWithUserResultMap resultMap= orderUserResultMap 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 这里 resultMap 指定 orderUserResultMap。 association:表示进行关联查询单条记录 property:表示关联查询的结果存储在 com.pp.mybatis.po.Orders 的 user 属性中 javaType:表示关联查询的结果类型 id property= id column= user_id /:查询结果的 user_id 列对应关联对象的 id 属性,这里是 id / 表示 user_id 是关联查询对象的唯一标识。 result property= username column= username /:查询结果的 username 列对应关联对象的 username 属性。
Mapper 接口:
public List Orders findOrdersListResultMap() throws Exception; 测试: Public void testfindOrdersListResultMap()throws Exception{ // 获取 session SqlSession session = sqlSessionFactory.openSession(); // 获限 mapper 接口实例 UserMapper userMapper = session.getMapper(UserMapper.class); // 查询订单信息 List Orders list = userMapper.findOrdersList2(); System.out.println(list); // 关闭 session session.close(); }
小结:
使用 association 完成关联查询,将关联查询信息映射到 pojo 对象中。
一对多查询
案例:查询所有用户信息及用户关联的订单信息。
用户信息和订单信息为一对多关系。
使用 resultMap 实现如下:
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
定义 po 类
在 User 类中加入 Listorders 属性
public class User { private int id; private String username; private String sex; private Date birthday; private String address; private List Orders ordersList; @Override public String toString() { return User{ + id= + id + , username= + username + \ + , sex= + sex + \ + , birthday= + birthday + , address= + address + \ + , ordersList= + ordersList + } } public List Orders getOrdersList() { return ordersList; } public void setOrdersList(List Orders ordersList) { this.ordersList = ordersList; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
Mapper.xml
resultMap type= com.pp.po.user id= userOrderResultMap !-- 用户信息映射 -- 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= com.pp.po.Orders id property= id column= oid / !-- 用户 id 已经在 user 对象中存在,此处可以不设置 -- !-- result property= userId column= id / -- result property= number column= number / result property= createtime column= createtime / result property= note column= note / /collection /resultMap select id= getUserOrderList resultMap= userOrderResultMap 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 接口:
List User getUserOrderList();
测试
@Test public void getUserOrderList() { SqlSession session = sqlSessionFactory.openSession(); UserMapper userMapper = session.getMapper(UserMapper.class); List User result = userMapper.getUserOrderList(); for (User user : result) { System.out.println(user); } session.close(); }
以上就是 Mybatis_day05 中怎么实现关联查询,丸趣 TV 小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注丸趣 TV 行业资讯频道。