0051 MyBatis关联映射--多对多关系
2017-03-25 17:23
330 查看
用户与订单时一对多关系,再加上商品信息的话,订单与商品之间就是多对多关系了
实体类User
实体类Order
实体类Article
根据用户id查询用户信息,并将其所有订单信息一并查询出来
根据订单id查询订单信息,一并将其所属的用户信息和包含的商品信息查询出来
根据订单id,先从中间表item中查询其包含的商品id,再查询这些商品的信息
测试类
输出:
测试用户查询:根据用户id查询用户信息及其订单信息
------用户信息------
User [id=1, username=杰克, loginname=jack, password=123456, phone=13920001616, address=广州]
------该用户下的订单信息------
Order [id=1, code=6aa3fa359ff14619b77fab5990940a2d, total=388.6, user_id=1]
Order [id=2, code=6aa3fa359ff14619b77fab5990940b3c, total=217.8, user_id=1]
测试订单查询:根据订单id查询订单信息,所属用户信息,订单包含的商品信息
------订单信息------
Order [id=1, code=6aa3fa359ff14619b77fab5990940b3c, total=217.8, user_id=0]
------订单所属用户信息------
User [id=1, username=杰克, loginname=jack, password=123456, phone=13920001616, address=广州]
------订单包含的商品信息------
Article [id=1, name=疯狂Java讲义, price=108.9, remark=李刚老师经典着作]
Article [id=2, name=疯狂Android讲义, price=99.9, remark=李刚老师经典着作]
Article [id=3, name=疯狂iOS讲义, price=89.9, remark=李刚老师经典着作]
DROP DATABASE IF EXISTS testdb; USE testdb; /*用户表,记录用户信息;用户与订单为一对多关系:一个用户可拥有多个订单*/ DROP TABLE IF EXISTS `tb_user`; CREATE TABLE tb_user( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(18), loginname VARCHAR(18), PASSWORD VARCHAR(18), phone VARCHAR(18), address VARCHAR(18) ); INSERT INTO tb_user(username,loginname,PASSWORD,phone,address) VALUES('杰克','jack','123456','13920001616','广州'); /*商品信息表;商品与订单为多对多关系:一个订单可有多个商品,一个商品也可出现在多个订单中*/ DROP TABLE IF EXISTS `tb_article`; CREATE TABLE tb_article( id INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(32), price DOUBLE, remark VARCHAR(18) ); INSERT INTO tb_article(NAME,price,remark) VALUES('疯狂Java讲义',108.9,'李刚老师经典着作'); INSERT INTO tb_article(NAME,price,remark) VALUES('疯狂Android讲义',99.9,'李刚老师经典着作'); INSERT INTO tb_article(NAME,price,remark) VALUES('疯狂iOS讲义',89.9,'李刚老师经典着作'); INSERT INTO tb_article(NAME,price,remark) VALUES('SpringMVC+MyBatis企业开发',69.9,'肖文吉老师经典着作'); /*订单表,记录订单编号,总金额,所属用户的id;订单与用户为多对一关系,与商品为多对多关系*/ DROP TABLE IF EXISTS `tb_order`; CREATE TABLE tb_order( id INT PRIMARY KEY AUTO_INCREMENT, CODE VARCHAR(32), total DOUBLE, user_id INT, FOREIGN KEY (user_id) REFERENCES tb_user(id) ); INSERT INTO tb_order(CODE,total,user_id) VALUES('6aa3fa359ff14619b77fab5990940a2d',388.6,1); INSERT INTO tb_order(CODE,total,user_id) VALUES('6aa3fa359ff14619b77fab5990940b3c',217.8,1); /*中间表,用于记录订单对应的商品id*/ DROP TABLE IF EXISTS `tb_item`; CREATE TABLE tb_item( order_id INT, article_id INT, amount INT, PRIMARY KEY(order_id,article_id), FOREIGN KEY (order_id) REFERENCES tb_order(id), FOREIGN KEY (article_id) REFERENCES tb_article(id) ); INSERT INTO tb_item(order_id,article_id,amount) VALUES(1,1,1); INSERT INTO tb_item(order_id,article_id,amount) VALUES(1,2,1); INSERT INTO tb_item(order_id,article_id,amount) VALUES(1,3,2); INSERT INTO tb_item(order_id,article_id,amount) VALUES(2,4,2); INSERT INTO tb_item(order_id,article_id,amount) VALUES(2,1,1);
实体类User
package net.sonng.manytomany; import java.util.List; public class User { private int id; private String username; private String loginname; private String password; private String phone; private String address; private List<Order> orders; //用户与订单:一对多关系,一个用户可有多个订单 //...... }
实体类Order
package net.sonng.manytomany; import java.util.List; public class Order { private int id; private String code; private double total; private int user_id; private User user; //一个订单只属于一个用户 private List<Article> articles; //订单与商品:多对多关系,一个订单可包含多个商品,一个商品也可以出现在多个订单中 //..... }
实体类Article
package net.sonng.manytomany; import java.util.List; public class Article { private int id; private String name; private double price; private String remark; private List<Order> orders; //商品与订单:多对多关系 //..... }
根据用户id查询用户信息,并将其所有订单信息一并查询出来
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTDMapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="net.sonng.manytomany.UserDao"> <select id="selectUserById" parameterType="int" resultMap="userMap"> SELECT * FROM tb_user WHERE id=#{user_id} </select> <resultMap id="userMap" type="net.sonng.manytomany.User"> <id property="id" column="id" /> <result property="username" column="username" /> <result property="loginname" column="loginname" /> <result property="password" column="password" /> <result property="phone" column="phone" /> <result property="address" column="address" /> <!-- 用户与订单一对多关系,用collection --> <collection property="orders" column="id" javaType="ArrayList" ofType="net.sonng.manytomany.Order" select="net.sonng.manytomany.OrderDao.selectOrderByUserId" > <id property="id" column="id" /> <result property="code" column="code" /> <result property="total" column="total" /> </collection> </resultMap> </mapper>
根据订单id查询订单信息,一并将其所属的用户信息和包含的商品信息查询出来
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTDMapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="net.sonng.manytomany.OrderDao"> <select id="selectOrderByUserId" parameterType="int" resultType="net.sonng.manytomany.Order" > SELECT * FROM tb_order WHERE user_id=#{user_id} </select> <select id="selectOrderById" parameterType="int" resultMap="orderMap"> SELECT u.*,o.id AS oid,code,total,user_id FROM tb_order o,tb_user u WHERE o.user_id=u.id AND o.id=#{order_id} </select> <resultMap type="net.sonng.manytomany.Order" id="orderMap" > <id property="id" column="id" /> <result property="code" column="code" /> <result property="total" column="total" /> <association property="user" javaType="net.sonng.manytomany.User"> <id property="id" column="id" /> <result property="username" column="username" /> <result property="loginname" column="loginname" /> <result property="password" column="password" /> <result property="phone" column="phone" /> <result property="address" column="address" /> </association> <collection property="articles" column="id" javaType="ArrayList" ofType="net.sonng.manytomany.Article" select="net.sonng.manytomany.ArticleDao.selectArticleByOrderId" > <id property="id" column="id" /> <result property="name" column="name" /> <result property="price" column="price" /> <result property="remark" column="remark" /> </collection> </resultMap> </mapper>
根据订单id,先从中间表item中查询其包含的商品id,再查询这些商品的信息
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTDMapper 3.0//EN" "http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd"> <mapper namespace="net.sonng.manytomany.ArticleDao"> <select id="selectArticleByOrderId" parameterType="int" resultType="net.sonng.manytomany.Article"> SELECT * FROM tb_article WHERE id IN (SELECT article_id FROM tb_item WHERE order_id=#{order_id}) </select> </mapper>
测试类
package net.sonng.test; import java.util.List; import net.sonng.manytomany.Article; import net.sonng.manytomany.ArticleDao; import net.sonng.manytomany.Order; import net.sonng.manytomany.OrderDao; import net.sonng.manytomany.User; import net.sonng.manytomany.UserDao; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String[] args){ ApplicationContext ac=new ClassPathXmlApplicationContext("ac.xml"); System.out.println("测试用户查询:根据用户id查询用户信息及其订单信息"); UserDao userDao=ac.getBean("userDao",UserDao.class); User user=userDao.selectUserById(1); System.out.println("------用户信息------"); System.out.println(user); List<Order> orders=user.getOrders(); System.out.println("------该用户下的订单信息------"); for (Order order:orders){ System.out.println(order); } System.out.println("测试订单查询:根据订单id查询订单信息,所属用户信息,订单包含的商品信息"); OrderDao orderDao=ac.getBean("orderDao",OrderDao.class); Order order=orderDao.selectOrderById(2); System.out.println("------订单信息------"); System.out.println(order); System.out.println("------订单所属用户信息------"); System.out.println(order.getUser()); List<Article> articles=order.getArticles(); System.out.println("------订单包含的商品信息------"); for (Article article:articles) { System.out.println(article); } } }
输出:
测试用户查询:根据用户id查询用户信息及其订单信息
------用户信息------
User [id=1, username=杰克, loginname=jack, password=123456, phone=13920001616, address=广州]
------该用户下的订单信息------
Order [id=1, code=6aa3fa359ff14619b77fab5990940a2d, total=388.6, user_id=1]
Order [id=2, code=6aa3fa359ff14619b77fab5990940b3c, total=217.8, user_id=1]
测试订单查询:根据订单id查询订单信息,所属用户信息,订单包含的商品信息
------订单信息------
Order [id=1, code=6aa3fa359ff14619b77fab5990940b3c, total=217.8, user_id=0]
------订单所属用户信息------
User [id=1, username=杰克, loginname=jack, password=123456, phone=13920001616, address=广州]
------订单包含的商品信息------
Article [id=1, name=疯狂Java讲义, price=108.9, remark=李刚老师经典着作]
Article [id=2, name=疯狂Android讲义, price=99.9, remark=李刚老师经典着作]
Article [id=3, name=疯狂iOS讲义, price=89.9, remark=李刚老师经典着作]
相关文章推荐
- java的orm框架 mybatis 多对多 一对多关系的关联映射和查询--简单易懂,理解才是王道
- Mybatis学习笔记:(二) java中的实体(对象、List、Set)关系怎样与数据库关联映射
- 0049 MyBatis关联映射--一对一关系
- MyBatis关系关联映射
- ORM对象关系映射之GreenDAO建立多表关联
- J2EE系列之MyBatis学习笔记(四)-- mybatis关系映射(一对一映射)
- JPA关系映射系列二:one-to-one主键关联
- Hibernate关系映射(一)一对一单向外键关联@OneToOne Annotation方式
- mybatis关系映射之一对多和多对一
- Mybatis的注解应用之关系映射
- Mybatis框架中的注解应用之关系映射
- Hibernate关系映射(10)_多对多单向关联
- Mybatis步步进阶(七)——Mybatis实体关联映射
- Hibernate(七)实现多对多关联映射关系
- 关联映射的关系(多对一)
- MyBatis(二) MyBatis的关联映射和动态SQL
- MyBatis映射文件的resultMap如何做表关联
- Hibernate之对象关系映射02一对一单向主键关联
- Hibernate 映射关系 ---One2One 主键关联
- 【mybatis】【对象属性关系的映射】