0051 MyBatis关联映射--多对多关系
用户与订单时一对多关系,再加上商品信息的话,订单与商品之间就是多对多关系了
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=李刚老师经典着作]
0051 MyBatis关联映射--多对多关系的更多相关文章
- mybatis关联映射多对多
项目开发中,多对多关系也是非常常见的关系 在数据库中创建表的脚本 table.sql CREATE TABLE tb_user( id INT PRIMARY KEY AUTO_INCREMENT, ...
- Hibernate 、多表关联映射 - 多对多关系映射(many-to-many)
hibernate.cfg.xml: <hibernate-configuration> <session-factory name="sessionFactory&quo ...
- 0050 MyBatis关联映射--一对多关系
一对多关系更加常见,比如用户和订单,一个用户可以有多个订单 DROP TABLE IF EXISTS customer; /*用户表*/ CREATE TABLE customer( `pk` INT ...
- Hibernate 、多表关联映射-多对一关系(many-to-one)
Hibernate.cfg.xml: <session-factory name="sessionFactory"> <property name="h ...
- 关系/对象映射 多对多关系(@ManyToMany 注释)【重新认识】
old: @ManyToMany 注释:表示此类是多对多关系的一边, mappedBy 属性定义了此类为双向关系的维护端, 注意:mappedBy 属性的值为此关系的另一端的属性名. 例如,在Stud ...
- MyBatis学习(七)MyBatis关联映射之多对多映射
对于数据库中的多对多关系建议使用一个中间表来维护关系. 1.创建四张表,分别为用户表,商品表,订单表,中间表. DROP TABLE IF EXISTS `t_user`; CREATE TABLE ...
- 0049 MyBatis关联映射--一对一关系
世上的事务总不是孤立存在的,表现在Java类里面,则是类与类之间的关系,比如继承is-a.依赖use-a.关联has-a,反映在数据库中,则是表与表之间的关系,比如外键 关联关系存在着以下几种类型:一 ...
- mybatis关联映射一对多
实际项目中也存在很多的一对多的情况,下面看看这个简单的例子 table.sql CREATE TABLE tb_clazz( id INT PRIMARY KEY AUTO_INCREMENT, CO ...
- spring boot(9)-mybatis关联映射
一对多 查询type表的某一条数据,并且要同时查出所有typeid与之配置的user,最终要得到一个以下类型的Type对象 public class Type { String id; String ...
随机推荐
- Eclipse中执行maven命令
1.如下图,右击需要执行maven命令的工程,选择"Debug As"或"Run As",再选择"Maven build..." 进行如上操 ...
- cas如何去掉HTTPS认证?
说明:默认情况下HTTP也是可以访问CAS SERVER的,但认证,登陆,退出等操作均没有任何的效果.所以必须作出下面的修改 1.进入WEB-INF\spring-configuration目录 打 ...
- 九.Spring Boot JPAHibernateSpring Data
1.项目结构 2.导入jar包 <!-- 添加Spring-data-jpa依赖. --> <dependency> <groupId>org.springfram ...
- centos7 keepalived以及防火墙配置
安装和配置keepalived,网上有很多资料,但是都没有提到防火墙这块,而且很多都是互相抄袭的,就算配置对了也会遇到很多问题 在查阅资料的时候配置好了keepalived,但是出现了裂脑,即两台服务 ...
- LINUX 下编译不通过解答
在linux下编译android源码或者webkit等程序源码时,不论在源码下加什么错误,编译器都默认正确,检索不到错误,此时,可能是之前编译的生成文件默认编译器不再检索编译新修改过的文件,只是发现修 ...
- supervise 用来监控服务,自动启动
Atong介绍的这个工具,挺好用的.supervise 官方网站: https://cr.yp.to/daemontools.html cd /data/test cat test.c #includ ...
- ckeditor 绑定事件
CKEDITOR.instances["Content"].on("instanceReady", function () { //set keyup even ...
- 爪哇国新游记之七----使用ArrayList统计水果出现次数
之前学习制作了DArray,了解ArrayList就容易了. /** * 用于存储水果名及数量 * */ public class Fruit{ private String name; public ...
- 【ACM】Fighting for HDU
#include <stdio.h> #include <stdlib.h> #define max 100 /* run this program using the con ...
- Linux下Wi-Fi配置工具2
上回说到,linux下面的Wi-Fi配置工具,说是江湖多事,风起云涌...嗯,这回是真的要动手配置了.各种麻烦啊,想死的心都有了有木有啊. 尝试用iwconfig 话说上回说用iwconfig配置Wi ...