目录
前言
小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注一下!
也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习,让我们共同进步,欢迎关注!
处理数据库表之间的多对一的mybatis中及其的重要,并且需要我们掌握的
准备
先创建两张表emp(员工表),dept(部门表)如图所示:
emp(员工表)
dept(部门表)
在写出两张表对应的实体类
第一种:级联方式处理
思路:通过员工的id来查询员工的信息及部门的信息
mapper接口
public interface EmpMapper {
//根据员工id获取左外连接员工以及对应的部门信息
Emp getEmpAndByEmpId(@Param("empId") Integer empId);
}
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">
<resultMap id="empAndDeptResultMap" type="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>
<!--部门中的字段dept_id与Emp实体类中的属性dept中的deptId相对应 -->
<!--部门中的字段dept_name与Emp实体类中的属性dept中的deptName相对应 -->
<result column="dept_id" property="dept.deptId"></result>
<result column="dept_name" property="dept.deptName"></result>
</resultMap>
<!-- Emp getEmpAndByEmpId(@Param("empId")Integer empId);
员工表和部门表左外连接-->
<select id="getEmpAndByEmpId" resultMap="empAndDeptResultMap">
select emp.*,dept.* FROM emp LEFT JOIN dept ON emp.dept_id =dept.dept_id WHERE emp.emp_id=#{empId}
</select>
</mapper>
测试
public class ResultMapTest {
// 两张表实现左外连接查询内容
@Test
public void testGetEmpAndByEmpId(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
// 根据员工id来查询
Emp empAndByEmpId = mapper.getEmpAndByEmpId(1);
System.out.println(empAndByEmpId);
}
}
结果 由此可以看到查询的部门信息放置在dept这个属性里面
第二种:通过association
mapper接口
public interface EmpMapper {
//根据员工id获取左外连接员工以及对应的部门信息
Emp getEmpAndByEmpId(@Param("empId") Integer empId);
}
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">
<resultMap id="empAndDeptResultMap2" type="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>
<!--
将单独的dept分别来设置
association:处理多对一的映射关系(处理实体类类型的属性)
property:设置需要处理映射关系的属性的属性名
javaType:设置要处理的属性的类型的(实体类)
-->
<association property="dept" javaType="Dept">
<id column="dept_id" property="deptId"></id>
<result column="dept_name" property="deptName"></result>
</association>
</resultMap>
<!-- Emp getEmpAndByEmpId(@Param("empId")Integer empId);-->
<select id="getEmpAndByEmpId" resultMap="empAndDeptResultMap2">
select emp.*,dept.* FROM emp LEFT JOIN dept ON emp.dept_id =dept.dept_id WHERE emp.emp_id=#{empId}
</select>
</mapper>
测试
public class ResultMapTest {
// 两张表实现左外连接查询内容
@Test
public void testGetEmpAndByEmpId(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
// 根据员工id来查询
Emp empAndByEmpId = mapper.getEmpAndByEmpId(1);
System.out.println(empAndByEmpId);
}
}
结果 由此可以看到和第一种差不多
第三种:通过分步查询
接口
EmpMapper
public interface EmpMapper {
//通过分步查询查询员工以及所对应的部门信息的第一步
Emp getEmpAndDeptByStepOne(@Param("empId") Integer empId);
}
DeptMapper
public interface DeptMapper {
// 通过分布查询员工以及所对应的部门信息的第二步(多对一)
Dept getEmpAndDeptBySteptTwo(@Param("deptId") Integer deptId);
}
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">
<resultMap id="empAndDeptByStepResultMap" type="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>
<!-- <result column="dept_id" property="dept.deptId"></result>
<result column="dept_name" property="dept.deptName"></result>-->
<!-- property:设置需要处理映射关系的属性的属性名
select:设置分布查询的sql的唯一标识
column:将查询出的某个字段作为分布查询的sql的条件
fetchType:在全局配置中开启了延迟加载的环境时,
通过该属性设置当前的分布查询是否使用延迟加载
fetchType="eager"(立即加载)/Lazy(延迟加载)
-->
<association property="dept" select="com.obtk.mybatis.mapper.DeptMapper.getEmpAndDeptBySteptTwo"
column="dept_id" fetchType="eager">
</association>
</resultMap>
<!-- Emp getEmpAndDeptByStepOne(@Param("empId")Integer empId);-->
<select id="getEmpAndDeptByStepOne" resultMap="empAndDeptByStepResultMap">
select * from emp where emp_id =#{empId};
</select>
</mapper>
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">
<!--Dept getEmpAndDeptBySteptTwo(@Param("deptId") Integer deptId);-->
<select id="getEmpAndDeptBySteptTwo" resultType="Dept">
select * from dept where dept_id = #{deptId};
</select>
</mapper>
测试
public class ResultMapTest {
@Test
public void testGetEmpAndDeptByStep(){
SqlSession sqlSession = SqlSessionUtil.getSqlSession();
EmpMapper mapper = sqlSession.getMapper(EmpMapper.class);
// 通过员工id=1来查询
Emp emp = mapper.getEmpAndDeptByStepOne(1);
// System.out.println(emp.getEmpName());
System.out.println(emp);
}
}
结果