MyBatis入门-select标签简化查询

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"}}]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值