SpringBoot基础 | 第九章 - 整合Mapper3实现MyBatis通用Mapper

SpringBoot基础教程

环境

JDK1.8
Maven

工具

IntelliJ IDEA

SpringBoot基础 | 第一章 - 快速搭建Web应用
SpringBoot基础 | 第二章 - 配置热部署
SpringBoot基础 | 第三章 - 使用配置文件
SpringBoot基础 | 第四章 - 日志配置
SpringBoot基础 | 第五章 - 整合lombok
SpringBoot基础 | 第六章 - 整合SpringDataJPA
SpringBoot基础 | 第七章 - 整合缓存 SpringDataCache
SpringBoot基础 | 第八章 - 整合Mybatis
SpringBoot基础 | 第九章 - 整合Mapper3实现MyBatis通用Mapper
SpringBoot基础 | 第十章 - 整合PageHelper实现分页查询


介绍

通用Mapper都可以极大的方便开发人员。可以随意的按照自己的需要选择通用方法,还可以很方便的开发自己的通用方法。
极其方便的使用MyBatis单表的增删改查。
支持单表操作,不支持通用的多表联合查询。

Mybatis 通用 Mapper 的详细介绍:请点这里

准备

SpringBoot基础 | 第八章 - 整合Mybatis 的项目基础上进行操作

操作步骤

一、添加依赖
<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper-spring-boot-starter</artifactId>
    <version>1.1.4</version>
</dependency>
二、添加自定义通用 Mapper

创建 interface 取名为 BaseRepository (可自行定义名称),实现了 Mapper 以及 MySqlMapper 接口

public interface BaseRepository <T> extends Mapper<T>, MySqlMapper<T> {}

其中、Mapper 接口提供了对单表的基本 CURD 操作,自定义条件查询,以及分页查询,而 MySqlMapper 则提供了批量新增操作。

具体用法后文还有详细介绍。

三、修改 UserRepository

实现第二步中创建的 BaseRepository 通用接口,删除掉之前写的方法。虽然实现的是一个空接口,但实际上 UserRepository 已经拥有了基础的 CURD 操作以及针对单表的强大的自定义查询。

@Mapper
public interface UserRepository extends BaseRepository {

}
四、修改实体类 User

在主键属性上添加注解 @Id,这会影响到所有针对主键的操作。
非主键属性上添加注解 @Column,如果属性名与数据库字段名不一致,可以通过 name 属性进行转换。

@Data
public class User {

    @Id
    private Long id;

    @Column
    private String username;

    @Column(name = "passwd")
    private String password;

    @Column
    private int sex;

    @Column
    private LocalDateTime birthday;

}
五、修改 xml 文件

如果不用定义其它 SQL 语句,甚至可以删除这个 xml 文件。通用 Mapper 里的方法都是走的 provider 而不是走 xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.msf.respository.UserRepository">
    <resultMap id="BaseResultMap" type="com.msf.model.User" >
        <id column="id" property="id" jdbcType="BIGINT" />
        <result column="username" property="username" jdbcType="VARCHAR" />
        <result column="passwd" property="password" jdbcType="VARCHAR" />
    </resultMap>
</mapper>

至此,通用 Mapper 已经整合进项目,接下来就是该如何使用的问题

通用方法可以分为几类:

1、Selective:方法以 Selective 结尾,表示只对不为空的字段进行操作,否则为全表操作。

2、ByPrimaryKey:方法带有 ByPrimaryKey,表示根据主键进行操作,在表的实体类中必须对主键进行 @Id 注解,传入实体中主键必须有值。

3、ByExample:方法带有 ByExample,表示根据自定义条件进行操作,包括有查询、修改、删除,其中的 example 参数支持所有符合 Example 结构的参数,例如通过 MBG 生成的 UserExample 类,通用 Mapper 中提供的通用 Example,也支持 Java8 方法引用的 Weekend 类型。

使用排序

example.orderBy("birthday").asc();

去重

example.setDistinct(true);

设置查询列,使用的是实体类的属性名,而不是数据库的字段名

example.selectProperties("id", "username");

使用 Example.builder 方式进行组装

