目录
前言
小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注一下!
也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习,让我们共同进步,欢迎关注!
处理数据库表之间的一对多的mybatis中及其的重要,并且需要我们掌握的
准备
先创建两张表emp(员工表),dept(部门表)如图所示:
emp(员工表)
dept(部门表)
在写出两张表对应的实体类
第一种:通过collection
思路:以通过部门id,查询部门信息,以及部门中所有员工信息为例。
mapper接口
public interface DeptMapper {
//查询部门以及部门中的员工信息(一对多collection)
Dept getDeptAndEmpByDeptId(@Param("deptId") Integer deptId);
}
DeptMapper.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.obtk.mybatis.mapper.DeptMapper">
<resultMap id="deptAndEmpResultMap" type="Dept">
<id column="dept_id" property="deptId"></id>
<result column="dept_name" property="deptName"></result>
<!--
ofType:设置集合类型的属性中存储的数据类型
-->
<collection property="emps" ofType="emp">
<id column="emp_id" property="empId"></id>
<result column="emp_name" property="empName"></result>
<result column="age" property="age"></result>
<result column="gender" property="gender"></result>
</collection>
</resultMap>
<!-- Dept getDeptAndEmpByDeptId(@Param("deptId") Integer deptId);-->
<select id="getDeptAndEmpByDeptId" resultMap="deptAndEmpResultMap">
select * FROM dept LEFT JOIN emp ON dept.dept_id =emp.dept_id WHERE
dept.dept_id=#{deptId}
</select>
</mapper>
测试
public class ResultMapTest {
@Test
public void testGetEmpAndEmpByDeptId(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
//根据部门id=1来获取部门信息及员工信息
Dept dept = mapper.getDeptAndEmpByDeptId(1);
System.out.println(dept);
}
}
结果 由此可以看出通过左连接查询出来的多个员工信息放置在emps这个集合中
Dept{deptId=1, deptName='A', emps=[Emp{empId=1, empName='张三', age=20, gender='男', dept=null}, Emp{empId=4, empName='赵六', age=24, gender='男', dept=null}]}
第二种:通过分布查询
接口
DeptMapper
public interface DeptMapper {
//通过部门id分布查询查询部门以及部门中的员工信息的第一步
Dept getDeptAndEmpByStepOne(@Param("deptId") Integer deptId);
}
EmpMapper
public interface EmpMapper {
//通过分步查询查询员工以及所对应的部门信息的第二步
List<Emp> getDeptAndEmpByStepTwo(@Param("deptId") Integer deptId);
}
DeptMapper.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.obtk.mybatis.mapper.DeptMapper">
<resultMap id="deptAndEmpResultMapByStep" type="Dept">
<id column="dept_id" property="deptId"></id>
<result column="dept_name" property="deptName"></result>
<!--此处的select中写的是第二步接口中的方法的全路径,colum中写的是第一步查出的那个数据作为第二步的参数-->
<collection property="emps"
select="com.obtk.mybatis.mapper.EmpMapper.getDeptAndEmpByStepTwo"
column="dept_id">
</collection>
</resultMap>
<!-- Dept getDeptAndEmpByStepOne(@Param("deptId") Integer deptId);-->
<select id="getDeptAndEmpByStepOne" resultMap="deptAndEmpResultMapByStep">
select * from dept where dept_id= #{deptId}
</select>
</mapper>
EmpMapper.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.obtk.mybatis.mapper.EmpMapper">
<!-- List<Emp> getDeptAndEmpByStepTwo(@Param("deptId") Integer deptId);-->
<select id="getDeptAndEmpByStepTwo" resultType="Emp">
select * from emp where dept_id=#{deptId}
</select>
</mapper>
测试
public class ResultMapTest {
@Test
public void testGetDeptAndEmpByStep(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
// 根据部门id=1来查询多条员工信息
Dept dept = mapper.getDeptAndEmpByStepOne(1);
System.out.println(dept);
}
}
结果 由此可以看出通过左连接查询出来的多个员工信息放置在emps这个集合中
Dept{deptId=1, deptName='A', emps=[Emp{empId=1, empName='张三', age=20, gender='男', dept=null}, Emp{empId=4, empName='赵六', age=24, gender='男', dept=null}]}