mybatis关系映射之一对多和多对一

一. 简介:

本实例使用顾客和订单的例子做说明: 一个顾客可以有多个订单, 一个订单只对应一个顾客

二. 例子:

1. 代码结构图:

2. 建表语句:

CREATE DATABASE test;  

USE test;

CREATE TABLE person(
  personId VARCHAR(36) PRIMARY KEY,
  personName VARCHAR(64),
  personAddress VARCHAR(128),
  personTel VARCHAR(11)
);

CREATE TABLE orders(
  orderId VARCHAR(36) PRIMARY KEY,
  orderNumber VARCHAR(20),
  orderPrice INT,
  pid VARCHAR(36)
);

INSERT INTO person VALUES('001', 'Jack', 'Wuhan', '1234567');
INSERT INTO orders VALUES('O_00001', '00001', 100, '001');
INSERT INTO orders VALUES('O_00002', '00002', 200, '001');

SELECT p.*, o.*
FROM person p
  JOIN orders o ON (p.personId=o.pid)
WHERE p.personId = '001'

3. 顾客实体:

/**
 * 客户实体
 */
public class Person {

	private String id;
	private String name;
	private String address;
	private String tel;

	private List<Order> orders;

	@Override
	public String toString() {
		return "{id: " + id + ", name: " + name + ", address: " + address + ", tel: " + tel + "}";
	}
}

4. 订单实体:

/**
 * 订单实体
 */
public class Order {

	private String id;
	private String number;
	private int price;

	private Person person; 

	@Override
	public String toString() {
		return "{id: " + id + ", number: " + number + ", price: " + price + "}";
	}

}

5. 一对多实体配置: Person.xml

<?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="com.zdp.domain.Person">

	<resultMap type="Person" id="personBean">
		<id column="personId" property="id"/>
		<result column="personName" property="name"/>
		<result column="personAddress" property="address"/>
		<result column="personTel" property="tel"/>

		<!-- 一对多的关系 -->
		<!-- property: 指的是集合属性的值, ofType:指的是集合中元素的类型 -->
		<collection property="orders" ofType="Order">
			<id column="orderId" property="id"/>
			<result column="orderNumber" property="number"/>
			<result column="orderPrice" property="price"/>
		</collection>
	</resultMap>

	<!-- 根据id查询Person, 关联将Orders查询出来 -->
	<select id="selectPersonById" parameterType="string" resultMap="personBean">
		select p.*, o.* from person p, orders o where p.personId  = o.pid and p.personId = #{id}
	</select>

</mapper>

6. 多对一实体配置:

<?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="com.zdp.domain.Order">
	<resultMap type="Order" id="orderBean">
		<id column="orderId" property="id"/>
		<result column="orderNumber" property="number"/>
		<result column="orderPrice" property="price"/>

		<!-- 多对一的关系 -->
		<!-- property: 指的是属性的值, javaType:指的是属性的类型-->
		<association property="person" javaType="Person">
			<id column="personId" property="id"/>
			<result column="personName" property="name"/>
			<result column="personAddress" property="address"/>
			<result column="personTel" property="tel"/>
		</association>
	</resultMap>

	<!-- 根据id查询Order, 关联将Person查询出来 -->
	<select id="selectOrderById" parameterType="string" resultMap="orderBean">
		select p.*, o.* from person p, orders o where p.personId  = o.pid and o.orderId = #{id}
	</select>

</mapper>

7. 总配置: sqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<typeAliases>
		<typeAlias type="com.zdp.domain.Person" alias="Person"/>
        <typeAlias type="com.zdp.domain.Order" alias="Order"/>
	</typeAliases>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://localhost/test" />
				<property name="username" value="root" />
				<property name="password" value="root" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<!-- 映射文件的位置 -->
		<mapper resource="com/zdp/domain/Person.xml" />
		<mapper resource="com/zdp/domain/Order.xml" />
	</mappers>
</configuration>

8. 测试文件:

/**
 * 测试一对多和多对一
 */
public class MybatisTest {

	private SqlSessionFactory ssf; 

	@Before
	public void initSF() throws Exception {
		String resource = "sqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		ssf = new SqlSessionFactoryBuilder().build(inputStream);
	}

	@Test//一对多关联查询
	public void selectPersonById()throws Exception{
		SqlSession session = ssf.openSession();
		Person person = session.selectOne("com.zdp.domain.Person.selectPersonById", "001");
		System.out.println(person.getOrders());
	}

