Mybatis_day05:关联查询

运维 数据库运维
本篇给大家介绍Mybatis_day05:关联查询。

 关联查询

一对一查询

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

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

方法一:

使用resultType,定义订单信息po类,此po类中包括了订单信息和用户信息:

Sql语句:

  1. SELECT 
  2.  
  3. orders.*, 
  4.  
  5. user.username, 
  6.  
  7. userss.address 
  8.  
  9. FROM 
  10.  
  11. orders, 
  12.  
  13. user 
  14.  
  15. WHERE orders.user_id = user.id 

定义po类

 

Po类中应该包括上边sql查询出来的所有字段,如下:

  1. public class OrdersCustom extends Orders { 
  2.  
  3. private String username;// 用户名称 
  4.  
  5. private String address;// 用户地址 
  6.  
  7. get/set。。。。 
  8.  
  9. OrdersCustom类继承Orders类后OrdersCustom类包括了Orders类的所有字段,只需要定义用户的信息字段即可。 

Mapper.xml

  1. <!-- 查询所有订单信息 --> 
  2.  
  3. <select id="findOrdersList" resultType="com.pp.mybatis.po.OrdersCustom"
  4.  
  5. SELECT 
  6.  
  7. orders.*, 
  8.  
  9. user.username, 
  10.  
  11. user.address 
  12.  
  13. FROM 
  14.  
  15. orders, user 
  16.  
  17. WHERE orders.user_id = user.id 
  18.  
  19. </select

Mapper接口:

  1. public List<OrdersCustom> findOrdersList() throws Exception; 
  2.  
  3. 测试: 
  4.  
  5. Public void testfindOrdersList()throws Exception{ 
  6.  
  7. //获取session 
  8.  
  9. SqlSession session = sqlSessionFactory.openSession(); 
  10.  
  11. //获限mapper接口实例 
  12.  
  13. UserMapper userMapper = session.getMapper(UserMapper.class); 
  14.  
  15. //查询订单信息 
  16.  
  17. List<OrdersCustom> list = userMapper.findOrdersList(); 
  18.  
  19. System.out.println(list); 
  20.  
  21. //关闭session 
  22.  
  23. session.close(); 
  24.  

小结:

定义专门的po类作为输出类型,其中定义了sql查询结果集所有的字段。此方法较为简单,企业中使用普遍。

方法二:

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

 

Sql语句:

  1. SELECT 
  2.  
  3. orders.*, 
  4.  
  5. user.username, 
  6.  
  7. user.address 
  8.  
  9. FROM 
  10.  
  11. orders, 
  12.  
  13. user 
  14.  
  15. WHERE orders.user_id = user.id 

定义po类

 

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

  1. public class Orders { 
  2.  
  3. private Integer id; 
  4.  
  5. private Integer userId; 
  6.  
  7. private String number; 
  8.  
  9. private Date createtime; 
  10.  
  11. private String note; 
  12.  
  13. private User user
  14.  
  15. public Integer getId() { 
  16.  
  17. return id; 
  18.  
  19.  
  20. public void setId(Integer id) { 
  21.  
  22. this.id = id; 
  23.  
  24.  
  25. public Integer getUserId() { 
  26.  
  27. return userId; 
  28.  
  29.  
  30. public void setUserId(Integer userId) { 
  31.  
  32. this.userId = userId; 
  33.  
  34.  
  35. public String getNumber() { 
  36.  
  37. return number; 
  38.  
  39.  
  40. public void setNumber(String number) { 
  41.  
  42. this.number = number; 
  43.  
  44.  
  45. public Date getCreatetime() { 
  46.  
  47. return createtime; 
  48.  
  49.  
  50. public void setCreatetime(Date createtime) { 
  51.  
  52. this.createtime = createtime; 
  53.  
  54.  
  55. public String getNote() { 
  56.  
  57. return note; 
  58.  
  59.  
  60. public void setNote(String note) { 
  61.  
  62. this.note = note; 
  63.  
  64.  
  65. public User getUser() { 
  66.  
  67. return user
  68.  
  69.  
  70. public void setUser(User user) { 
  71.  
  72. this.user = user
  73.  
  74.  
  75. @Override 
  76.  
  77. public String toString() { 
  78.  
  79. return "Orders{" + 
  80.  
  81. "id=" + id + 
  82.  
  83. ", userId=" + userId + 
  84.  
  85. ", number='" + number + '\'' + 
  86.  
  87. ", createtime=" + createtime + 
  88.  
  89. ", note='" + note + '\'' + 
  90.  
  91. ", user=" + user + 
  92.  
  93. '}'
  94.  
  95.  

Mapper.xml

  1. <!-- 查询订单关联用户信息使用resultmap --> 
  2.  
  3. <resultMap type="com.pp.po.Orders" id="orderUserResultMap"
  4.  
  5. <id column="id" property="id"/> 
  6.  
  7. <result column="user_id" property="userId"/> 
  8.  
  9. <result column="number" property="number"/> 
  10.  
  11. <result column="createtime" property="createtime"/> 
  12.  
  13. <result column="note" property="note"/> 
  14. <!-- 一对一关联映射 --> 
  15. <!-- 
  16. property:Orders对象的user属性 
  17.  
  18. javaType:user属性对应 的类型 
  19.  
  20. --> 
  21.  
  22. <association property="user" javaType="com.pp.po.User"
  23.  
  24. <!-- column:user表的主键对应的列 property:user对象中id属性--> 
  25.  
  26. <id column="user_id" property="id"/> 
  27.  
  28. <result column="username" property="username"/> 
  29.  
  30. <result column="address" property="address"/> 
  31.  
  32. </association> 
  33.  
  34. </resultMap> 
  35.  
  36. <select id="findOrdersWithUserResultMap" resultMap="orderUserResultMap"
  37.  
  38. SELECT 
  39.  
  40. o.id, 
  41.  
  42. o.user_id, 
  43.  
  44. o.number, 
  45.  
  46. o.createtime, 
  47.  
  48. o.note, 
  49.  
  50. u.username, 
  51.  
  52. u.address 
  53.  
  54. FROM 
  55.  
  56. orders o 
  57.  
  58. JOIN `user` u ON u.id = o.user_id 
  59.  
  60. </select
  61.  
  62. 这里resultMap指定orderUserResultMap。 
  63.  
  64. association:表示进行关联查询单条记录 
  65.  
  66. property:表示关联查询的结果存储在com.pp.mybatis.po.Orders的user属性中 
  67.  
  68. javaType:表示关联查询的结果类型 
  69.  
  70. <id property="id" 
  71.  
  72. column="user_id"/>:查询结果的user_id列对应关联对象的id属性,这里是<id 
  73.  
  74. />表示user_id是关联查询对象的唯一标识。 
  75.  
  76. <result property="username" 
  77.  
  78. column="username"/>:查询结果的username列对应关联对象的username属性。 

Mapper接口:

  1. public List<Orders> findOrdersListResultMap() throws Exception; 
  2.  
  3. 测试: 
  4.  
  5. Public void testfindOrdersListResultMap()throws Exception{ 
  6.  
  7. //获取session 
  8.  
  9. SqlSession session = sqlSessionFactory.openSession(); 
  10.  
  11. //获限mapper接口实例 
  12.  
  13. UserMapper userMapper = session.getMapper(UserMapper.class); 
  14.  
  15. //查询订单信息 
  16.  
  17. List<Orders> list = userMapper.findOrdersList2(); 
  18.  
  19. System.out.println(list); 
  20.  
  21. //关闭session 
  22.  
  23. session.close(); 
  24.  

小结:

使用association完成关联查询,将关联查询信息映射到pojo对象中。

一对多查询

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

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

使用resultMap实现如下:

 

Sql语句:

  1. SELECT 
  2.  
  3. u.*, o.id oid, 
  4.  
  5. o.number, 
  6.  
  7. o.createtime, 
  8.  
  9. o.note 
  10.  
  11. FROM 
  12.  
  13. `user` u 
  14.  
  15. LEFT JOIN orders o ON u.id = o.user_id 

定义po类

 

在User类中加入List orders属性

  1. public class User { 
  2.  
  3. private int id; 
  4.  
  5. private String username; 
  6.  
  7. private String sex; 
  8.  
  9. private Date birthday; 
  10.  
  11. private String address; 
  12.  
  13. private List<Orders> ordersList; 
  14.  
  15. @Override 
  16. public String toString() { 
  17. return "User{" + 
  18. "id=" + id + 
  19. ", username='" + username + '\'' + 
  20. ", sex='" + sex + '\'' + 
  21. ", birthday=" + birthday + 
  22.  
  23. ", address='" + address + '\'' + 
  24.  
  25. ", ordersList=" + ordersList + 
  26.  
  27. '}'
  28.  
  29.  
  30. public List<Orders> getOrdersList() { 
  31.  
  32. return ordersList; 
  33.  
  34.  
  35. public void setOrdersList(List<Orders> ordersList) { 
  36.  
  37. this.ordersList = ordersList; 
  38.  
  39.  
  40. public int getId() { 
  41.  
  42. return id; 
  43.  
  44.  
  45. public void setId(int id) { 
  46.  
  47. this.id = id; 
  48.  
  49.  
  50. public String getUsername() { 
  51.  
  52. return username; 
  53.  
  54.  
  55. public void setUsername(String username) { 
  56.  
  57. this.username = username; 
  58.  
  59.  
  60. public String getSex() { 
  61.  
  62. return sex; 
  63.  
  64.  
  65. public void setSex(String sex) { 
  66.  
  67. this.sex = sex; 
  68.  
  69.  
  70. public Date getBirthday() { 
  71.  
  72. return birthday; 
  73.  
  74.  
  75. public void setBirthday(Date birthday) { 
  76.  
  77. this.birthday = birthday; 
  78.  
  79.  
  80. public String getAddress() { 
  81.  
  82. return address; 
  83.  
  84.  
  85. public void setAddress(String address) { 
  86.  
  87. this.address = address; 
  88.  
  89.  

Mapper.xml

  1. <resultMap type="com.pp.po.user" id="userOrderResultMap"
  2.  
  3. <!-- 用户信息映射 --> 
  4.  
  5. <id property="id" column="id"/> 
  6.  
  7. <result property="username" column="username"/> 
  8.  
  9. <result property="birthday" column="birthday"/> 
  10.  
  11. <result property="sex" column="sex"/> 
  12.  
  13. <result property="address" column="address"/> 
  14.  
  15. <!-- 一对多关联映射 --> 
  16.  
  17. <collection property="orders" ofType="com.pp.po.Orders"
  18.  
  19. <id property="id" column="oid"/> 
  20.  
  21. <!--用户id已经在user对象中存在,此处可以不设置--> 
  22.  
  23. <!-- <result property="userId" column="id"/> --> 
  24.  
  25. <result property="number" column="number"/> 
  26.  
  27. <result property="createtime" column="createtime"/> 
  28.  
  29. <result property="note" column="note"/> 
  30.  
  31. </collection> 
  32.  
  33. </resultMap> 
  34.  
  35. <select id="getUserOrderList" resultMap="userOrderResultMap"
  36.  
  37. SELECT 
  38.  
  39. u.*, o.id oid, 
  40.  
  41. o.number, 
  42.  
  43. o.createtime, 
  44.  
  45. o.note 
  46.  
  47. FROM 
  48.  
  49. `user` u 
  50.  
  51. LEFT JOIN orders o ON u.id = o.user_id 
  52.  
  53. </select

collection部分定义了用户关联的订单信息。表示关联查询结果集

property="orders":关联查询的结果集存储在User对象的上哪个属性。

ofType="orders":指定关联查询的结果集中的对象类型即List中的对象类型。此处可以使用别名,也可以使用全限定名。

的意义同一对一查询。

 

Mapper接口:

  1. List<User> getUserOrderList(); 

测试

  1. @Test 
  2.  
  3. public void getUserOrderList() { 
  4.  
  5. SqlSession session = sqlSessionFactory.openSession(); 
  6.  
  7. UserMapper userMapper = session.getMapper(UserMapper.class); 
  8.  
  9. List<User> result = userMapper.getUserOrderList(); 
  10.  
  11. for (User user : result) { 
  12.  
  13. System.out.println(user); 
  14.  
  15.  
  16. session.close(); 
  17.  

 

责任编辑:姜华 来源: 键盘蜂
相关推荐

2017-07-25 15:35:07

MysqlMysql优化LIMIT分页

2009-09-25 10:22:35

Hibernate多表

2012-06-05 02:20:24

JPAJava查询语言

2010-06-03 09:24:46

Oracle

2021-10-12 05:00:27

PandasSQL查询

2021-09-02 18:36:35

SQLWhereOn

2015-03-18 13:18:45

MySQLSQL优化

2020-11-09 10:16:41

Mybatis

2022-05-11 09:34:15

云原生集群数仓

2009-09-23 09:16:25

Hibernate复合

2022-07-05 10:50:31

数据库查询实战

2020-11-04 08:28:11

Mybatis

2023-02-24 08:19:59

MySQL索引失效

2011-07-20 10:01:22

SQL Server数关联表

2021-04-23 09:09:19

GraphQLREST查询

2009-11-24 19:40:07

PHP关联数组查询结果

2021-05-11 11:05:43

SAL子查询

2021-11-08 15:59:01

MyBatis关联开发

2023-04-12 08:14:10

mysql关联字段索引

2022-11-11 07:48:56

ORM链式轮播图
点赞
收藏

51CTO技术栈公众号