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:\gitTask\dev\intern\chenhongjun\第五周go和java操作mysql\images\多對多關系測試結果.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映射文件的編寫,還是需要采用嵌套結果,這樣方便一些。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM