0


Mybatis高级查询-一对多查询

表介绍和表关系说明
新建以下4张表
  1. tb_user:用户表
  2. tb_order:订单表
  3. tb_item:商品表
  4. tb_orderdetail:订单详情表

【表关系】

  1. 1.tb_user tb_order表关系
  2. tb_user 《==》 tb_order:一对多, 一个人可以下多个订单
  3. tb_order 《==》 tb_user:一对一,一个订单只能属于一个人
  4. 结论:tb_usertb_order属于一对多的关系,需要将一方tb_user的主键作为多方tb_order的外键维护关系
  5. 2.tb_order tb_item 表关系
  6. tb_order 《==》 tb_item :一个订单可以有多个商品
  7. tb_item 《==》 tb_order:一个商品可以在多个订单上
  8. 结论:tb_ordertb_item属于多对多的关系,需要创建中间表tb_orderdetail维护两个表的关系,并且将两张表 的主键作为中间表的外键

一对多查询

【目标】查询id为1的用户及其订单信息

【分析】

一个用户可以有多个订单。

一个订单只能属于一个用户。

用户(1)-----订单(n)

【步骤】

  1. 第一步:查询SQL分析;
  2. 第二步:添加关联关系;
  3. 第三步:编写接口方法;
  4. 第四步:编写映射文件;
  5. 第五步:测试

【实现】

第一步:需求分析

编写SQL实现查询id为1的用户及其订单信息

查询语句及查询结果:

  1. #查询id为1的用户及其订单信息
  2. select * from tb_user where id=1;
  3. select * from tb_order where user_id=1;
  4. #一对多 内连接查询
  5. select * from tb_user tbu inner join tb_order tbo on tbu.id = tbo.user_id where tbu.id=1;
  6. # 封装数据:关联对象,一个用户关联多个订单 User(List<Order> orderList)

说明:一个用户关联多个订单 User(List orderList) ,在User类中定义一个List集合存储多个订单Order对象。

第二步:添加映射关系

因为一个用户可以拥有多个订单,所以用户订单一对多的关系;需要在User类中添加一个

  1. List<Order>

属性;

  1. package com.itheima.sh.pojo;
  2. import java.io.Serializable;
  3. import java.util.List;
  4. public class User implements Serializable {
  5. private Long id;
  6. // 用户名
  7. private String userName;
  8. // 密码
  9. private String password;
  10. // 姓名
  11. private String name;
  12. // 年龄
  13. private Integer age;
  14. //0 女性 1 男性
  15. private Integer sex;
  16. //订单
  17. List<Order> orders;
  18. public Long getId() {
  19. return id;
  20. }
  21. public void setId(Long id) {
  22. this.id = id;
  23. }
  24. public String getUserName() {
  25. return userName;
  26. }
  27. public void setUserName(String userName) {
  28. this.userName = userName;
  29. }
  30. public String getPassword() {
  31. return password;
  32. }
  33. public void setPassword(String password) {
  34. this.password = password;
  35. }
  36. public String getName() {
  37. return name;
  38. }
  39. public void setName(String name) {
  40. this.name = name;
  41. }
  42. public Integer getAge() {
  43. return age;
  44. }
  45. public void setAge(Integer age) {
  46. this.age = age;
  47. }
  48. public Integer getSex() {
  49. return sex;
  50. }
  51. public void setSex(Integer sex) {
  52. this.sex = sex;
  53. }
  54. public List<Order> getOrders() {
  55. return orders;
  56. }
  57. public void setOrders(List<Order> orders) {
  58. this.orders = orders;
  59. }
  60. @Override
  61. public String toString() {
  62. return "User{" +
  63. "id=" + id +
  64. ", userName='" + userName + '\'' +
  65. ", password='" + password + '\'' +
  66. ", name='" + name + '\'' +
  67. ", age=" + age +
  68. ", sex=" + sex +
  69. ", orders=" + orders +
  70. '}';
  71. }
  72. }
第三步:编写接口方法

UserMapper接口中,添加关联查询;

  1. /**
  2. * 根据用户id查询用户及其订单信息
  3. * @param id
  4. * @return
  5. */
  6. User oneToManyQuery(@Param("id") Long id);
第四步:编写SQL

UserMapper.xml文件中编写SQL语句完成一对多的关联查询;

说明:

  1. 1.一对多使用collection子标签进行关联多方Order
  2. <collection property="类中引用多方的成员变量名" javaType="存放多方容器的类型" ofType="多方类型" autoMapping="true">
  3. </collection>
  4. 2.属性:
  5. 1property="orders" 这里的orders表示User类的成员变量orders
  6. 2javaType="List" 表示User类的成员变量orders存储的Order对象使用的类型,这里是List 一般不书写
  7. 3) ofType="Order" 表示List集合中存储数据的类型 Order
  8. 3.一定要记住这里给user表的id起别名是uid,order表的id起别名是oid.在resultMap标签的id子标签中的column属性值书写对应的uidoid.
  9. <!--自定义结果集-->
  10. <resultMap id="oneToManyResult" type="User" autoMapping="true">
  11. <!--User的主键-->
  12. <id column="uid" property="id"/>
  13. <!--Order关联映射-->
  14. <!--
  15. 1.一对多使用collection子标签进行关联多方Order
  16. 2.属性:
  17. 1property="orders" 这里的orders表示User类的成员变量orders
  18. 2javaType="List" 表示User类的成员变量orders存储的Order对象使用的类型,这里是List,可以不配置
  19. 3) ofType="Order" 表示List集合中存储数据的类型 Order
  20. -->
  21. <collection property="orders" javaType="List" ofType="Order" autoMapping="true">
  22. <!--Order的主键-->
  23. <id column="oid" property="id" />
  24. </collection>
  25. </resultMap>
  26. <!--根据用户ID查询用户及其订单数据-->
  27. <select id="oneToManyQuery" resultMap="oneToManyResult">
  28. SELECT
  29. tbo.id as oid,
  30. tbo.order_number,
  31. tbu.id as uid,
  32. tbu.user_name,
  33. tbu.password,
  34. tbu.name,
  35. tbu.age,
  36. tbu.sex
  37. FROM
  38. tb_user tbu
  39. INNER JOIN tb_order tbo ON tbu.id = tbo.user_id
  40. WHERE
  41. tbu.id = #{id}
  42. </select>
第五步:测试

在用户的测试类中

  1. public class MybatisTest01 {
  2. private static UserMapper mapper = null;
  3. @BeforeClass
  4. public static void beforeClass() throws Exception {
  5. //1.构建SessionFactory
  6. String resouce = "mybatis-config.xml";
  7. InputStream is = Resources.getResourceAsStream(resouce);
  8. SqlSessionFactory build = new SqlSessionFactoryBuilder().build(is);
  9. //2.获取session
  10. SqlSession sqlSession = build.openSession(true);
  11. //3.获取接口对象
  12. mapper = sqlSession.getMapper(UserMapper.class);
  13. }
  14. //根据用户ID查询用户及其订单数据
  15. @Test
  16. public void oneToManyQuery() {
  17. User user = mapper.oneToManyQuery(1L);
  18. System.out.println("user = " + user);
  19. }
  20. }

【小结】
  1. 一对多关系配置:
  2. 1、在对象中添加映射关系;
  3. 2、编写接口方法,编写SQL
  4. 3、编写resultMap处理数据库字段和实体类之间数据的封装;

本文转载自: https://blog.csdn.net/2301_80237574/article/details/142831753
版权归原作者 技术瞭望台 所有, 如有侵权,请联系我们删除。

“Mybatis高级查询-一对多查询”的评论:

还没有评论