select用法
本篇介绍了
- 如何简化查询实体接收类中的非数据库字段
介绍-select标签
xml中的select标签的id属性值和定义的接口方法名是一样的。mybatis就是通过这种方式将接口方法和xml中定义的sql语句关联到一起的,如果接口方法没有和xml中的id属性值相对应,启动程序便会报错。
映射xml和接口的命名需要符合如下规则:
- 当只使用xml而不使用接口的时候,namespace的值可以设置为任意不重复的名称
- 标签的id属性值在任何使用都不能出现英文句号".",并且同一个命名空间下不能出现重复的id
- 因为接口方法是可以重载的,所以接口中可以出现多个同名但参数不同的方法,但是xml中的id的值不能重复,因而接口中的所有同名方法会对应着xml中的同一个id的方法。
明白上面说的接口和xml之间的关系后,我们具体了解一下xml中的一些标签和属性的作用。
<select>
:映射查询语句使用的标签- id:命名空间中唯一标识符,可以用来代表这条语句
- resultmap:用于设置返回值的类型和映射关系
- select标签中包裹的是查询语句
- #{id}:myabtis sql中预编译参数的一种方式,大括号中的id是传入的参数名
resultmap是一种很重要的配置结果映射方法,我们必须熟练掌握resultmap的配置方法。resultmap包含的所有属性如下:
- id:必填,并且唯一
- type:必填,用于配置查询列所映射到的java对象类型
- extends:选填,可以设置当前的resultmap继承自其他的resultmap,属性值为继承resultmap的id
- autoMapping:选填,可选值为true或false,用于配置是否启用非映射字段(没有在resultmap中配置的字段)的自动映射功能
实践-组合字段简洁查询
例如:查询角色时,需要同时查出用户名及邮箱
SysRole类,其中有一个SysUser类型的属性user,它将会存储我们的查询结果
package tk.mybatis.simple.model;
import java.util.Date;
import java.io.Serializable;
/**
* 角色表(SysRole)实体类
*
* @author makejava
* @since 2021-01-28 22:13:35
*/
public class SysRole implements Serializable {
private static final long serialVersionUID = -18356943698391875L;
/**
* 角色ID
*/
private Long id;
/**
* 角色名
*/
private String roleName;
/**
* 有效标志
*/
private Integer enabled;
/**
* 创建人
*/
private Long createBy;
/**
* 创建时间
*/
private Date createTime;
private SysUser user;
// getter和setter和toString省略
}
SysUser类
package tk.mybatis.simple.model;
import java.util.Date;
import java.io.Serializable;
/**
* 用户表(SysUser)实体类
*
* @author makejava
* @since 2021-01-28 22:09:28
*/
public class SysUser implements Serializable {
private static final long serialVersionUID = 854674092994608168L;
/**
* 用户ID
*/
private Long id;
/**
* 用户名
*/
private String userName;
/**
* 密码
*/
private String userPassword;
/**
* 邮箱
*/
private String userEmail;
/**
* 简介
*/
private String userInfo;
/**
* 头像
*/
private byte[] headImg;
/**
* 创建时间
*/
private Date createTime;
// getter和setter和toString省略
}
SysRoleMapper.xml中查询sql如下:我们要给SysRole类添加两个SysUser的返回属性值,在sql中添加了’user.userName’,'user.userEmail’的别名设置。别名中的user表示SysRole中能接收user_name和user_email的对象,userName和userEmail表示user对象中接收字段的属性,通过这种方式可以直接将值赋给user字段中的属性
<select id="queryByUserId" resultType="tk.mybatis.simple.model.SysRole">
SELECT
r.id,
r.role_name,
r.enabled,
r.create_by,
r.create_time,
u.user_name 'user.userName',
u.user_email 'user.userEmail'
FROM
mybatis.sys_user u
INNER JOIN sys_user_role ur on u.id=ur.user_id
INNER JOIN sys_role r on ur.role_id=r.id
WHERE
u.id = #{userId}
</select>
实践结果:
发现我们SysRole对象中的user属性是可以包含我们查询结果的
==> Preparing: SELECT r.id, r.role_name, r.enabled, r.create_by, r.create_time, u.user_name 'user.userName', u.user_email 'user.userEmail' FROM mybatis.sys_user u INNER JOIN sys_user_role ur on u.id=ur.user_id INNER JOIN sys_role r on ur.role_id=r.id WHERE u.id = ?
==> Parameters: 1(Long)
<== Columns: id, role_name, enabled, create_by, create_time, user.userName, user.userEmail
<== Row: 1, 管理员, 1, 1, 2021-01-28 21:58:32.0, admin, admin@mybatis.tk
<== Row: 2, 普通用户, 1, 1, 2021-01-28 21:58:32.0, admin, admin@mybatis.tk
<== Total: 2
角色信息:[{"createBy":1,"createTime":1611842312000,"enabled":1,"id":1,"roleName":"管理员","user":{"userEmail":"admin@mybatis.tk","userName":"admin"}},{"createBy":1,"createTime":1611842312000,"enabled":1,"id":2,"roleName":"普通用户","user":{"userEmail":"admin@mybatis.tk","userName":"admin"}}]