浅谈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版本,结论是可以的。
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
其中,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 ListmultiLanguageList; // private List multiLanguageList; private List
collection聚集
聚集元素用来处理“一对多”的关系。需要指定映射的Java实体类的属性,属性的javaType(一般为ArrayList);列表中对象的类型ofType(Java实体类);对应的数据库表的列名称;
不同情况需要告诉MyBatis 如何加载一个聚集。MyBatis 可以用两种方式加载:
1. select: 执行一个其它映射的SQL 语句返回一个Java实体类型。较灵活;
2. resultsMap: 使用一个嵌套的结果映射来处理通过join查询结果集,映射成Java实体类型。
例如,一个班级有多个学生。
首先定义班级中的学生列表属性:private List studentList;
使用select实现聚集
用法和联合很类似,区别在于,这是一对多,所以一般映射过来的都是列表。所以这里需要定义javaType为ArrayList,还需要定义列表中对象的类型ofType,以及必须设置的select的语句名称(需要注意的是,这里的查询student的select语句条件必须是外键classID)。
【浅谈collection标签的oftype属性能否为java.util.Map】ClassMapper.xml文件部分内容:
SELECT * FROM CLASS_TBL CTWHERE CT.CLASS_ID = #{classID};
StudentMapper.xml文件部分内容:
WHERE ST.CLASS_ID = #{classID}
使用resultMap实现聚集
使用resultMap,就需要重写一个sql,left join学生表。
SELECT *FROM CLASS_TBL CTLEFT JOIN STUDENT_TBL STON CT.CLASS_ID = ST.CLASS_IDLEFT JOIN TEACHER_TBL TTON CT.TEACHER_ID = TT.TEACHER_IDWHERE CT.CLASS_ID = #{classID};
其中的teacherResultMap请见上面TeacherMapper.xml文件部分内容中。studentResultMap请见上面StudentMapper.xml文件部分内容中。
collection中的ofType="String"时 DTO:
package com.example.mybatis.entity; import java.util.List; /** * 统计部门下的员工名称(只查询出员工名称) */public class ListString {// 部门idprivate int deptId; // 员工名称集合private List empNames; public ListString() {}public ListString(int deptId, List empNames) {this.deptId = deptId; this.empNames = empNames; }// getter....// setter....}
mapper:
SELECTdeptId as 'dept_id',name as 'emp_name'FROM employee WHERE deptId = #{deptId};
dao:
@Mapperpublic interface EmployeeMapper {/*** 统计部门下的员工名称(只查询出员工名称)*/ListString listStringTest(Integer deptId); }
表中数据:
文章图片
测试:
/*** 统计部门下的员工名称(只查询出员工名称)*/@Testpublic 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]}以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- cas如何实现多系统间的相互认证_cas如何实现多系统间的相互认证_浅谈认证的发展历史及方向...
- jquery对标签添加只读(readonly)或者禁用(disabled)属性
- Android技术汇总|Android应用安全开发之浅谈加密算法的坑
- 浅谈 CBDC 系统与区块链的结合应用
- POSTMAN从入门到精通系列(二十六)(使用标签)
- 记录|Qt自定义控件-----仿B站标签创建框
- 浅谈vue响应式原理及发布订阅模式和观察者模式
- 用于NLP的Python(使用Keras的多标签文本LSTM神经网络分类)
- mybatis|mybatis 实现多层级collection嵌套
- java|Mysql必知必会