Example example = Example.builder(User.class)
        .select("id", "username", "password")
        .andWhere(Sqls.custom().andBetween("birthday", LocalDate.of(1980, 1, 1), LocalDate.of(1989, 12, 31)))
        .orderByAsc("birthday")
        .build();
return userRepository.selectByExample(example);

使用 Weekend 方式进行组装

Example example = Example.builder(User.class)
        .andWhere(WeekendSqls.<User>custom().andLike(User::getUsername, "a%"))
        .build();
return userRepository.selectByExample(example);

测试用例:

1、设置查询列,执行排序

// 查询所有用户,并按生日进行排序
public List<User> selectAll() {
    Example example = new Example(User.class);
    example.selectProperties("id", "username", "password");
    example.orderBy("birthday").asc();
    return userRepository.selectAll();
}

执行的SQL语句为

SELECT id,username,passwd FROM user ORDER BY birthday ASC

2、设置查询列,执行去重

// 查询所有的性别
public List<Integer> selectDistinct() {
    Example example = new Example(User.class);
    example.setDistinct(true);
    example.selectProperties("sex");
    List<User> users = userRepository.selectByExample(example);
    if (!CollectionUtils.isEmpty(users)) {
        return users.stream().map(User::getSex).collect(Collectors.toList());
    }
    return null;
}

执行的SQL语句为

SELECT distinct sex FROM user

3、使用 or 条件

// 查询90后或者女性用户
public List<User> selectWithOr() {
    Example example = new Example(User.class);
    example.createCriteria().andGreaterThanOrEqualTo("birthday", LocalDate.of(1990, 1, 1));
    example.or().andEqualTo("sex", 2);
    return userRepository.selectByExample(example);
}

执行的SQL语句为

SELECT id,username,passwd,sex,birthday FROM user WHERE ( birthday >= ? ) or ( sex = ? ) 

4、使用分页

public List<User> selectWithPage() {
    Example example = Example.builder(User.class).build();
    RowBounds rb = new RowBounds(0, 10);
    return userRepository.selectByExampleAndRowBounds(example, rb);
}

执行的SQL语句如下,并没有 limit 关键字,这是因为 mapper 并没有处理分页,而是使用的 mybatis 原生的分页,而 mybatis 原生的分页操作是逻辑分页,而不是物理分页,所以如果要进行物理分页,则需要自行处理,后面的文章会整合 PageHelper 进行分页。

SELECT id,username,passwd,sex,birthday FROM user

按操作进行分类:

一、新增

1、insert(T)

全属性插入

2、insertSelective(T)

非空属性插入

3、insertList(List)

批量插入

二、修改

1、updateByPrimaryKey(T)

根据主键进行全属性修改

2、updateByPrimaryKeySelective(T)

根据主键进行非空属性修改

3、updateByExample(T, Object)

自定义条件进行全属性修改

4、updateByExampleSelective(T, Object)

自定义条件进行非空属性修改

三、删除

1、delete(T)

根据传入实体的所有非空属性,组合 where 条件进行删除操作

2、deleteByPrimaryKey(PK)

根据主键进行删除操作

3、deleteByExample(Object)

自定义条件进行删除操作

四、查询

1、selectByPrimaryKey(PK)

根据主键进行查询,返回一个实体

2、selectOne(T)

根据传入实体的所有非空属性,组合 where 条件进行查询操作,返回一个实体

3、selectOneByExample(Object)

根据自定义条件进行查询操作,返回一个实体

4、select(T)

根据传入实体的所有非空属性,组合 where 条件进行查询操作,返回实体列表

5、selectAll()

查询表中的所有元素,返回实体列表

6、selectByExample(Object)

根据自定义条件进行查询操作,返回实体列表

7、selectCount(T)

根据传入实体的所有非空属性,组合 where 条件进行查询操作,返回匹配数据个数

8、selectCountByExample(Object)

根据自定义条件进行查询操作,返回匹配数据个数

9、selectByRowBounds(T, RowBounds)

根据传入实体的所有非空属性,组合 where 条件,执行分页查询,返回实体列表

10、selectByExampleAndRowBounds(Object, RowBounds)

根据自定义条件,执行分页查询,返回实体列表

发布了153 篇原创文章 · 获赞 22 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/gongm24/article/details/83185730