目录
resultMap简介
resultMap的用法
id & result
constructor
association
嵌套查询
嵌套结果
collection
嵌套查询
嵌套结果
discriminator
在前面两篇文章中,我们都是通过使用select元素的resultType属性指定查询结果的返回值类型,来让MyBatis自动将查询结果集封装成我们希望的类型进行返回。
resultType属性非常有用,但在返回结果类型比较复杂的情况下却无能为力,为此,MyBatis在select元素中还为我们提供了另外一个resultMap属性,用于引用一个使用
/*用来将查询结果作为参数注入到实例的构造方法中*/
/*标记结果作为 ID*/
/*标记结果作为普通参数*/
/*一个ID结果,标记结果作为 ID*/
/*一个普通结果,JavaBean的普通属性或字段*/
/*关联其他的对象*/
/*关联其他的对象集合*/
/*鉴别器,根据结果值进行判断,决定如何映射*/
/*结果值的一种情况,将对应一种映射规则*/
在一个
属性 | 描述 |
column | 从数据库中查询到的结果集的列名或列别名 |
property | 将 column属性指定的列结果映射到对象的哪个属性 |
javaType | 列结果在对象中所对应的Java数据类型,返回类型为Map时需指定 |
jdbcType | 列结果在数据库中所支持的JDBC 类型 |
typeHandler | 所使用的类型处理器 |
为了未来的参考,MyBatis 通过包含的 jdbcType 枚举型,支持下面的 JDBC 类型。
BIT | FLOAT | CHAR | TIMESTAMP | OTHER | UNDEFINED |
TINYINT | REAL | VARCHAR | BINARY | BLOB | NVARCHAR |
SMALLINT | DOUBLE | LONGVARCHAR | VARBINARY | CLOB | NCHAR |
INTEGER | NUMERIC | DATE | LONGVARBINARY | BOOLEAN | NCLOB |
BIGINT | DECIMAL | TIME | NULL | CURSOR | ARRAY |
使用
例如,为了防止由于数据库学生表中的年龄字段长期未更新,而导致查询出来的学生年龄信息不准确,我们希望查询学生信息时根据学生的生日计算出学生的年龄,而不再直接从数据库中获取学生的年龄信息。
首先在学生实体类StudentEntity中增加如下构造方法:
private static final SimpleDateFormat yearFormat = new SimpleDateFormat(
"yyyy");
public StudentEntity(Long studentId, Date studentBirthday) {
super();
this.studentId = studentId;
if (null != studentBirthday) {
this.studentBirthday = studentBirthday;
int startYear = Integer
.parseInt(yearFormat.format(studentBirthday));
int nowYear = Integer.parseInt(yearFormat.format(new Date()));
this.studentAge = nowYear - startYear;
}
}
相应的Mapper配置如下。
注意:使用
public class StudentEntity {
private Long studentId;
private String studentName;
private ClassEntity studentClass;
//此处省略get和set方法
}
MyBatis提供了两种不同的方式用来处理这种对象关联查询:嵌套查询和嵌套结果。
所谓嵌套查询,指的是通过执行另外一个 SQL 映射语句来返回所关联的对象类型。
注:
所谓嵌套结果,指的是通过联表查询将所需的所有字段内容先查询出来,再通过级联属性映射来创建复杂类型的结果对象。
s.STUDENT_ID AS STUDENT_ID,
s.STUDENT_NAME AS STUDENT_NAME,
c.CLASS_ID AS CLASS_ID,
c.CLASS_NAME AS CLASS_NAME
此时的resultMap还可以写为如下两种形式。
public class ClassEntity {
private Long classId;
private String className;
private List students;
//此处省略get和set方法
}
c.CLASS_ID AS CLASS_ID,
c.CLASS_NAME AS CLASS_NAME,
s.STUDENT_ID AS STUDENT_ID,
s.STUDENT_NAME AS STUDENT_NAME
此时的resultMap也可以写为如下形式。
此时的resultMap也可以写为如下形式。
注:在使用