1. 查询时,需要查询结果中的列名与返回值类型中的属性名保持一致
假设在t_user
表中添加了新的名为is_delete
的字段:
alter table t_user add column is_delete int;
则对应的User
类中也应该添加新的属性,以与对应:
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
private String phone;
private String email;
private Integer isDelete;
当查询数据时,需要自定义别名,使得查询结果中的列名与返回值类型中的属性名保持一致:
<select id="findById"
resultType="cn.tedu.mybatis.User">
SELECT
id,username,
password,age,
phone,email,
is_delete AS isDelete
FROM
t_user
WHERE
id=#{id}
</select>
其对应关系如图所示:
2. 简单的关联表查询数据
假设需要创建“部门信息表”:
CREATE TABLE t_department (
id INT AUTO_INCREMENT COMMENT '部门id',
name VARCHAR(30) UNIQUE NOT NULL COMMENT '部门名称',
PRIMARY KEY(id)
) DEFAULT CHARSET=utf8;
然后,添加一些模拟数据:
INSERT INTO t_department (name) VALUES ('软件研发部'),('人力资源部'),('财务部'),('销售部');
并且,每个用户都归属于某个部门:
ALTER TABLE t_user ADD COLUMN department_id INT;
最后,为用户分配部门:
UPDATE t_user SET department_id=1 WHERE id IN (21,28,32);
UPDATE t_user SET department_id=2 WHERE id IN (24,25,26);
UPDATE t_user SET department_id=3 WHERE id IN (22,27,30);
UPDATE t_user SET department_id=4 WHERE id IN (23,29,31);
假设存在需求“查询某用户的信息,并显示该用户的部门的名称”,必须通过关联查询才可以得到所需要的结果,需要执行的SQL语句大致是:
select
*
from
t_user
left join
t_department
on
t_user.department_id=t_department.id
where
t_user.id=25;
如果需要使用MyBatis开发该功能,首先,目前并没有某个类型可以封装查询结果!因为创建的User
类是与t_user
表相对应的,例如User
这样的类称之为实体类(entity),实体类肯定不满足多表查询需求的,所以,对于这种情况,需要自行另创建VO类(value object),这种类的设计应该与查询结果或查询需求相对应:
public class UserVO {
private Integer id;
private String username;
private String password;
private Integer age;
private String phone;
private String email;
private Integer isDelete;
private Integer departmentId;
private String departmentName;
}
VO类的设计方式与实体类基本一致,只是这2种类的定位不同而已,实体类是与数据表对应的,VO类是与查询结果对应的。
然后,可以将此前的findById(Integer id)
的返回值类型修改为UserVO
:
UserVO findById(Integer id);
且映射的配置:
<select id="findById"
resultType="cn.tedu.mybatis.UserVO">
SELECT
t_user.id,username,
password,age,
phone,email,