mysql中resultmap_第六章:resultType和resultMap之间的秘密

一、前言

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值