	@Test//多对一关联查询
	public void selectOrderById()throws Exception{
		SqlSession session = ssf.openSession();
		Order order = session.selectOne("com.zdp.domain.Order.selectOrderById", "O_00001");
		System.out.println(order.getPerson().getName());
	}
}
时间: 2024-12-20 14:28:47

mybatis关系映射之一对多和多对一的相关文章

Mybatis关系映射

一.一对一关系映射 使用resultType+包装类实现 1.假设问题背景是要求在某一个购物平台的后台程序中添加一个这样的功能:查询某个订单的信息和下该订单的用户信息.首先我们可以知道,一般这样的平台上面,某一笔订单只属于某一个用户,从这个角度来看,可以作为一对一的参考模型 ①首先创建数据表user(用户表) CREATE TABLE `user` ( `uid` INT(11) NOT NULL AUTO_INCREMENT, `username` VARCHAR(255) DEFAULT N

mybatis 关系映射

一:订单商品数据模型 1.数据库执行脚本 创建数据库表代码: 1 CREATE TABLE items ( 2 id INT NOT NULL AUTO_INCREMENT, 3 itemsname VARCHAR(32) NOT NULL COMMENT '商品名称', 4 price FLOAT(10,1) NOT NULL COMMENT '商品定价', 5 detail TEXT COMMENT '商品描述', 6 pic VARCHAR(64) DEFAULT NULL COMMENT

关系映射的双向关联的多对多

package org.fkjava.bean; import java.util.Set; /** * 多对多 双向 关联关系 配置 * * @author hanfeili www.fkjava.org */ public class Address { private Integer id; /** * 邮政编码 */ private String codes; /** * 具体地址 */ private String des; private Set<Person> personSet

关系映射的双向关联的多对一

package org.fkjava.bean; import java.util.Date; import java.util.Set; /** * 一对多 外键 双向 关联关系 配置 * 一个人 一个地址 * * @author hanfeili * www.fkjava.org */ public class Person { private Integer id; private String name; private int password; private Date birthd

Mybatis之关联关系(一对多、多对多)

目的: Mybatis关系映射之一对多 Mybatis关系映射之多对多 Mybatis关系映射之一对多 一对多 (订单对应多个订单项) 多对一  (订单项对应一个订单) 其是映射关系的基层思维是一样的,只是用法不一样,今天所记录的mybatis关系映射比Hibernate要简单 之前我记录一篇hibernate映射关系,可以移步(https://www.cnblogs.com/huangting/p/11203498.html) 今天就用订单表和订单项表来演示mybatis一对多和多对一的映射关

mybatis 一对一,一对多,多对多关系映射查询操作

定义两个类(对应数据库内两张表) User ,Account,每个Account属于一个User User类 及其 对应的IUserDao package com.itheima.domain; import java.io.Serializable; import java.util.Date; import java.util.List; public class User implements Serializable { private Integer id; private Strin

mybatis中树形结构的bean的关系映射

最近用mybatis写一个小程序,涉及到树形结构的关系映射,比如一个分类,本身具有多对一的关系,那么它是如何映射呢?直接贴代码: Cate.java @Table(name="cate") public class Cate extends AbstractModel { /** * */ private static final long serialVersionUID = 1L; @Id @GeneratedValue(strategy=GenerationType.IDENTI

六 mybatis高级映射(一对一,一对多,多对多)

1  订单商品数据模型 以订单商品数据为模型,来对mybaits高级关系映射进行学习. 1.1     数据模型分析思路 1.每张表记录的数据内容 分模块对每张表记录的内容进行熟悉,相当 于你学习系统 需求(功能)的过程. 2.每张表重要的字段设置 非空字段.外键字段 3.数据库级别表与表之间的关系 外键关系 4.表与表之间的业务关系 在分析表与表之间的业务关系时一定要建立 在某个业务意义基础上去分析. 1.2     数据模型分析 用户表user: 记录了购买商品的用户信息 订单表:order

MyBatis的对象关系映射---一对多N+1策略★★★★★

在实际开发中,一个业务可能涉及到多个数据表的查询,那么多表查询就涉及连接查询(等值连接), 等值连接 表与表之间有一个外键关键,但是程序中最终获取的表封装的对象, 对象与对象之间是没有外键关系的,对象和对象之间只有依赖关系: 对象之间关系主要是四种: 一对一 关系一个人对应身份证id,一个QQ号对应一个QQ空间 一对多 关系 一个部门对应多个员工 多对一 关系 多个员工对应一个部门 多对多 关系 多个学生对应多个老师,多个学生对应多个课程 什么关系应该从哪个对象作为中心点来看 一对多, 以one