当数据可以表项名与javaBean的属性不对应的时候,要是符合驼峰命名法可以在全局配置文件开启驼峰命名法的对应关系例如(数据库:last_name,JavaBean : lastName),此外可以查询是进行重命名。
但是resultMap可以自己设置封装规则。如下
他的另一个作用就是进行级联查询:
进行级联查询:通过id查员工以及所在部门,(部门是外键)
employee 表
部门表
想要执行的查询的语句。
select e.id as id,e.last_name as last_name,e.email as email,e.gender as gender ,
e.d_id as d_id,d.dept_name as dept_name from dept as d,employee as e where d.id=e.d_id and e.id=5;
javaBean如下:
级联查询赋值时,按照类访问属性的方式进行赋值,
注意:column属性的值是sql语句查询出来的语句。并且id要放在第一位,不然报错。
级联查询的另一种引用对象赋值方法:
利用association属性进行查询,
<association>属性就是子对象赋值,property是在emloyee类中,哪一个属性是引用类型,javaType是此属性对应的类,然后进行赋值。
级联查询之分步查询
还是employee和department类两个,属性如下:
public class Department
{
private Integer id;
private String dept_name;
}
public class Employee
{
private Integer id;
private String lastName;
private String email;
private String gender;
private Department department;
}
EmployeeMapper和DepartmentMapper接口
public interface EmployeeMapperPlus {
public Employee getEmpANndDeptByIdStep(Integer id);
}
public interface DepartmentMapper {
public Department getDepById(int id);
}
EmployeeMapper.xmlr和DepartmentMapper.xml接口
***employeeMapper***:
<resultMap id="myMapStep" type="test.Employee">
<!-- 用id和result都可以封装 id定义主键(底部有优化) result封装普通类 -->
<id column="id" property="id"></id>
<result column="last_name" property="lastName"></result>
<result column="email" property="email"></result>
<result column="gender" property="gender"></result>
<association property="department" select="com.company.DepartmentMapper.getDepById" column="d_id"></association>
</resultMap>
<select id="getEmpANndDeptByIdStep" resultMap="myMapStep">
select * from employee where id = #{id}
</select>
***DepartmentMapper.xml***:
<mapper namespace="com.company.DepartmentMapper">
<select id="getDepById" resultType="test.Department">
select id,dept_name from dept where id = #{id}
</select>
</mapper>
延迟加载:
像上面的级联查询,只要在需要查询员工的Department时才查询级联的查询,否则只需要查询第一步查询,而不需要查询department。
例如 :
Employee employee = mapper.getEmpANndDeptByIdStep(5);
System.out.println(employee.getLastName());
只查询第一步,而不查询department。
只需要在全局配置文件里加上如下设置。
<settings>
<setting name="aggressiveLazyLoading" value="false"/>
<setting name="lazyLoadingEnable" value="true"/>
</settings>