1. 若数据库中表的字段名和实体类中的属性名不一致,如何处理映射关系,解决方法:

(1)为查询的字段设置别名,和属性名保持一致

<!--Emp getEmpByEmpId(@Param("empId") Integer empId);-->
<select id="getEmpByEmpId" resultType="Emp" resultMap=" ">
   select emp_id empId,emp_name empName,age,gender from t_emp where emp_id = #{empId}
</select>

(2)当字段符合MySQL的要求使用_,而属性符合java的要求使用驼峰,此时可以在MyBatis的核心配置文件中设置一个全局配置,可以自动将下划线映射为驼峰
        emp_id —》empId,emp_name —》empName

mybatis-config.xml

<settings>
        <!--将下划线映射为驼峰-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

(3)使用resultMap自定义映射处理

EmpMapper.xml

<resultMap id="empResultMap" 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>
</resultMap>
<select id="getEmpByEmpId" resultMap="empResultMap">
      select * from t_emp where emp_id = #{empId}
</select>

   resultMap:设置自定义的映射关系
        id:唯一标识
        type:处理映射关系的实体类的类型

        常用的标签:
        id:处理主键和实体类中属性的映射关系
        result:处理普通字段和实体类中属性的映射关系
        association:处理多对一的映射关系(处理实体类类型的属性)
        collection:处理一对多的映射关系(处理集合类型的属性)
        column:设置映射关系中的字段名,必须是sql查询出的某个字段
        property:设置映射关系中的属性的属性名,必须是处理的实体类类型中的属性名
 

2.实体类和实体类之间的关系

  对于多对一和多对多的关系

  多(如员工):是部门的对象  private Dept dept;

  一(如部门):是员工的集合  private List<Emp> emp;

要查询员工以及对应的部门的所有信息:

  select  t_emp.*,t_dept.*  from t_emp left join t_dept on t_emp.dept_id = t_dept.dept_id  where t_emp.emp_id = 1

mybatis如何设置resultType为string mybatis自定义resulttype_实体类

<!--Emp getEmpAndDeptByEmpId(@Param("empId") Integer empId);-->
    <select id="getEmpAndDeptByEmpId" resultMap="empAndDeptResultMap">
        select
        t_emp.*,t_dept.*
        from t_emp
        left join t_dept
        on t_emp.dept_id = t_dept.dept_id
        where t_emp.emp_id = #{empId}
    </select>

查出来的结果

mybatis如何设置resultType为string mybatis自定义resulttype_ci_02

    dept类型无法映射

处理多对一的映射关系:

(1)级联方式处理

<resultMap id="empAndDeptResultMapOne" 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>
</resultMap>

<!--Emp getEmpAndDeptByEmpId(@Param("empId") Integer empId);-->
    <select id="getEmpAndDeptByEmpId" resultMap="empAndDeptResultMap">
        select
        t_emp.*,t_dept.*
        from t_emp
        left join t_dept
        on t_emp.dept_id = t_dept.dept_id
        where t_emp.emp_id = #{empId}
    </select>

 (2)association处理多对一的映射关系(处理实体类类型的属性)

<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>
        <!--
            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 getEmpAndDeptByEmpId(@Param("empId") Integer empId);-->
    <select id="getEmpAndDeptByEmpId" resultMap="empAndDeptResultMap">
        select
        t_emp.*,t_dept.*
        from t_emp
        left join t_dept
        on t_emp.dept_id = t_dept.dept_id
        where t_emp.emp_id = #{empId}
    </select>

(3)分步查询

1)第一步:根据empid查询emp表中的所有信息(包括所属的部门id)

  EmpMapper.java

public interface EmpMapper {
    //通过分步查询员工以及所对应的部门信息的第一步
    Emp getEmpAndDeptByStepOne(@Param("empId") Integer empId);
}

  EmpMapper.xml

<!--Emp getEmpAndDeptByStepOne(@Param("empId") Integer empId);-->
<select id="getEmpAndDeptByStepOne" resultMap="">
    select * from t_emp where emp_id  = #{empId}
</select>

2) 第二步:根据deptid查询dept表中的所有信息

  DeptMapper.java

public interface DeptMapper {
    //通过分步查询员工以及所对应的部门信息的第二步
    Dept getEmpAndDeptByStepTwo(@Param("deptId") Integer deptId);
}

  DeptMapper.xml

<!-- //通过分步查询员工以及所对应的部门信息的第二步
Dept getEmpAndDeptByStepTwo(@Param("deptId") Integer deptId);-->
<select id="getEmpAndDeptByStepTwo" resultType="Dept">
    select * from t_dept where dept_id = #{deptId}
</select>

3)建立联系(第一步中查询到的deptid与第二步中的deptid一致)

  EmpMapper.xml

property:设置映射关系中的属性的属性名,必须是处理的实体类类型中的属性名

select:与之建立联系的类的方法(全类名.方法)

column:设置映射关系中的字段名,必须是sql查询出的某个字段

<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>
    <association property="dept"
                 select="com.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
                 column="dept_id">
    </association>
</resultMap>