• Mybatis--关联关系映射


    目录

    一、一对多关联关系

    概念

     逆向生成所需要的实体类与配置

    创建两个Vo类

    实体类

     一对一

    ​编辑

     一对多

     二、多对多


    一、一对多关联关系

    概念

     逆向生成所需要的实体类与配置

    generatorConfig.xml

    1. "1.0" encoding="UTF-8" ?>
    2. generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    3. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
    4. <generatorConfiguration>
    5. <properties resource="jdbc.properties"/>
    6. <classPathEntry location="D:\\SoftwareInstallPath\\repository\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>
    7. <context id="infoGuardian">
    8. <commentGenerator>
    9. <property name="suppressAllComments" value="true"/>
    10. <property name="suppressDate" value="true"/>
    11. commentGenerator>
    12. <jdbcConnection driverClass="${jdbc.driver}"
    13. connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
    14. <javaTypeResolver>
    15. <property name="forceBigDecimals" value="false"/>
    16. javaTypeResolver>
    17. <javaModelGenerator targetPackage="com.ouyang.ssm.Biz.model"
    18. targetProject="src/main/java">
    19. <property name="enableSubPackages" value="false"/>
    20. <property name="constructorBased" value="true"/>
    21. <property name="trimStrings" value="false"/>
    22. <property name="immutable" value="false"/>
    23. javaModelGenerator>
    24. <sqlMapGenerator targetPackage="com.ouyang.ssm.Biz.mapper"
    25. targetProject="src/main/java">
    26. <property name="enableSubPackages" value="false"/>
    27. sqlMapGenerator>
    28. <javaClientGenerator targetPackage="com.ouyang.ssm.Biz.mapper"
    29. targetProject="src/main/java" type="XMLMAPPER">
    30. <property name="enableSubPackages" value="false"/>
    31. javaClientGenerator>
    32. <table schema="" tableName="t_hibernate_order" domainObjectName="Order"
    33. enableCountByExample="false" enableDeleteByExample="false"
    34. enableSelectByExample="false" enableUpdateByExample="false">
    35. table>
    36. <table schema="" tableName="t_hibernate_order_item" domainObjectName="OrderItem"
    37. enableCountByExample="false" enableDeleteByExample="false"
    38. enableSelectByExample="false" enableUpdateByExample="false">
    39. table>
    40. context>
    41. generatorConfiguration>

    创建两个Vo类

    vo类
    view Object:视图对象

    OrderVo

    1. package com.ouyang.ssm.Biz.model.vo;
    2. import com.ouyang.ssm.Biz.model.Order;
    3. import com.ouyang.ssm.Biz.model.OrderItem;
    4. import java.util.List;
    5. /**
    6. * @author oyang
    7. * @site https://blog.csdn.net
    8. * @qq 1828190940
    9. * @create  2022-08-16 11:44
    10. *
    11. * vo类不仅仅包含当前表的信息,还能包含相关联表的信息
    12. *
    13. * 当前订单可能会有一个或多个订单项,多个订单项必须要用集合进行接收
    14. */
    15. public class OrderVo extends Order {
    16. //通过订单号查询本次订单的详细信息以及对应所有订单
    17. private List orderItems;
    18. public List getOrderItems() {
    19. return orderItems;
    20. }
    21. public void setOrderItems(List orderItems) {
    22. this.orderItems = orderItems;
    23. }
    24. }

    OrderItemVo

    1. package com.ouyang.ssm.Biz.model.vo;
    2. import com.ouyang.ssm.Biz.model.Order;
    3. /**
    4. * @author oyang
    5. * @site https://blog.csdn.net
    6. * @qq 1828190940
    7. * @create  2022-08-16 11:47
    8. *
    9. * 某一个订单项一定属于某个订单的
    10. *
    11. */
    12. public class OrderItemVo {
    13. private Order order;
    14. public Order getOrder() {
    15. return order;
    16. }
    17. public void setOrder(Order order) {
    18. this.order = order;
    19. }
    20. }

    实体类

    @Data相当于添加了set/get/tostr方法
    @NoArgsConstructor //无参构造器
    @AllArgsConstructor //有参构造器

    @ToString //toString

    1. package com.ouyang.ssm.Biz.model;
    2. import lombok.Data;
    3. //t_hibernate_order
    4. //@Data相当于添加了set/get/tostr方法
    5. //@NoArgsConstructor //无参构造器
    6. //@AllArgsConstructor //有参构造器
    7. @Data
    8. public class Order {
    9. private String orderId;
    10. private String orderNo;
    11. /* public Order(String orderId, String orderNo) {
    12. this.orderId = orderId;
    13. this.orderNo = orderNo;
    14. }
    15. public Order() {
    16. super();
    17. }
    18. public String getOrderId() {
    19. return orderId;
    20. }
    21. public void setOrderId(String orderId) {
    22. this.orderId = orderId;
    23. }
    24. public String getOrderNo() {
    25. return orderNo;
    26. }
    27. public void setOrderNo(String orderNo) {
    28. this.orderNo = orderNo;
    29. }*/
    30. }
    1. package com.ouyang.ssm.Biz.model;
    2. import lombok.ToString;
    3. @ToString
    4. public class OrderItem {
    5. private String orderItemId;
    6. private String productId;
    7. private String quantity;
    8. private String oid;
    9. public OrderItem(String orderItemId, String productId, String quantity, String oid) {
    10. this.orderItemId = orderItemId;
    11. this.productId = productId;
    12. this.quantity = quantity;
    13. this.oid = oid;
    14. }
    15. public OrderItem() {
    16. super();
    17. }
    18. public String getOrderItemId() {
    19. return orderItemId;
    20. }
    21. public void setOrderItemId(String orderItemId) {
    22. this.orderItemId = orderItemId;
    23. }
    24. public String getProductId() {
    25. return productId;
    26. }
    27. public void setProductId(String productId) {
    28. this.productId = productId;
    29. }
    30. public String getQuantity() {
    31. return quantity;
    32. }
    33. public void setQuantity(String quantity) {
    34. this.quantity = quantity;
    35. }
    36. public String getOid() {
    37. return oid;
    38. }
    39. public void setOid(String oid) {
    40. this.oid = oid;
    41. }
    42. }

     一对一

    一条记录属于哪一条主记录的从记录

    修改OrderMapper.xml

    1. "1.0" encoding="UTF-8" ?>
    2. mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    3. <mapper namespace="com.ouyang.ssm.Biz.mapper.OrderMapper" >
    4. <resultMap id="BaseResultMap" type="com.ouyang.ssm.Biz.model.Order" >
    5. <constructor >
    6. <arg column="order_id" jdbcType="VARCHAR" javaType="java.lang.String" />
    7. <arg column="order_no" jdbcType="VARCHAR" javaType="java.lang.String" />
    8. constructor>
    9. resultMap>
    10. <resultMap id="OrderVoMap" type="com.ouyang.ssm.Biz.model.vo.OrderVo" >
    11. <result column="order_id" property="orderId">result>
    12. <result column="order_no" property="orderNo">result>
    13. <collection property="orderItems" ofType="com.ouyang.ssm.Biz.model.OrderItem">
    14. <result column="order_item_id" property="orderItemId">result>
    15. <result column="product_id" property="productId">result>
    16. <result column="quantity" property="quantity">result>
    17. <result column="oid" property="oid">result>
    18. collection>
    19. resultMap>
    20. <sql id="Base_Column_List">
    21. order_id,order_no
    22. sql>
    23. <select id="queryOrderVoByOrderId" resultMap="OrderVoMap" parameterType="java.lang.Integer">
    24. select * from t_hibernate_order o,t_hibernate_order_item oi
    25. where o.order_id = oi.oid and o.order_id=#{orderId}
    26. select>
    27. <insert id="insert" parameterType="com.ouyang.ssm.Biz.model.Order" >
    28. insert into t_hibernate_order (order_id, order_no)
    29. values (#{orderId,jdbcType=VARCHAR}, #{orderNo,jdbcType=VARCHAR})
    30. insert>
    31. <insert id="insertSelective" parameterType="com.ouyang.ssm.Biz.model.Order" >
    32. insert into t_hibernate_order
    33. <trim prefix="(" suffix=")" suffixOverrides="," >
    34. <if test="orderId != null" >
    35. order_id,
    36. if>
    37. <if test="orderNo != null" >
    38. order_no,
    39. if>
    40. trim>
    41. <trim prefix="values (" suffix=")" suffixOverrides="," >
    42. <if test="orderId != null" >
    43. #{orderId,jdbcType=VARCHAR},
    44. if>
    45. <if test="orderNo != null" >
    46. #{orderNo,jdbcType=VARCHAR},
    47. if>
    48. trim>
    49. insert>
    50. mapper>

    OrderMapper

    1. package com.ouyang.ssm.Biz.mapper;
    2. import com.ouyang.ssm.Biz.model.vo.OrderVo;
    3. import org.apache.ibatis.annotations.Param;
    4. public interface OrderMapper {
    5. OrderVo queryOrderVoByOrderId(@Param("orderId") Integer orderId);
    6. }

    OrederBiz接口

    1. package com.ouyang.ssm.Biz;
    2. import com.ouyang.ssm.Biz.model.vo.OrderVo;
    3. /**
    4. * @author oyang
    5. * @site https://blog.csdn.net
    6. * @qq 1828190940
    7. * @create  2022-08-16 12:02
    8. */
    9. public interface OrderBiz {
    10. OrderVo queryOrderVoByOrderId(Integer orderId);
    11. }

    OrderBizImpl 实现Oreder接口 

    1. package com.ouyang.ssm.Biz.impl;
    2. import com.ouyang.ssm.Biz.OrderBiz;
    3. import com.ouyang.ssm.Biz.mapper.OrderMapper;
    4. import com.ouyang.ssm.Biz.model.Order;
    5. import com.ouyang.ssm.Biz.model.vo.OrderVo;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.stereotype.Service;
    8. /**
    9. * @author oyang
    10. * @site https://blog.csdn.net
    11. * @qq 1828190940
    12. * @create  2022-08-16 12:04
    13. */
    14. @Service
    15. public class OrderBizImpl implements OrderBiz {
    16. @Autowired
    17. private OrderMapper orderMapper;
    18. @Override
    19. public OrderVo queryOrderVoByOrderId(Integer orderId) {
    20. return orderMapper.queryOrderVoByOrderId(orderId);
    21. }
    22. }

    测试

    1. package com.ouyang.ssm.Biz.impl;
    2. import com.ouyang.ssm.Biz.OrderBiz;
    3. import com.ouyang.ssm.Biz.model.vo.OrderVo;
    4. import org.junit.Test;
    5. import org.junit.runner.RunWith;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.test.context.ContextConfiguration;
    8. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    9. /**
    10. * @author oyang
    11. * @site https://blog.csdn.net
    12. * @qq 1828190940
    13. * @create  2022-08-16 12:16
    14. */
    15. @RunWith(SpringJUnit4ClassRunner.class)
    16. @ContextConfiguration(locations={"classpath:applocationContext-mybatis.xml"})
    17. public class OrderBizImplTest {
    18. @Autowired
    19. private OrderBiz orderBiz;
    20. @Test
    21. public void queryOrderVoByOrderId() {
    22. OrderVo orderVo = orderBiz.queryOrderVoByOrderId(9);
    23. System.out.println(orderVo);
    24. }
    25. }

     一对多

    修改OrderItemMapper.xml

    1. "1.0" encoding="UTF-8" ?>
    2. mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    3. <mapper namespace="com.ouyang.ssm.Biz.mapper.OrderItemMapper" >
    4. <resultMap id="BaseResultMap" type="com.ouyang.ssm.Biz.model.OrderItem" >
    5. <constructor >
    6. <arg column="order_item_id" jdbcType="VARCHAR" javaType="java.lang.String" />
    7. <arg column="product_id" jdbcType="VARCHAR" javaType="java.lang.String" />
    8. <arg column="quantity" jdbcType="VARCHAR" javaType="java.lang.String" />
    9. <arg column="oid" jdbcType="VARCHAR" javaType="java.lang.String" />
    10. constructor>
    11. resultMap>
    12. <resultMap id="OrderItemVoMap" type="com.ouyang.ssm.Biz.model.vo.OrderItemVo" >
    13. <result column="order_item_id" property="orderItemId">result>
    14. <result column="product_id" property="productId">result>
    15. <result column="quantity" property="quantity">result>
    16. <result column="oid" property="oid">result>
    17. <association property="order" javaType="com.ouyang.ssm.Biz.model.Order">
    18. <result column="order_id" property="orderId">result>
    19. <result column="order_no" property="orderNo">result>
    20. association>
    21. resultMap>
    22. <sql id="Base_Column_List">
    23. order_item_id,product_id,quantity,oid
    24. sql>
    25. <select id="queryOrderVoByOrderItemId" resultMap="OrderItemVoMap" parameterType="java.lang.Integer">
    26. select * from t_hibernate_order o,t_hibernate_order_item oi
    27. where o.order_id = oi.oid and oi.order_item_id=#{orderItemId}
    28. select>
    29. <insert id="insert" parameterType="com.ouyang.ssm.Biz.model.OrderItem" >
    30. insert into t_hibernate_order_item (order_item_id, product_id, quantity,
    31. oid)
    32. values (#{orderItemId,jdbcType=VARCHAR}, #{productId,jdbcType=VARCHAR}, #{quantity,jdbcType=VARCHAR},
    33. #{oid,jdbcType=VARCHAR})
    34. insert>
    35. <insert id="insertSelective" parameterType="com.ouyang.ssm.Biz.model.OrderItem" >
    36. insert into t_hibernate_order_item
    37. <trim prefix="(" suffix=")" suffixOverrides="," >
    38. <if test="orderItemId != null" >
    39. order_item_id,
    40. if>
    41. <if test="productId != null" >
    42. product_id,
    43. if>
    44. <if test="quantity != null" >
    45. quantity,
    46. if>
    47. <if test="oid != null" >
    48. oid,
    49. if>
    50. trim>
    51. <trim prefix="values (" suffix=")" suffixOverrides="," >
    52. <if test="orderItemId != null" >
    53. #{orderItemId,jdbcType=VARCHAR},
    54. if>
    55. <if test="productId != null" >
    56. #{productId,jdbcType=VARCHAR},
    57. if>
    58. <if test="quantity != null" >
    59. #{quantity,jdbcType=VARCHAR},
    60. if>
    61. <if test="oid != null" >
    62. #{oid,jdbcType=VARCHAR},
    63. if>
    64. trim>
    65. insert>
    66. mapper>

    OrderItemMapper

    1. package com.ouyang.ssm.Biz.mapper;
    2. import com.ouyang.ssm.Biz.model.OrderItem;
    3. import com.ouyang.ssm.Biz.model.vo.OrderItemVo;
    4. import org.apache.ibatis.annotations.Param;
    5. public interface OrderItemMapper {
    6. int insert(OrderItem record);
    7. int insertSelective(OrderItem record);
    8. OrderItemVo queryOrderVoByOrderItemId(@Param("orderItemId")Integer orderItemId);
    9. }

    OrderItemBiz

    1. package com.ouyang.ssm.Biz;
    2. import com.ouyang.ssm.Biz.model.OrderItem;
    3. import com.ouyang.ssm.Biz.model.vo.OrderItemVo;
    4. public interface OrderItemBiz {
    5. int insert(OrderItem record);
    6. int insertSelective(OrderItem record);
    7. OrderItemVo queryOrderVoByOrderItemId(Integer orderItemId);
    8. }

    OrderItemBizImpl  实现OrderItemBiz接口

    1. package com.ouyang.ssm.Biz.impl;
    2. import com.ouyang.ssm.Biz.OrderItemBiz;
    3. import com.ouyang.ssm.Biz.model.OrderItem;
    4. import com.ouyang.ssm.Biz.model.vo.OrderItemVo;
    5. import org.springframework.beans.factory.annotation.Autowired;
    6. import org.springframework.stereotype.Service;
    7. /**
    8. * @author oyang
    9. * @site https://blog.csdn.net
    10. * @qq 1828190940
    11. * @create  2022-08-16 12:26
    12. */
    13. @Service
    14. public class OrderItemBizImpl implements OrderItemBiz {
    15. @Autowired
    16. private OrderItemBiz orderItemBiz;
    17. @Override
    18. public int insert(OrderItem record) {
    19. return 0;
    20. }
    21. @Override
    22. public int insertSelective(OrderItem record) {
    23. return 0;
    24. }
    25. @Override
    26. public OrderItemVo queryOrderVoByOrderItemId(Integer orderItemId) {
    27. return orderItemBiz.queryOrderVoByOrderItemId(orderItemId);
    28. }
    29. }

    测试

    1. package com.ouyang.ssm.Biz.impl;
    2. import com.ouyang.ssm.Biz.OrderItemBiz;
    3. import com.ouyang.ssm.Biz.model.vo.OrderItemVo;
    4. import org.junit.Test;
    5. import org.junit.runner.RunWith;
    6. import org.springframework.beans.factory.annotation.Autowired;
    7. import org.springframework.test.context.ContextConfiguration;
    8. import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
    9. /**
    10. * @author oyang
    11. * @site https://blog.csdn.net
    12. * @qq 1828190940
    13. * @create  2022-08-16 12:28
    14. */
    15. @RunWith(SpringJUnit4ClassRunner.class)
    16. @ContextConfiguration(locations={"classpath:applocationContext-mybatis.xml"})
    17. public class OrderItemBizImplTest {
    18. @Autowired
    19. private OrderItemBiz orderItemBiz;
    20. @Test
    21. public void queryOrderVoByOrderItemId() {
    22. OrderItemVo orderItemVo = orderItemBiz.queryOrderVoByOrderItemId(42);
    23. System.out.println(orderItemVo);
    24. System.out.println(orderItemVo.getOrder());
    25. }
    26. }

     Collection:一对多的一方,对应关联属性用ofType

    Assoctation:一对多的多方,对应关联属性用javaType

     二、多对多

    概念:比如一本书籍有多个类别,多个类别对多本书

     逆向生成所需要的实体类与配置

    generatorConfig.xml

    1. "1.0" encoding="UTF-8" ?>
    2. generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    3. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
    4. <generatorConfiguration>
    5. <properties resource="jdbc.properties"/>
    6. <classPathEntry location="D:\\SoftwareInstallPath\\repository\\mvn_repository\\mysql\\mysql-connector-java\\5.1.44\\mysql-connector-java-5.1.44.jar"/>
    7. <context id="infoGuardian">
    8. <commentGenerator>
    9. <property name="suppressAllComments" value="true"/>
    10. <property name="suppressDate" value="true"/>
    11. commentGenerator>
    12. <jdbcConnection driverClass="${jdbc.driver}"
    13. connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
    14. <javaTypeResolver>
    15. <property name="forceBigDecimals" value="false"/>
    16. javaTypeResolver>
    17. <javaModelGenerator targetPackage="com.ouyang.ssm.Biz.model"
    18. targetProject="src/main/java">
    19. <property name="enableSubPackages" value="false"/>
    20. <property name="constructorBased" value="true"/>
    21. <property name="trimStrings" value="false"/>
    22. <property name="immutable" value="false"/>
    23. javaModelGenerator>
    24. <sqlMapGenerator targetPackage="com.ouyang.ssm.Biz.mapper"
    25. targetProject="src/main/java">
    26. <property name="enableSubPackages" value="false"/>
    27. sqlMapGenerator>
    28. <javaClientGenerator targetPackage="com.ouyang.ssm.Biz.mapper"
    29. targetProject="src/main/java" type="XMLMAPPER">
    30. <property name="enableSubPackages" value="false"/>
    31. javaClientGenerator>
    32. <table schema="" tableName="t_hibernate_book" domainObjectName="Book"
    33. enableCountByExample="false" enableDeleteByExample="false"
    34. enableSelectByExample="false" enableUpdateByExample="false">
    35. table>
    36. <table schema="" tableName="t_hibernate_category" domainObjectName="Category"
    37. enableCountByExample="false" enableDeleteByExample="false"
    38. enableSelectByExample="false" enableUpdateByExample="false">
    39. table>
    40. <table schema="" tableName="t_hibernate_book_category" domainObjectName="BookCategory"
    41. enableCountByExample="false" enableDeleteByExample="false"
    42. enableSelectByExample="false" enableUpdateByExample="false">
    43. table>
    44. context>
    45. generatorConfiguration>

     创建三个Vo类

    BookVo 

    1. package com.ouyang.ssm.Biz.model.vo;
    2. import com.ouyang.ssm.Biz.model.Book;
    3. import com.ouyang.ssm.Biz.model.Category;
    4. import java.util.List;
    5. /**
    6. * @author oyang
    7. * @site https://blog.csdn.net
    8. * @qq 1828190940
    9. * @create  2022-08-17 8:24
    10. */
    11. public class BookVo extends Book {
    12. private List categories;
    13. public List getCategories() {
    14. return categories;
    15. }
    16. public void setCategories(List categories) {
    17. this.categories = categories;
    18. }
    19. }

    CategoryVo  

    1. package com.ouyang.ssm.Biz.model.vo;
    2. import com.ouyang.ssm.Biz.model.Book;
    3. import com.ouyang.ssm.Biz.model.Category;
    4. import java.util.List;
    5. /**
    6. * @author oyang
    7. * @site https://blog.csdn.net
    8. * @qq 1828190940
    9. * @create  2022-08-17 8:27
    10. */
    11. public class CategoryVo extends Category {
    12. private List books;
    13. public List getBooks() {
    14. return books;
    15. }
    16. public void setBooks(List books) {
    17. this.books = books;
    18. }
    19. }

    BookCategoryVo  

    1. package com.ouyang.ssm.Biz.model.vo;
    2. import com.ouyang.ssm.Biz.model.Book;
    3. import com.ouyang.ssm.Biz.model.BookCategory;
    4. import java.util.List;
    5. /**
    6. * @author oyang
    7. * @site https://blog.csdn.net
    8. * @qq 1828190940
    9. * @create  2022-08-17 8:25
    10. */
    11. public class BookCategoryVo extends BookCategory {
    12. private List books;
    13. public List getBooks() {
    14. return books;
    15. }
    16. public void setBooks(List books) {
    17. this.books = books;
    18. }
    19. }

  • 相关阅读:
    云原生爱好者周刊:给你的 Kubernetes 集群打分 | 2022-8-15
    今年的计算机专业应届生居然也找不到工作了?
    第一章《初学者问题大集合》第6节:IntelliJ IDEA的下载与安装
    软件测试中的集成测试到底是什么?集成的方法又有哪些?
    U81206:链式前向星模板题
    论文摘要会被查重
    工业5G路由器;小体积 千兆高速通信组网
    Python+playwright 实现Web UI自动化
    hyper-v安装 windows10虚拟机后,登录一直是锁屏界面,无法开启增强会话
    Spring大白话--三级缓存解决循环依赖问题
  • 原文地址:https://blog.csdn.net/weixin_65211978/article/details/126362286