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>