jdk1.8、MyBatis3.4.6、MySQL数据库5.6.45、Eclipse Version: 2019-12 M2 (4.14.0)
本章主要包含的内容为 MyBatis 的高级结果映射,主要处理数据库一对一、一对多的查询,另外就是在 MyBatis 中使用存储过程的方法,处理存储过程的入参和出参方法,最后会介绍 Java 中的枚举方法和数据库表字段的处理方法。
6.1 高级结果映射
在关系型数据库中,我们经常要处理一对一、一对多的关系。
在 RBAC 权限系统中还存在着一个用户拥有多个角色、一个角色拥有多个权限这样复杂的嵌套关系。使用已经学会的 MyBatis 技巧都可以轻松地解决这种复杂的关系。在面对这种关系的时候,我们可能要写多个方法分别查询这些数据,然后再组合到一起。这种处理方式特别适合用在大型系统上,由于分库分表,这种用法可以减少表之间的关联查询,方便系统进行扩展。
但是在一般的企业级应用中,使用 MyBatis 的高级结果映射便可以轻松地处理这种一对一、一对多的关系。本节将带领大家学习与高级结果映射相关的内容。
6.1.1 一对一映射
假设在 RBAC 权限系统中,一个用户只能拥有一个角色,为了举例,先把用户和角色之间的关系限制为一对一的关系。在 2.3 节中介绍了一个 selectRolesByUserId 方法,这个方法实际上就已经是一个一对一关系了。一对一映射因为不需要考虑是否存在重复数据,因此使用起来很简单,而且可以直接使用 MyBatis 的自动映射。此处参考 2.3 节中的方法,使用自动映射实现在查询用户信息的同时获取用户拥有的角色。
6.1.1.1 使用自动映射处理一对一关系
一个用户拥有一个角色,因此先在 SysUser 类中增加 SysRole 字段,代码如下。
/** * 用户表 */ public class SysUser implements Serializable { private static final long serialVersionUID = -328602757171077630L; /** * 用户ID */ private Long id; /** * 用户名 */ private String userName; /** * 密码 */ private String userPassword; /** * 邮箱 */ private String userEmail; /** * 简介 */ private String userInfo; /** * 头像 */ private byte[] headImg; /** * 创建时间 */ private Date createTime; /** * 用户角色 */ private SysRole role; /** * 用户的角色集合 */ private List<SysRole> roleList; public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPassword() { return userPassword; } public void setUserPassword(String userPassword) { this.userPassword = userPassword; } public String getUserEmail() { return userEmail; } public void setUserEmail(String userEmail) { this.userEmail = userEmail; } public String getUserInfo() { return userInfo; } public void setUserInfo(String userInfo) { this.userInfo = userInfo; } public byte[] getHeadImg() { return headImg; } public void setHeadImg(byte[] headImg) { this.headImg = headImg; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; } public SysRole getRole() { return role; } public void setRole(SysRole role) { this.role = role; } public List<SysRole> getRoleList() { return roleList; } public void setRoleList(List<SysRole> roleList) { this.roleList = roleList; } }