Mybatis新手误区
为什么Mybatis在多表联合查询是会出现映射错误,即获得一个null值。
首先我们来看Mapper配置文件
<resultMap type="emp" id="MyDifEmp">
<id column="e.id" property="id"/>
<result column="e.last_name" property="lastName"/>
<result column="e.gender" property="gender"/>
<result column="e.email" property="email"/>
<result column="d.id" property="dept.id"/>
<result column="d.dept_name" property="dept.departmentName"/>
</resultMap>
<!-- public Employee getEmpAndDeptById(Integer id); -->
<select id="getEmpAndDeptById" resultMap="MyDifEmp">
select e.id, e.last_name,e.gender, e.email, d.id,d.dept_name from tbl_employee e
INNER JOIN tbl_dept d ON e.d_id=d.id and e.id=#{id}
ORDER BY d.id
</select>
我们来测试一下
@Test
public void test06() throws IOException{
SqlSessionFactory sessionFactory = getSqlSessionFactory();
SqlSession openSession = sessionFactory.openSession();
try {
EmployeeMapperPlus employeeMapperPlus = openSession.getMapper(EmployeeMapperPlus.class);
// Employee employee = employeeMapperPlus.getEmpById(1);
// System.out.println(employee);
Employee employee = employeeMapperPlus.getEmpAndDeptById(1);
System.out.println(employee);
System.out.println(employee.getDept());
} finally {
openSession.close();
}
}
out:
Employee [id=1, lastName=jk, email=XXX@XXXXXX.com, gender=1]
null
我们可以看到该结果显然不是我们想要的,我们仔细分享Java代码是没错的可以执行,我们就看看配置文件和数据库表:
我们发现有字段两个表中都有字段名称相似,这样我们就得修改一下Mapper配置文件中的查询语句了
<resultMap type="emp" id="MyDifEmp">
<id column="id" property="id"/>
<result column="last_name" property="lastName"/>
<result column="gender" property="gender"/>
<result column="email" property="email"/>
<result column="did" property="dept.id"/>
<result column="dept_name" property="dept.departmentName"/>
</resultMap>
<!-- public Employee getEmpAndDeptById(Integer id); -->
<select id="getEmpAndDeptById" resultMap="MyDifEmp">
select e.id id, e.last_name last_name,e.gender gender, e.email email, d.id did,d.dept_name dept_name from tbl_employee e
INNER JOIN tbl_dept d ON e.d_id=d.id and e.id=#{id}
ORDER BY d.id
</select>
以上我们都给每个字段都取了个别名,对应就要修改resultMap里id和result里的column属性值。通过调试就获得正确结果。
out:
Employee [id=1, lastName=jk, email=XXX@XXXXXX.com, gender=1]
Department [id=1, departmentName=开发部]