实验三 Mybatis多表查询操作

文章目录

  • 实验三 Mybatis多表查询操作
      • 一、实验目的
      • 二 实验内容(以下给出示例,请自身编写程序进行练习)
      • 三 实验收获

实验三 Mybatis多表查询操作

一、实验目的

1、 掌握数据库表字段与实体类属性不同的处理方式

2、 掌握查询返回无对应实体类的处理方法

3、 掌握多表联合查询映射处理

*  字段名和属性名不一致的情况,如何处理映射关系
*   1、为查询的字段设置别名,和属性名保持一致
*   2、当字段符合MySQL的要求使用,而属性符合java的要求使用驼峰
*      此时可以在mybatis的核心配置文件中设置一个全局变量,可以自动将下划线映射为     驼峰(settings)
*      emp_id--->empId  emp_name--->empName
* 使用resultMap自定义映射处理(三种方法)
*       resultMap:设置自定义的映射关系
*       id:唯一标识
*       type:处理映射关系的实体类的类型
*       常用的标签:
*       id:处理主键和实体类中属性的映射关系
*       result:处理普通字段和实体类中属性的映射关系
*       associatin:处理多对一的映射文件(处理实体类类型的属性)
*       collection:处理一对多的映射文件(处理集合类型的属性)
*       colum:设置映射关系中字段名,必须是sql查询出的某个字段
*       property:设置映射关系中属性的属性名,必须是处理的实体类类型中属性名
*    处理多对一的映射关系:
*      1、级联方式处理
*      2、associatin:处理实体类类型的属性
*      3、分步查询
*    处理一对多的映射关系:
*    1、collection
*    2、分步查询
*
*

二 实验内容(以下给出示例,请自身编写程序进行练习)

1 解决字段名与实体类属性名不同的方法:

若字段名和实体类中的属性名不一致,可以通过resultMap设置自定义映射

1 )查询时为字段起别名,与属性名一样:

select emp_id empId ,emp_name empName, age ,gender from t_emp where emp_id=#{empId}
select * from t_emp where emp_id=#{empId}

2 )当字段名符合mysql要求,用了_,而属性名符合java驼峰规范,可以采用配置方式开启自动映射

在核心配置文件中,进行setttings的配置

  
   <settings>
     
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    settings>

3) 自定义映射resultMap

Emp getEmpByEmpId(@Param("empId") Integer empId);
<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>

2 多对一映射关系三种处理方式:

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

1 )级联方式处理映射关系

   Emp getEmpAndDeptByEmpId(@Param("empId") Integer empId);
    <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>
        <result column="dept_id" property="dept.deptId">result>
        <result column="dept_name" property="dept.deptName">result>
    resultMap>
       <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(sql语句同前)

      <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="dept" javaType="Dept">
          <id column="dept_id" property="deptId">id>
          <result column="dept_name" property="deptName">result>
      association>
  resultMap>
   
  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) 分步查询

首先,查询员工的信息:

Emp getEmpAndDeptByStepOne(@Param("empId") Integer empId);

然后,在association中用select标签调用前面准备好语句,调用时利用column标签向被调用方法传递参数

<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="dept" fetchType="eager"
                 select="edu.gdpu.mybatis.mapper.DeptMapper.getEmpAndDeptByStepTwo"
                 column="dept_id" >
    

    association>
resultMap>

<select id="getEmpAndDeptByStep" resultMap="EmpAndDeptResultMap">
    select * from t_emp where emp_id=#{empId}
select>

其次:

/**
 * 通过分步查询查询员工以及所对应的部门信息的第二步
 * @param deptId
 * @return
 */
Dept getEmpAndDeptByStepTwo(@Param("deptId") Integer deptId);

<select id="getEmpAndDeptByStepTwo" resultType="Dept">
    select * from t_dept where dept_id=#{deptId}
select>

3 一对多映射关系处理(两种处理方式)

1) 用collection

/**
 * 查询部门以及部门中员工信息
 * @param deptId
 * @return
 */

Dept getDeptAndEmpByDeptId(@Param("deptId") Integer deptId);
   <resultMap id="deptAndEmpResultMap" type="Dept">
        <id column="dept_id" property="deptId">id>
        <result column="dept_name" property="deptName">result>
        <collection property="emps" ofType="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>
        collection>
    resultMap>
    <select id="getDeptAndEmpByDeptId"  resultMap="deptAndEmpResultMap">
    SELECT
        t_dept.*,t_emp.*
    FROM  t_dept
              LEFT JOIN t_emp
                        ON t_emp.dept_id=t_dept.dept_id
    WHERE  t_dept.dept_id=#{deptId}
select>

2)分步查询

先准备好将被调用的接口及SQL映射

/**
 * 通过分步查询查询员工以及所对应的部门信息的第一步
 * @param empId
 * @return
 */
Emp getEmpAndDeptByStepOne(@Param("empId") Integer empId);

<select id="getEmpAndDeptByStepOne" resultMap="EmpAndDeptResultMapThree">
    select * from t_emp where emp_id=#{empId}
select>

然后进行主查询:

/**
 * 通过分步查询部门以及部门员工中信息的第二步
 * @param deptId
 * @return
 */
List<Emp> getDeptAndByStepTwo(@Param("deptId")Integer deptId);

    <resultMap id="deptAndEmpResultMapByStep" type="Dept">
        <id column="dept_id" property="deptId">id>
        <result column="dept_name" property="deptName">result>
        <collection property="emps"
                    select="edu.gdpu.mybatis.mapper.DeptMapper.getDeptAndByStepTwo"
                    column="dept_id">

        collection>
    resultMap>
    <select id="getDeptAndEmpByStepOne" resultMap="deptAndEmpResultMapByStep">
        select * from t_dept where dept_id=#{deptId}
    select>

三 实验收获

*通过动手操作实验,我逐渐掌握了**数据库表字段与实体类属性不同的处理方式**、**查询返回无对应实体类的处理方法**和**多表联合查询映射处理**,**在实验过程中,我也遇到了一些麻烦,但是也慢慢解决他,并弄懂了。最重要的是,感觉知识点容易忘记。*

你可能感兴趣的:(mybatis)