浅谈collection标签的oftype属性能否为java.util.Map

作者:gaoshan12345678910 时间:2023-03-19 23:16:15 

collection标签的oftype属性能否为java.util.Map

基于mybatis-3.4.5.jar版本,结论是可以的。

<resultMap type="*.*.*.TestShowVO" id="testShowVO">
    <result column="APP_ID" jdbcType="VARCHAR" property="id" />
    <result column="APP_NAME" jdbcType="VARCHAR" property="name" />
    <result column="PRIORITY" jdbcType="DECIMAL" property="priority" />
    <collection property="multiLanguageList" ofType="map">
        <result column="LANGUAGE_CODE" property="languageCode" />
        <result column="TEXT" property="text" />
    </collection>
</resultMap>
<select id="getAppWithMultiLanguage"  resultMap="testShowVO">
  SELECT APP_ID ,APP_NAME,PRIORITY,LANGUAGE_CODE,TEXT from TABLE_APP left join TABLE_LANGUAGE on TABLE_LANGUAGE.DATA_ID = TABLE_APP.APP_ID
</select>

其中,ofType写成map或java.util.HashMap都是可以的,当然写成pojo的完整名也是可以的,例如ofType="a.b.c.MultiLanguageVO" 


package *.*.*;  
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class TestShowVO{
private String id;
private String name;
private Integer priority;
//private List<MultiLanguageVO> multiLanguageList;
//private List<HashMap> multiLanguageList;
private List<Map> multiLanguageList;
public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public Integer getPriority() {
return priority;
}

public void setPriority(Integer priority) {
this.priority = priority;
}

public List<Map> getMultiLanguageList() {
return multiLanguageList;
}

public void setMultiLanguageList(List<Map> multiLanguageList) {
this.multiLanguageList = multiLanguageList;
}
}

collection聚集

聚集元素用来处理&ldquo;一对多&rdquo;的关系。需要指定映射的Java实体类的属性,属性的javaType(一般为ArrayList);列表中对象的类型ofType(Java实体类);对应的数据库表的列名称; 

不同情况需要告诉MyBatis 如何加载一个聚集。MyBatis 可以用两种方式加载: 

1. select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活; 

2. resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。

例如,一个班级有多个学生。 

首先定义班级中的学生列表属性:private List<StudentEntity> studentList;

使用select实现聚集 

用法和联合很类似,区别在于,这是一对多,所以一般映射过来的都是列表。所以这里需要定义javaType为ArrayList,还需要定义列表中对象的类型ofType,以及必须设置的select的语句名称(需要注意的是,这里的查询student的select语句条件必须是外键classID)。

ClassMapper.xml文件部分内容:

<resultMap type="ClassEntity" id="classResultMap">  
   <id property="classID" column="CLASS_ID" />  
   <result property="className" column="CLASS_NAME" />  
   <result property="classYear" column="CLASS_YEAR" />  
   <association property="teacherEntity" column="TEACHER_ID"  select="getTeacher"/>  
   <collection property="studentList" column="CLASS_ID" javaType="ArrayList" ofType="StudentEntity" select="getStudentByClassID"/>  
</resultMap>  

<select id="getClassByID" parameterType="String" resultMap="classResultMap">  
   SELECT * FROM CLASS_TBL CT  
   WHERE CT.CLASS_ID = #{classID};  
</select>

StudentMapper.xml文件部分内容:

<!-- java属性,数据库表字段之间的映射定义 -->  
<resultMap type="StudentEntity" id="studentResultMap">  
    <id property="studentID" column="STUDENT_ID" />  
    <result property="studentName" column="STUDENT_NAME" />  
    <result property="studentSex" column="STUDENT_SEX" />  
    <result property="studentBirthday" column="STUDENT_BIRTHDAY" />  
</resultMap>  
 
<!-- 查询学生list,根据班级id -->  
<select id="getStudentByClassID" parameterType="String" resultMap="studentResultMap">  
    <include refid="selectStudentAll" />  
    WHERE ST.CLASS_ID = #{classID}  
</select> 

使用resultMap实现聚集 

使用resultMap,就需要重写一个sql,left join学生表。 

<resultMap type="ClassEntity" id="classResultMap">  
   <id property="classID" column="CLASS_ID" />  
   <result property="className" column="CLASS_NAME" />  
   <result property="classYear" column="CLASS_YEAR" />  
   <association property="teacherEntity" column="TEACHER_ID"  resultMap="teacherResultMap"/>  
   <collection property="studentList" column="CLASS_ID" javaType="ArrayList" ofType="StudentEntity" resultMap="studentResultMap"/>  
