0050 MyBatis关联映射--一对多关系
一对多关系更加常见,比如用户和订单,一个用户可以有多个订单
DROP TABLE IF EXISTS customer;
/*用户表*/
CREATE TABLE customer(
`pk` INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(16),
`email` VARCHAR(16),
`password` VARCHAR(16)
);
/*插入三条测试数据*/
INSERT INTO customer(`name`,`email`,`password`) VALUES('张三','2A@b.com','123456');
INSERT INTO customer(`name`,`email`,`password`) VALUES('李六','MNO@b.com','qazwer');
INSERT INTO customer(`name`,`email`,`password`) VALUES('王五','XYZ@b.com','edcrfv');
DROP TABLE IF EXISTS `order`;
/*订单表*/
CREATE TABLE `order`(
`pk` INT PRIMARY KEY AUTO_INCREMENT,
`customer_pk` INT,
`order_id` int,
`order_total` float,
FOREIGN KEY (customer_pk) REFERENCES customer(pk)
);
/*插入8条测试数据*/
INSERT INTO `order`(`customer_pk`,`order_id`,`order_total`) VALUES('1','1','462.9');
INSERT INTO `order`(`customer_pk`,`order_id`,`order_total`) VALUES('3','2','32.5');
INSERT INTO `order`(`customer_pk`,`order_id`,`order_total`) VALUES('2','3','216.93');
INSERT INTO `order`(`customer_pk`,`order_id`,`order_total`) VALUES('1','4','5323.32');
INSERT INTO `order`(`customer_pk`,`order_id`,`order_total`) VALUES('3','5','533.1');
INSERT INTO `order`(`customer_pk`,`order_id`,`order_total`) VALUES('2','6','924.5');
INSERT INTO `order`(`customer_pk`,`order_id`,`order_total`) VALUES('1','7','121.3');
INSERT INTO `order`(`customer_pk`,`order_id`,`order_total`) VALUES('2','8','65.34');
实体类:Customer和Order
package net.sonng.onetomany;
import java.util.List;
//用户实体类
public class Customer {
private int pk;
private String name;
private String email;
private String password;
private List<Order> orders;//一个用户可拥有多个订单
//省略getter、setter、toString
}
package net.sonng.onetomany;
//订单实体类
public class Order {
private int pk;
private int customer_pk;
private int order_id;
private Float order_total;
private Customer customer; //一条订单只属于一个用户
//省略getter、setter、toString
}
假如要根据用户的主键,查询用户的信息,然后再查询其所有的订单信息,sqlMapper配置如下
<?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.onetomany.CustomerDao">
<!-- 根据用户主键查询用户信息,按『costomerMap』封装 -->
<select id="selectCustomerByPk" parameterType="int" resultMap="customerMap" >
SELECT * FROM customer WHERE pk=#{pk}
</select>
<resultMap id="customerMap" type="net.sonng.onetomany.Customer">
<id property="pk" column="pk" />
<result property="name" column="name" />
<result property="email" column="email" />
<result property="password" column="password" />
<!-- 根据查到的customer表的主键pk,再用另一个sql查询所有的订单,封装成ArrayList<Order>,再映射到orders属性 -->
<!-- collection解决了一对多关联,该元素下还有个属性fetchType="lazy/eager",用于定义是否立即进行进一步查询 -->
<!-- Customer类的属性 查询结果列 封装类型 封装元素类型 -->
<collection property="orders" column="pk" javaType="ArrayList" ofType="net.sonng.onetomany.Order"
select="net.sonng.onetomany.OrderDao.selectOrderByCustomerPk" >
<id property="pk" column="pk" />
<result property="order_id" column="order_id" />
<result property="order_total" column="order_total" />
</collection>
</resultMap>
</mapper>
根据订单主键查询订单信息,同时查询到其所属的用户信息
<?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.onetomany.OrderDao">
<!-- 根据订单的主键,查询订单的信息,因为一条订单只属于一个用户,数据量不大,因而用联合查询一次查出来 -->
<select id="selectOrderByPk" parameterType="int" resultMap="orderMap">
SELECT * FROM customer,`order` WHERE customer.pk=order.customer_pk AND order.pk=#{pk}
</select>
<!-- 下面这条select就是上面的resultMap要引用的,可以用resultMap或者resultType封装,resultMap看似形成了循环嵌套 -->
<select id="selectOrderByCustomerPk" parameterType="int" resultMap="orderMap" >
SELECT * FROM `order` WHERE customer_pk=#{pk}
</select>
<resultMap type="net.sonng.onetomany.Order" id="orderMap">
<id property="pk" column="pk" />
<result property="costomer_id" column="costomer_id" />
<result property="order_id" column="order_id" />
<result property="order_total" column="order_total" />
<!--这是多对一关联,多个订单都属于一个用户,跟一对一一样还是用association元素-->
<association property="customer" javaType="net.sonng.onetomany.Customer">
<id property="pk" column="pk" />
<result property="name" column="name" />
<result property="email" column="email" />
<result property="password" column="password" />
</association>
</resultMap>
</mapper>
测试类:
package net.sonng.test;
import java.util.List;
import net.sonng.onetomany.Customer;
import net.sonng.onetomany.CustomerDao;
import net.sonng.onetomany.Order;
import net.sonng.onetomany.OrderDao;
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");
CustomerDao customerDao=ac.getBean("customerDao",CustomerDao.class);
OrderDao orderDao=ac.getBean("orderDao",OrderDao.class);
Customer ct=customerDao.selectCustomerByPk(2);//这个查询会将用户信息连带其所有订单信息一起查询出来
System.out.println(ct);
List<Order> orders=ct.getOrders(); //如果加了fetch=lazy,那么要到访问订单信息的时候,才去查询
for (Order order:orders) {
System.out.println(order);
}
Order order=orderDao.selectOrderByPk(1);
System.out.println(order);
System.out.println(order.getCustomer());
}
}
输出:
Customer [pk=2, name=李六, email=MNO@b.com, password=qazwer //根据用户主键查询到用户信息
Order [pk=3, customer_pk=2, order_id=3, order_total=216.93 //这三条order都是查询到用户信息后,进一步查询到的所有订单信息
Order [pk=6, customer_pk=2, order_id=6, order_total=924.5
Order [pk=8, customer_pk=2, order_id=8, order_total=65.34
Order [pk=1, customer_pk=0, order_id=1, order_total=462.9 //根据订单的主键查询到的订单信息
Customer [pk=1, name=张三, email=2A@b.com, password=123456//查询到订单信息后,进一步查到其所属的用户信息
0050 MyBatis关联映射--一对多关系的更多相关文章
- mybatis关联映射一对多
实际项目中也存在很多的一对多的情况,下面看看这个简单的例子 table.sql CREATE TABLE tb_clazz( id INT PRIMARY KEY AUTO_INCREMENT, CO ...
- 0051 MyBatis关联映射--多对多关系
用户与订单时一对多关系,再加上商品信息的话,订单与商品之间就是多对多关系了 DROP DATABASE IF EXISTS testdb; USE testdb; /*用户表,记录用户信息:用户与订单 ...
- Hibernate 多表关联映射- 一对多关系映射(one-to-many)
Hibernage.cfg.xml: <hibernate-configuration> <session-factory name="sessionFactory&quo ...
- (转)Hibernate关联映射——一对多(多对一)
http://blog.csdn.net/yerenyuan_pku/article/details/70152173 Hibernate关联映射——一对多(多对一) 我们以客户(Customer)与 ...
- 0049 MyBatis关联映射--一对一关系
世上的事务总不是孤立存在的,表现在Java类里面,则是类与类之间的关系,比如继承is-a.依赖use-a.关联has-a,反映在数据库中,则是表与表之间的关系,比如外键 关联关系存在着以下几种类型:一 ...
- MyBatis学习(六)MyBatis关联映射之一对多映射
数据库中一对多通常使用主外键关联,外键应该在多方,即多方维护关系. 下面举一个简单实例来看看MyBatis怎么处理一对多的关系. 1.创建一个项目,导入所需jar包,导入db.properties配置 ...
- MyBatis(五):mybatis关联映射
Mybatis中表与表之间的关系分为一下4类: 1)一对一 2)一对多 3)多对一 4)多对多 创建数据Demo表 数据库表: 用户表user:记录了购买商品的用户信息. 订单表orders:记录了用 ...
- mybatis关联映射多对多
项目开发中,多对多关系也是非常常见的关系 在数据库中创建表的脚本 table.sql CREATE TABLE tb_user( id INT PRIMARY KEY AUTO_INCREMENT, ...
- Hibernate之关联映射(一对多和多对一映射,多对多映射)
~~~接着之前的Hibernate框架接着学习(上篇面试过后发现真的需要学习以下框架了,不然又被忽悠让去培训.)~~~ 1:Hibernate的关联映射,存在一对多和多对一映射,多对多映射: 1.1: ...
随机推荐
- 安装pip源
国内源地址: 豆瓣(douban) http://pypi.douban.com/simple/ 阿里云 http://mirrors.aliyun.com/pypi/simple/ 中国科技大学 h ...
- python利用os和getopt实现删除指定文件
工作中经常遇到要删除某些目录下的特定文件 例如删除xxx目录下的所有test开头文件或者.pyc结尾的文件 如果手动删除的话,很麻烦,写个程序自动删除 只需要运行的时候输入路径和文件名即可,不输入文件 ...
- request.startAsync()不支持异步操作
Servlet3.0使用异步处理时,后台报错: java.lang.IllegalStateException: A filter or servlet of the current chain do ...
- rsa实现js前台加密java后台解密
前段时间写了一个rsa前台加密到后台用java解密,下面共享下实现思路: 准备工作:第三方包是必须的 bcprov-jdk15on-148.jar commons-codec-1.7.jar comm ...
- [Algorithm] Find Nth smallest value from Array
Q1: Find the smallest value from array: function findMin(arr) { let min = arr[0]; for (let i = 1; i ...
- vector iterator not incrementable For information on how your program can cause an an assertion Failure, see the Visual c + + documentation on asserts
#include <list> using namespace std; int _tmain(int argc, _TCHAR* argv[]) { list<int> sl ...
- jquery中动画特效方法
基本特效 方法: 说明 .show() 显示选中的元素 .hide() 隐藏选中的元素 .toggle() ...
- HDU2189 悼念512汶川大地震遇难同胞——来生一起走 【母函数】
悼念512汶川大地震遇难同胞--来生一起走 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- chrome浏览器 提示Adobe Flash Player未安装的解决方法
最近遇到了个flash player设置的一个问题,记录一下,可能不同浏览器版本和设置不一样 浏览器版本:版本 61.0.3163.100(正式版本) (64 位) 打开需要flash player的 ...
- Solidworks如何等比例缩小放大模型
比如初始化的模型,笔记本长度只有120mm,实际上应该是3倍左右 右击特征,勾选模具工具,然后可以发现多出来一个页面 点击比例缩放,选中要缩放的特征,设置比例,然后打钩 可以发现已经缩放到 ...