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

目录
  • collection标签的oftype属性能否为java.util.Map
    • collection聚集
    • 使用select实现聚集
    • 使用resultMap实现聚集
  • collection中的ofType="String"时

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聚集

聚集元素用来处理“一对多”的关系。需要指定映射的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);
}

表中数据:

测试:

 /**
    * 统计部门下的员工名称(只查询出员工名称)
    */
    @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]}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Java中的collection集合类型总结

    Java集合是java提供的工具包,包含了常用的数据结构:集合.链表.队列.栈.数组.映射等.Java集合工具包位置是java.util.* Java集合主要可以划分为4个部分:List列表.Set集合.Map映射.工具类(Iterator迭代器.Enumeration枚举类.Arrays和Collections). Java集合工具包框架如下图. 说明:看上面的框架图,先抓住它的主干,即Collection和Map. Collection是一个接口,是高度抽象出来的集合,它包含了集合的基本操作

  • JAVA容器集合全面解析(Collection和Map)

    目录 前言 一.Collection集合 1.1List集合 1.1.1ArrayList集合 1.1.2LinkedList集合 1.2Set集合 1.2.1HashSet集合 HashSet集合保证元素唯一性源码分析: 1.2.2TreeSet集合 比较器排序Comparator的使用: 二.Map集合 2.1Map集合的概述与特点 2.2Map集合的获取功能 2.3Map集合的遍历方式(方式一) 2.4Map集合的遍历方式(方式二) 2.5HashMap集合 前言 本次我将分享的是java

  • Java中Collection、List、Set、Map之间的关系总结

    初学java,单个的接触有点迷糊,所以总结下他们的关系 一.关系 Collection --List:以特定顺序存储 --ArrayList.LinkList.Vector --Set:不能包含重复的元素 --HashSet.TreeSet Map --HashMap.HashTable.TreeMap 二.分别讲解 Collection:Collection是一个父接口,List和Set是继承自他的子接口,Collection是最基本的集合接口,Java SDK中不提供直接继承自Collect

  • 浅谈Java中常用数据结构的实现类 Collection和Map

    线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文试图通过简单的描述,向读者阐述各个类的作用以及如何正确使用这些类. Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └WeakHashMap Collection接口 Collection是最基本的集合接口,一个C

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

    目录 collection标签的oftype属性能否为java.util.Map collection聚集 使用select实现聚集 使用resultMap实现聚集 collection中的ofType="String"时 collection标签的oftype属性能否为java.util.Map 基于mybatis-3.4.5.jar版本,结论是可以的. <resultMap type="*.*.*.TestShowVO" id="testShow

  • 浅谈AngularJs指令之scope属性详解

    AngularJS使用directive()方法类定义一个指令: .directive("name",function(){ return{ }; }) 上面是定义一个指令的主体框架,该方法接受两个参数: 1.第一个参数:name表示定义的指令的名称(angularjs会用这个name注册这个指令) 2.第二个参数:函数,该番薯必须返回一个对象或者一个函数,但通常我们会返回一个对象.return后接的就是返回的对象. 在返回的对象中有一个scope属性,这个属性用来修饰指令的作用域.

  • 浅谈linux rwxrwxrwt文件夹属性

    /tmp 的permission是rwxrwxrwt chmod 0777 /abc       rwxrwxrwx chmod  777 /abc        rwxrwxrwx chmod 1777  /abc      rwxrwxrwt The "t" character in your permission indicates that only the user (and the root) that has created the file inside of /tmp

  • 浅谈dataframe中更改列属性的方法

    在读取文件时将整数变量读成了字符串, 或者需要转换列属性时,通过方法astype Python中 举例: dataframe.numbers=dataframe.numbers.astype(float) province.id=province.id.astype(str) R中 举例: data<-read.csv('data.csv',col.names = c('id','sex','numbers'),stringsAsFactors=FALSE),stringsAsFactors=F

  • 浅谈JavaScript 中的延迟加载属性模式

    目录 一.前言 二.按需属性模式 三.凌乱的延迟加载属性模式 四.类的唯一自己的延迟加载属性模式 五.对象字面量的延迟加载属性模式 六.结论 一.前言 传统上,开发人员在 JavaScript 类中为实例中可能需要的任何数据创建属性.对于在构造函数中随时可用的小块数据来说,这不是问题.但是,如果在实例中可用之前需要计算某些数据,您可能不想预先支付该费用.例如,考虑这个类: class MyClass { constructor() { this.data = someExpensiveCompu

  • 浅谈JSONObject的使用及示例代码(JSON解析)

    JSONObject只是一种数据结构,可以理解为JSON格式的数据结构(key-value 结构),可以使用put方法给json对象添加元素.JSONObject可以很方便的转换成字符串,也可以很方便的把其他对象转换成JSONObject对象. 简介 在程序开发过程中,在参数传递,函数返回值等方面,越来越多的使用JSON.JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,同时也易于机器解析和生成.易于理解.阅读和撰写,而且Json采用完全独立于语言的文本

  • 浅谈Java中FastJson的使用

    FastJson的使用 使用maven导入依赖包 <!--下边依赖跟aop没关系,只是项目中用到了 JSONObject,所以引入fastjson--> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.70</version> </dependency> 常用方法:

  • resultMap标签中里的collection标签详解

    目录 resultMap标签中的collection标签 collection(一对多) collection标签中各属性的说明 resultMap标签中的collection标签 collection(一对多) 元素的作用和association元素的作用差不多一样,事实上,它们非常类似,也是映射到JavaBean的某个“复杂类型” 属性,只不过这个属性是一个集合列表,即JavaBean内部嵌套一个复杂数据类型(集合).和使用association元素一样,我们使用嵌套查询, 或者从连接中嵌套

  • 浅谈常用字符串与集合类转换的工具类

    在项目中,我们经常需要把接收到的字符串转换成对应的集合类保存,或者把集合类转换成字符串以方便传输,这个工具类中封装了几个常用的方法,对于这种转换需求十分方便. import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Properties; import java.u

  • JavaWeb开发之JSTL标签库的使用、 自定义EL函数、自定义标签(带属性的、带标签体的)

    JSTL  JSTL简介: JSTL的全称:JSP Standard Tag Library,JSP标准标签库 JSTL的作用: 提供给Java Web开发人员一个标准通用的标签函数库 和EL来取代传统直接在页面上嵌入Java程序(Scripting)的做法,以提高程序可读性.维护性和方便性 JSTL的版本: JSTL的主要版本是1.0.1.1和1.2(区别不大) 1.0版本EL表达式还没有纳入官方规范 1.1和1.2版本EL表达式已经纳入了官方规范 JSTL1.1 下载相应的jar包 JSTL

随机推荐