Java培训MyBatis 映射文件之select|resultType|resultMap

发布时间:2019年09月04日作者:atguigu浏览次数:1,650

select查询的几种情况

  • 查询单行数据返回单个对象

public Employee getEmployeeById(Integer id );

 

  • 查询多行数据返回对象的集合

public List<Employee> getAllEmps();

 

  • 查询单行数据返回Map集合

public Map<String,Object> getEmployeeByIdReturnMap(Integer id );

 

  • 查询多行数据返回Map集合

@MapKey(“id”) // 指定使用对象的哪个属性来充当map的key

public Map<Integer,Employee>  getAllEmpsReturnMap();

 

resultType自动映射

  • autoMappingBehavior默认是PARTIAL,开启自动映射的功能。唯一的要求是列名和javaBean属性名一致
  • 如果autoMappingBehavior设置为null则会取消自动映射
  • 数据库字段命名规范,POJO属性符合驼峰命名法,如A_COLUMNaColumn,我们可以开启自动驼峰命名规则映射功能,mapUnderscoreToCamelCase=true

resultMap自定义映射

  • 自定义resultMap,实现高级结果集映射
  • id :用于完成主键值的映射
  • result :用于完成普通列的映射
  • association :一个复杂的类型关联;许多结果将包成这种类型
  • collection : 复杂类型的集

      1  id&result

Java培训

<select id=“getEmployeeById” resultMap=“myEmp”>

                  select id, last_name,email, gender from tbl_employee where id =#{id}

</select>

 

<resultMap type=“com.atguigu.mybatis.beans.Employee” id=“myEmp”>

                  <id column=“id”  property=“id” />

                  <result column=“last_name” property=“lastName”/>

                  <result column=“email” property=“email”/>

                  <result column=“gender” property=“gender”/>

</resultMap>

 

       2  association

  • POJO中的属性可能会是一个对象,我们可以使用联合查询,并以级联属性的方式封装对象.使用association标签定义对象的封装规则

public class Department {

         private Integer id ;

         private String departmentName ;

//  省略 get/set方法

}

 

public class Employee {

         private Integer id ;

         private String lastName;

         private String email ;

         private String gender ;

         private Department dept ;

    // 省略 get/set方法

}

 

 

  • 使用级联的方式:

<select id=“getEmployeeAndDept” resultMap=“myEmpAndDept” >

                  SELECT e.id eid, e.last_name, e.email,e.gender ,d.id did, d.dept_name FROM tbl_employee e , tbl_dept d   WHERE e.d_id = d.id  AND e.id = #{id}

</select>

 

         <resultMap type=“com.atguigu.mybatis.beans.Employee” id=“myEmpAndDept”>

                  <id column=“eid” property=“id”/>

                  <result column=“last_name” property=“lastName”/>

                  <result column=“email” property=“email”/>

                  <result column=“gender” property=“gender”/>

             <!– 级联的方式 –>

                  <result column=“did” property=“dept.id”/>

                   <result column=“dept_name” property=“dept.departmentName”/>

</resultMap>

 

  • Association‘

<resultMap type=“com.atguigu.mybatis.beans.Employee” id=“myEmpAndDept”>

                  <id column=“eid” property=“id”/>

                  <result column=“last_name” property=“lastName”/>

                  <result column=“email” property=“email”/>

                  <result column=“gender” property=“gender”/>

                  <association property=“dept” javaType=“com.atguigu.mybatis.beans.Department”>

                          <id column=“did” property=“id”/>

                          <result column=“dept_name” property=“departmentName”/>

                  </association>

</resultMap>

 

       3  association 分步查询

  • 实际的开发中,对于每个实体类都应该有具体的增删改查方法,也就是DAO层, 因此

对于查询员工信息并且将对应的部门信息也查询出来的需求,就可以通过分步的方式

完成查询。

  • 先通过员工的id查询员工信息
  • 再通过查询出来的员工信息中的外键(部门id)查询对应的部门信息.

<select id=“getEmployeeAndDeptStep” resultMap=“myEmpAndDeptStep”>

                   select id, last_name, email,gender,d_id  from tbl_employee where id =#{id}

</select>

 

<resultMap type=“com.atguigu.mybatis.beans.Employee” id=“myEmpAndDeptStep”>

                  <id column=“id”  property=“id” />

                  <result column=“last_name” property=“lastName”/>

                  <result column=“email” property=“email”/>

                  <result column=“gender” property=“gender”/>

                  <association property=“dept”                       select=“com.atguigu.mybatis.dao.DepartmentMapper.getDeptById”

                                   column=“d_id” fetchType=“eager”>

                  </association>

