数据库两张表 :
Employee 员工表
Dept 部门表
-- emp员工表中存储的是 员工的信息
-- dept部门表中存储的是 部门的信息
-- 员工表和部门表中的共有属性是:部门编号,部门编号是一样的
需求:通过部门编号查询部门,并查询该部门所有的员工
实体类
Dept 部门
/***
* 部门实体类
*/
public class Dept {
private Integer did; //部门id
private String dname; //部门名称
/*
* 一个员工对应一个部门,这是一对一关系。
* 那么一个部门对应多个员工,这是一对多关系。
*
* 定义一个集合,存储这个部门中的所有员工
*/
private ArrayList<Employee> list;
//......省略set/get/toString 方法
}
ps:部门实体类中存在一个List集合,存放该部门所有的员工,这是一对多关系
Employee 员工
package com.mybatis.bean;
/**
* 员工类实体
*/
public class Employee {
//实体类字段建议和数据库字段名一致
private Integer id; //员工id
private String name; //员工姓名
private String sex; //性别
private Integer money; //工资
//部门实体类 成员变量
private Dept dept;
//.....省略set get toString方法
}
持久层
/**
* Employee 的持久层接口
*/
public interface EmployeeMapper {
//根据部门查询所有的员工
public abstract ArrayList<Employee> findEmpByDeptId(Integer id);
}
/**
* 操作部门的DAO接口
*/
public interface DeptMapper {
//根据部门id查询部门, 以及部门下的所有员工
public abstract Dept findDeptEmpByid(Integer id);
/* 分步查询:
* 1.根据部门id查询部门信息, 在通过部门id查询员工表的员工
*/
public abstract Dept findDeptEmpByIdStep(Integer id);
}
SQL映射文件
<!-- 操作Employee表的SQL映射文件 -->
<?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.mybatis.dao.EmployeeMapper"> <!--命名空间绑定持久层 -->
<!-- 通过部门id查询员工表 -->
<select id="findEmpByDeptId" resultType="com.mybatis.bean.Employee">
SELECT * FROM employee WHERE dept_id = #{id}
</select>
</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.mybatis.dao.DeptMapper">
<!-- 该xml是 操作Dept部门表的 SQL映射文件 -->
<!-- 第一种方式:(两张表一起查询) 利用collection封装集合结果集 -->
<!-- 根据部门id查询部门以及员工的结果集 封装规则 -->
<resultMap type="com.mybatis.bean.Dept" id="deptOfEmps">
<id column="dept_id" property="did"/> <!--主键字段封装 -->
<!-- 普通字段封装 -->
<result column="dept_name" property="dname" />
<!-- collection标签,定义关联集合类型的封装规则
property: 指定关联的集合 (dept对象的list属性)
ofType: 指定集合存放的元素类型,指定员工类型
-->
<collection property="list" ofType="com.mybatis.bean.Employee">
<!-- 定义集合中的元素封装规则 (Employee 封装规则) -->
<id column="emp_id" property="id" /> <!-- 定义主键字段封装规则 -->
<!-- 普通字段封装规则 -->
<result column="emp_name" property="name" />
<result column="emp_money" property="money"/>
<result column="emp_sex" property="sex"/>
</collection>
</resultMap>
<!-- 根据部门id查询 该部门信息以及部门所有员工信息
public abstract Dept findDeptEmpByid(Integer id); -->
<select id="findDeptEmpByid" resultMap="deptOfEmps"> <!-- 指定封装规则 -->
SELECT
d.did dept_id, d.dname dept_name,e.id emp_id , e.name emp_name, e.money emp_money,e.sex emp_sex
FROM
employee e JOIN dept d ON e.dept_id = d.did
WHERE
e.dept_id = #{id}
</select>
<!-- 第二种方式
分步查询: 根据部门id查询部门以及部门的所有员工
1.先查询出部门信息 (查询Dept部门表)
2.在通过部门id查询员工表 (Employee)
将两次查询出来的结果封装成Dept对象
-->
<resultMap type="com.mybatis.bean.Dept" id="deptOfEmpsStep">
<id column="did" property="did"/>
<result column="dname" property="dname"/>
<!-- collection 定义关联集合类型的封装规则
property:指定关联属性
ofType:指定集合中存放元素类型
分步查询 :
select:指定封装的结果集数据 是调用哪一个SQL映射文件方法得到的
column:指定将结果集中的那一列传递给 (select指定的方法)
-->
<collection property="list" ofType="com.mybatis.bean.Employee"
select="com.mybatis.dao.EmployeeMapper.findEmpByDeptId" column="did">
</collection>
<!-- 如果分步查询,需要传递多个参数,mybatis会将参数封装成map集合
column={column1,column2} -->
</resultMap>
<!-- 分步查询 -->
<select id="findDeptEmpByIdStep" resultMap="deptOfEmpsStep">
SELECT * FROM dept where did = #{id}
</select>
</mapper>
ps:将查询出来的员工对象封装到Dept对象中List集合,需要使用到collection标签
Main调用
public static void main(String[] args) throws IOException {
String resource = "mybatis_config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
EmployeeMapper empMmapper = session.getMapper(EmployeeMapper.class); //利用反射创建employee的持久层实现类
DeptMapper deptMapper = session.getMapper(DeptMapper.class); //利用反射创建 Dapt的持久层实现类
//----------------------分隔线------------------------------
//根据部门id查询部门信息与部门的所有员工 ---->> 直接查询
Dept dept2 = deptMapper.findDeptEmpByid(2);
System.out.println(dept2.toString());
//根据部门id查询部门信息与部门的所有员工 --->> 分步查询
Dept dept3 = deptMapper.findDeptEmpByIdStep(2);
System.out.println(dept3.toString());
}