一、前言
Mybatis 中 select 元素有两个属性 resultType 和 resultMap,工作中会经常使用到他们,也看过一些开源的后台管理框架,也是各有所用,那么在我们的日常开发中,应该如何正确的选择它们呢?下面我们会对这两个属性分别进行讲解和演示,这里我们先给出 MySQL 的建表语句以及实体类代码。
1、建表语句:
CREATE TABLE `emp` (
`emp_no` int(4) NOT NULL,
`e_name` varchar(10) DEFAULT NULL,
`job` varchar(10) DEFAULT NULL,
`mgr` int(4) DEFAULT NULL,
`sal` double(7,2) DEFAULT NULL,
`comm` double(7,2) DEFAULT NULL,
`dept_no` int(2) DEFAULT NULL,
`hire_date` date DEFAULT NULL,
PRIMARY KEY (`emp_no`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2、Employee.java:
public class Employee {
private Integer empNo;
private String eName;
private String job;
private Integer mgr;
private Double sal;
private Double comm;
private Integer deptNo;
private Date hireDate;
private Integer workAge;
// 此处省略了setter、getter方法、toString方法以及构造方法}
二、resultType 的使用
emp_no AS "empNo",
e_name AS "eName",
job AS "job",
mgr AS "mgr",
sal AS "sal",
comm AS "comm",
dept_no AS "deptNo",
hire_date AS "hireDate"
select
from emp
此处对字段我是用了一个 sql 标签进行包裹,sql 字段可复用,也可直接写到 sql 语句的 select 后面,可自行选择。需要说明的一点是,如果数据库字段与实体类字段完全匹配,字段是可以不添加别名的,如果不是完全匹配,则必须添加别名,只用这样才能使数据库字段映射列到 JavaBean 的属性上。我们来看一下测试的结果:
@Test
public void test01() throws IOException {
EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
List list = employeeMapper.findList1();
list.forEach(item -> System.out.println(item));
}
这就是 resultType 的使用,十分的简单。
三、resultMap 的使用
与 resultType 相比,resultMap就要强大许多,它不仅能够用于简单查询,还能用于级联查询以及缓存功能,级联查询会在后续的章节进行讲解,可谓是十分的强大。下面我们就使用一个简单的例子,来了解一下 resultMap 的使用。
例子:现在在数据库员工表中有三条数据,每条数据都有一个 hire_date 字段,表示入职时间,现在我想查询操作完成后,在返回的结果集中,自动算出每个员工的工作年限,对应实体类中的 workAge 字段。
1、在 Employee.java 实体类中,添加一个构造方法,用于计算 workAge:
public Employee(Date tempDate) {
this.hireDate = tempDate;
SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
this.workAge = Integer.valueOf(sdf.format(new Date())) - Integer.valueOf(sdf.format(this.hireDate));
}
2、编写 resultMap 代码块,使用 constructor标签来调用实体类中实现的构造函数:
3、编写对应的查询语句:
select * from emp
4、编写单元测试:
@Test
public void test02() throws IOException {
EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
List list = employeeMapper.findList2();
list.forEach(item -> System.out.println(item));
}
5、查看输出结果:
可以看出,已经计算出了 workAge,并赋值给了结果集,这种效果使用 resultType 是无法直接得到的,需要再进行业务代码的编写才可以实现。
本章代码已经上传到码云:
JavaEE企业级分布式架构核心技术配套源码地址:AlanShelby/Course-Chapter