我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

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]}

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

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录