</resultMap>

 

       4  association 分步查询使用延迟加载

  • 在分步查询的基础上,可以使用延迟加载来提升查询的效率,只需要在全局的

Settings中进行如下的配置:

<!– 开启延迟加载 –>

<setting name=“lazyLoadingEnabled” value=“true”/>

<!– 设置加载的数据是按需还是全部 –>

<setting name=“aggressiveLazyLoading” value=“false”/>

 

       5 collection

  • POJO中的属性可能会是一个集合对象,我们可以使用联合查询,并以级联属性的方式封装对象.使用collection标签定义对象的封装规则

public class Department {

         private Integer id ;

         private String departmentName ;

         private List<Employee> emps ;

}

  • Collection

<select id=“getDeptAndEmpsById” resultMap=“myDeptAndEmps”>

                  SELECT d.id did, d.dept_name ,e.id eid ,e.last_name ,e.email,e.gender

                  FROM tbl_dept d  LEFT OUTER JOIN tbl_employee e ON  d.id = e.d_id

                  WHERE d.id = #{id}

         </select>

         <resultMap type=“com.atguigu.mybatis.beans.Department” id=“myDeptAndEmps”>

                  <id column=“did” property=“id”/>

                  <result column=“dept_name” property=“departmentName”/>

                  <!–

                          property: 关联的属性名

                          ofType: 集合中元素的类型

                   –>

                  <collection property=“emps”  ofType=“com.atguigu.mybatis.beans.Employee”>

                          <id column=“eid” property=“id”/>

                          <result column=“last_name” property=“lastName”/>

                          <result column=“email” property=“email”/>

                          <result column=“gender” property=“gender”/>

                  </collection>

</resultMap>

 

       6 collection 分步查询

  • 实际的开发中,对于每个实体类都应该有具体的增删改查方法,也就是DAO层, 因此

对于查询部门信息并且将对应的所有的员工信息也查询出来的需求,就可以通过分步的方式完成查询。

  • 先通过部门的id查询部门信息
  • 再通过部门id作为员工的外键查询对应的部门信息.

<select id=“getDeptAndEmpsByIdStep” resultMap=“myDeptAndEmpsStep”>

                 select id ,dept_name  from tbl_dept where id = #{id}

          </select>

          <resultMap type=“com.atguigu.mybatis.beans.Department” id=“myDeptAndEmpsStep”>

                 <id column=“id” property=“id”/>

                 <result column=“dept_name” property=“departmentName”/>

                 <collection property=“emps”

                                  select=“com.atguigu.mybatis.dao.EmployeeMapper.getEmpsByDid”

                                  column=“id”>

                 </collection>

 </resultMap>

 

       7. collection 分步查询使用延迟加载

       8 扩展: 分步查询多列值的传递

  • 如果分步查询时,需要传递给调用的查询中多个参数,则需要将多个参数封装成

Map来进行传递,语法如下: {k1=v1, k2=v2….}

  • 在所调用的查询方,取值时就要参考Map的取值方式,需要严格的按照封装map

时所用的key来取值.

       9 扩展: association 或 collection的 fetchType属性

  • 在<association> 和<collection>标签中都可以设置fetchType,指定本次查询是否要使用延迟加载。默认为 fetchType=”lazy” ,如果本次的查询不想使用延迟加载,则可设置为

fetchType=”eager”.

  • fetchType可以灵活的设置查询是否需要使用延迟加载,而不需要因为某个查询不想使用延迟加载将全局的延迟加载设置关闭.

想要了解跟多关于Java培训课程内容欢迎关注尚硅谷Java培训,尚硅谷除了这些技术文章外还有免费的高质量Java培训课程视频供广大学员下载学习。


上一篇:
下一篇:
相关课程

java培训 大数据培训 前端培训 UI/UE设计培训

关于尚硅谷
教育理念
名师团队
学员心声
资源下载
视频下载
资料下载
工具下载
加入我们
招聘岗位
岗位介绍
招贤纳师
联系我们
全国统一咨询电话:010-56253825
地址:北京市昌平区宏福科技园2号楼3层(北京校区)

深圳市宝安区西部硅谷大厦B座C区一层(深圳校区)

上海市松江区谷阳北路166号大江商厦6层(上海校区)

武汉市东湖高新开发区东湖网谷(武汉校区)