Mybtis中1对1,多对1,多对多关系映射

1.一对一关系映射

1.1、数据库表

在这里插入图片描述

1.2、实体类

User

package com.baizhi.entity;
import java.util.Date;
import lombok.Data;

@Data
public class User {
	private String id;
	private String name;
	private Integer age;
	private Date bir;
	private Card card;//关系属性  不要出现在toString方法里面  
}

实体类中使用关系属性体现关系

Card

package com.baizhi.entity;

public class Card {
	private String id;
	private String no;
	private String address;
	private String fork;
}

1.3、需求:查询用户 并且查询用户的身份信息

根据用户的身份信息,查询用户的身份证,sql语句需要使用表连接查询
返回值必须使用resultMap处理,不能让再使用resultType处理

DAO接口

package com.baizhi.dao;
import java.util.List;
import com.baizhi.entity.User;

public interface UserDAO {
	//查询用户  并且查询用户的身份信息
	public List<User> queryAll();
}

Mapper文件

<?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.baizhi.dao.UserDAO">
	<!-- 
		处理关联关系时  resultType无法将关系属性进行自动封装     只能处理单表简单类型(对象)
		处理关系属性赋值 :使用resultMap
		type:封装对象类型  如果是一个 直接写对象的全名(别名)  如果是多个 同样写泛型的类型
		id : resultMap的名字
	 -->
	 
	 <resultMap type="com.baizhi.entity.User" id="aaa">
	 	<!-- id标签:用来封装user中的主键的值 column属性: 数据库返回的列名   property属性: 类中属性名 -->
	 	<id column="userId" property="id"/>
	 	<!-- result标签:用来封装user中的普通属性值  column属性: 数据库返回的列名   property属性: 类中属性名 -->
	 	<result column="name" property="name"/>
	 	<result column="age" property="age"/>
	 	<result column="bir" property="bir"/>
	 	<!-- 关系属性封装 一对一  对象类型
	 		association标签: 用来处理一对一关系属性封装
	 		property属性 : 关系属性名
	 		javaType属性: 关系属性的类型
	 	 -->
	 	<association property="card" javaType="com.baizhi.entity.Card" >
	 		<id column="cardId" property="id" />
	 		<result column="no" property="no"/>
	 		<result column="address" property="address"/>
	 		<result column="fork" property="fork"/>
	 	</association>
	 </resultMap>

	<!-- resultMap: 封装对象时使用外部的哪个resultMap进行封装  书写resultMap标签的id属性 -->
	<select id="queryAll" resultMap="aaa">
		select u.id userId,u.name,u.age,u.bir,
		       c.id cardId,c.no,c.fork,c.address 
		from t_users u 
		left join t_card c 
		on  u.cardId = c.id
	</select>
</mapper>

2、一对多关系映射

2.1、数据库表

在这里插入图片描述
在这里插入图片描述

2.2、实体

package com.baizhi.entity;
import java.util.Date;
import lombok.Data;

@Data
public class Emp {
	private String id;
	private String name;
	private Integer age;
	private Double salary;
	private Date  bir;
	private Dept dept;//关系属性
}
package com.baizhi.entity;
import java.util.List;
import lombok.Data;

@Data
public class Dept {
	private String id;
	private String name;
	//关系属性
	private List<Emp> emps;
}

2.3 需求:查询部门的同时将部门中所有的员工信息一并查到

DAO接口

package com.baizhi.dao;
import java.util.List;
import com.baizhi.entity.Dept;

public interface DeptDAO {
	//查询部门的同时将部门中所有的员工信息一并查到
	public List<Dept> queryAll();
}

Mapper文件

<?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.baizhi.dao.DeptDAO">


	<resultMap type="com.baizhi.entity.Dept" id="deptMap">
		<id column="id" property="id"/>
		<result column="name" property="name"/>
		<!-- 处理关系属性的封装
			collection 用来处理封装集合类型的管理属性   用来处理一对多这种情况
			property:  关系属性名 
			javaType:  关系属性类型
			ofType  :  集合中泛型类型  全名
		 -->
		<collection property="emps" javaType="list" ofType="com.baizhi.entity.Emp">
			<id column="eid" property="id"/>
			<result  column="ename" property="name"/>
			<result column="age" property="age"/>
			<result column="salary" property="salary"/>
			<result column="bir" property="bir"/>
		</collection>
	</resultMap>

	<select id="queryAll" resultMap="deptMap">
		select d.id,d.name,e.id eid,e.name ename,e.age,e.salary,e.bir 
		from t_dept d left join t_emps e on d.id  = e.deptId
	</select>
  
</mapper>

在配置一对一维护关系,使用association 属性,维护一对多使用collection 属性

查询员工信息的同时将员工的部门信息获取

DAO接口

package com.baizhi.dao;
import java.util.List;
import com.baizhi.entity.Emp;

public interface EmpDAO {	
	//查询员工信息的同时将员工的部门信息获取
	public List<Emp> queryAll();
}

Mapper文件

<?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.baizhi.dao.EmpDAO">

	<resultMap type="com.baizhi.entity.Emp" id="empMap">
		<id column="eid" property="id"/>
		<result  column="ename" property="name"/>
		<result column="age" property="age"/>
		<result column="salary" property="salary"/>
		<result column="bir" property="bir"/>
		<!-- 封装关系属性  一对一 -->
		<association property="dept" javaType="com.baizhi.entity.Dept">
			<id column="id" property="id"/>
			<result column="name" property="name"/>
		</association>
	</resultMap>

	<select id="queryAll" resultMap="empMap">
		select d.id,d.name,e.id eid,e.name ename,e.age,e.salary,e.bir 
		from 
		t_dept d left join t_emps e on d.id  = e.deptId
	</select>
 
</mapper>

3、多对多的关系映射

多对多在数据库设计里也是使用两个一对多实现
实体类在开发时两边都是集合类型的关系属性
mapper文件自维护时使用collection标签

3.1、数据库表

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.2、实体类

package com.baizhi.entity;
import java.util.List;
import lombok.Data;

@Data
public class Student {
	private String id;
	private String name;
	private Integer age;
	private List<Course> courses;//关系属性   用来表示一个学生选了多个课程
}

package com.baizhi.entity;
import lombok.Data;

@Data
public class Course {
	private String id;
	private String name;
}

3.3、根据学生查询学生的所有课程

3.3.1、DAO接口

package com.baizhi.dao;
import java.util.List;
import com.baizhi.entity.Student;

public interface StudentDAO {
	public List<Student> queryAll();
}

3.3.2、Mapper文件

<?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.baizhi.dao.StudentDAO">


	<resultMap type="com.baizhi.entity.Student" id="studentMap">
		<id column="id" property="id"/>
		<result column="name" property="name"/>
		<result column="age" property="age"/>
		<!-- 封装课程信息 一对多   collection类型 -->
		<collection property="courses" javaType="list" ofType="com.baizhi.entity.Course">
			<id column="cid" property="id"/>
			<result column="cname" property="name"/>
		</collection>
	</resultMap>


	<select id="queryAll" resultMap="studentMap">
	  select s.id,s.name,s.age,
			 c.id cid,c.name cname 
			 from t_student s 
	         left join t_student_course sc      
	         on s.id = sc.sid
	         left join t_course c
	         on sc.cid = c.id
	</select>
    <!-- 这里需要查询3张表 -->
	
  
</mapper>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值