多对多关系在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); } }测试控制器类
@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映射文件的编写,还是需要采用嵌套结果,这样方便一些。
转载于:https://www.cnblogs.com/jasonboren/p/11394828.html
相关资源:Mybatis一对多关联关系映射实现过程解析