zoukankan      html  css  js  c++  java
  • mybatis多对多关联关系映射

    mybatis多对多关联关系映射

    多对多关系在java类实体中表示为,一个类中包含了集合为另一个类的属性。而这连个实体都需要包含对方的集合类的属性。

    例如:订单和商品,一个订单包含多个商品,一个商品又可以属于多个订单。

    对这样的多对多关系,需要建立一个中间表,来维护这样的关系,在中间表中包含了两个表的主键字段作为外键,而中间表则另选一个字段作为这个中间表的主键。

    --商品表
    CREATE TABLE tb_product(
    	id int(32) PRIMARY KEY auto_increment,
    	name VARCHAR(30),
    	price DOUBLE
    )
    --订单表
    CREATE TABLE tb_orders (
    	id INT ( 32 ) PRIMARY KEY auto_increment,
    	number VARCHAR ( 32 ) NOT NULL,
    	user_id INT ( 32 ) NOT NULL,
    	FOREIGN KEY ( user_id ) REFERENCES tb_user ( id ) 
    );
    --中间表 商品表和订单表多对多关联的中间表
    create TABLE tb_orderitem(
    	id int(32) PRIMARY KEY auto_increment,--作为中间表的主键
    	orders_id int(32),
    	product_id int(32),
    	FOREIGN KEY(orders_id) REFERENCES tb_orders(id),
    	FOREIGN KEY(product_id) REFERENCES tb_product(id)
    );
    

    对应的java实体类

    //商品表持久化类
    public class Product {
        private Integer id;
        private String name;
        private Double price;
        private List<Orders> orders; //与订单的关联属性,为多对多形式
    	setter/getter方法
    }
    
    //订单持久化类
    public class Orders {
        private Integer id;
        private String number;
        private List<Product> productList;//与订单是多对多关系,多对多关系是都要在对方的属性中添加对方的属性列表
        setter/getter方法
    }
    
    /**
    *注意,两个类中的属性,都有关联的list
    */
    

    mapper接口和mapper映射文件

    public interface OrdersOfProcduct {
        List<Orders> findOrdersInfo(int id);//根据id查询订单列表
    }
    
    <?xml version="1.0" encoding="UTF-8" ?>
    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
    <mapper namespace="cn.jason.bootmybatis.mapper.OrdersOfProcduct">
        <!--多表联合查询-->
        <select id="findOrdersInfo" parameterType="Integer" resultMap="OrderOfProductResult">
            select o.*,p.id as pid,p.name,p.price
            from tb_orders o join tb_product p join tb_orderitem oi
            on oi.orders_id=o.id and oi.product_id=p.id and
            o.id=#{id}
        </select>
    	<!--结果集映射-->
        <resultMap id="OrderOfProductResult" type="Orders">
            <id property="id" column="id"/>
            <result property="number" column="number"/>
        <!-- 多对多关联映射-->
            <collection property="productList" ofType="Product">
                <id property="id" column="pid"/>
                <result property="name" column="name"/>
                <result property="price" column="price"/>
            </collection>
        </resultMap>
    
    </mapper>
    

    service业务层接口和实现类

    public interface OrdersOfProducts {
        List<Orders> findOrdersOfProductByorderid(int id);
    }
    
    //实现类
    @Service
    public class OrdersOfProductsImpl implements OrdersOfProducts {
        @Autowired
        private OrdersOfProcduct ordersOfProcduct;
    
        @Override
        public List<Orders> findOrdersOfProductByorderid(int id) {
            return ordersOfProcduct.findOrdersInfo(id);
        }
    }
    

    测试控制器类

    ![多对多关系测试结果](D:gitTaskdevinternchenhongjun第五周go和java操作mysqlimages多对多关系测试结果.png)@Controller
    @ResponseBody
    public class manyTomany {
        @Autowired
        private OrdersOfProducts ordersOfProducts;
    
        @RequestMapping("/findordersproductinfo/{id}")
        public  String find(@PathVariable int id){
            return ordersOfProducts.findOrdersOfProductByorderid(id).toString();
        }
    }
    

    测试结果

    总结:

    对于多对多关系映射,需要产生一个中间表,来存放关联表的主键,A,B,在java实体类中,需要在A中声明一个集合类型为B的集合属性,在B中也需要声明一个集合属性为A的属性。对于mapper映射文件的编写,还是需要采用嵌套结果,这样方便一些。

  • 相关阅读:
    【LeetCode每天一题】Combinations(组合)
    【算法】字符串匹配算法
    【LeetCode每天一题】Edit Distance(编辑距离)
    【LeetCode每天一题】Set Matrix Zeroes(设置0矩阵)
    SpringIOC和DI
    SpringMVC基础
    SpringMVC框架简介
    Spring配置JDBCTemplate
    java自定义注解
    KTV项目之3个ListView的跳转和加载歌手图片
  • 原文地址:https://www.cnblogs.com/jasonboren/p/11394828.html
Copyright © 2011-2022 走看看