</resultMap>  

<select id="getClassAndTeacherStudent" parameterType="String" resultMap="classResultMap">  
   SELECT *  
     FROM CLASS_TBL CT  
          LEFT JOIN STUDENT_TBL ST  
             ON CT.CLASS_ID = ST.CLASS_ID  
          LEFT JOIN TEACHER_TBL TT  
             ON CT.TEACHER_ID = TT.TEACHER_ID  
     WHERE CT.CLASS_ID = #{classID};  
</select>

其中的teacherResultMap请见上面TeacherMapper.xml文件部分内容中。studentResultMap请见上面StudentMapper.xml文件部分内容中。

collection中的ofType="String"时

DTO:

package com.example.mybatis.entity;
import java.util.List;
/**
* 统计部门下的员工名称(只查询出员工名称)
*/
public class ListString {
   // 部门id
   private int deptId;
   // 员工名称集合
   private List<String> empNames;
   public ListString() {
   }
   public ListString(int deptId, List<String> empNames) {
       this.deptId = deptId;
       this.empNames = empNames;
   }
   // getter
   ....
   // setter
   ....
}

mapper:

    <resultMap id="deptWithEmpNameMap" type="com.example.mybatis.entity.ListString">
        <result property="deptId" jdbcType="BIGINT" column="dept_id"/>
        <collection property="empNames" ofType="String" >
            <id  column="emp_name"/>
        </collection>
    </resultMap>
    <select id="listStringTest" parameterType="Integer" resultMap="deptWithEmpNameMap">
        SELECT  deptId as 'dept_id',name as 'emp_name'
        FROM employee WHERE deptId = #{deptId};
    </select>

dao:

@Mapper
public interface EmployeeMapper {
    /**
     * 统计部门下的员工名称(只查询出员工名称)
     */
    ListString listStringTest(Integer deptId);
}

表中数据:

浅谈collection标签的oftype属性能否为java.util.Map

测试:

/**
   * 统计部门下的员工名称(只查询出员工名称)
   */
   @Test
   public void deptWithEmpNameTest(){
       ListString listString = employeeMapper.listStringTest(1);
       System.out.println(listString);
   }

输出结果:

ListString{deptId=1, empNames=[小红1, 小红2, 小红3, 小红4, 小红5, 小红6, 小红7, 小红8, 小红9, 小红10]}

来源:https://blog.csdn.net/gaoshan12345678910/article/details/82463509

标签:collection,oftype,java.util.Map
0
投稿

猜你喜欢

  • VSCode 搭建 Arm 远程调试环境的步骤详解

    2023-06-27 08:54:36
  • Java实现RedisUtils操作五大集合(增删改查)

    2023-07-13 06:33:14
  • Java String不可变性实现原理解析

    2023-11-09 23:15:53
  • nacos中的配置使用@Value注解获取不到值的原因及解决方案

    2023-11-29 13:43:00
  • SpringBoot 如何使用RestTemplate发送Post请求

    2022-03-03 09:35:47
  • 23种设计模式(19)java责任链模式

    2021-10-19 15:04:00
  • 通过与Java功能上的对比来学习Go语言

    2023-02-18 02:04:53
  • Java中Map集合的常用方法详解

    2021-12-31 16:05:54
  • Android如何自定义按钮效果

    2022-08-14 13:11:53
  • 用Newtonsoft将json串转为对象的方法(详解)

    2022-12-31 23:32:21
  • UGUI实现图片拖拽功能

    2021-06-27 18:26:24
  • Java Callable接口实现细节详解

    2023-11-10 05:34:26
  • Java后台线程操作示例【守护线程】

    2023-11-25 01:35:44
  • Kotlin标准函数与静态方法应用详解

    2022-01-21 10:45:33
  • Spring整合Mybatis思路梳理总结

    2022-04-26 03:56:12
  • Android自定义 WebView浏览器

    2023-07-21 00:31:34
  • Java中this关键字的用法详解

    2023-10-04 05:05:53
  • springmvc限流拦截器的示例代码

    2021-09-08 02:50:55
  • Android实现列表元素动态效果

    2021-07-18 07:05:22
  • MyBatis-Plus实现多数据源的示例代码

    2023-11-11 12:58:11
  • asp之家 软件编程 m.aspxhome.com