MyBatis-Plus快速使用

891 阅读4分钟

这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战

MyBatis-Plus快速使用

官网地址:mp.baomidou.com/guide/

image-20210712140447892

简介

mybatis增强工具。

特性

官网原文

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

框架结构

img

快速开始

有一张user

image-20210708165737741

对应sql

DROP TABLE IF EXISTS user;
​
CREATE TABLE user
(
    id BIGINT(20) NOT NULL COMMENT '主键ID',
    name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
    age INT(11) NULL DEFAULT NULL COMMENT '年龄',
    email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
    PRIMARY KEY (id)
);
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');

创建一个Spring Boot 项目

主要依赖webmysql,mybatis-plus

配置yml

application.yml

#port
server:
  port: 8800
  
#mysql
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8
    username: root
    password: root

编码

实体类和Mapper

User.java

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

UserMapper.java

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

测试

@SpringBootTest
class MybatisPlusApplicationTests {
    @Autowired
    private UserMapper userMapper;
​
    @Test
    void contextLoads() {
    }
​
    @Test
    public void testSelect() {
        System.out.println(("----- selectAll method test ------"));
        List<User> userList = userMapper.selectList(null);
        userList.forEach(System.out::println);
    }
}

image-20210708172531239

上面直接继承BaseMapper,然后调用方法无需手撸sql

编码

实体类和Mapper

User.java

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

UserMapper.java

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

测试

@SpringBootTest
class MybatisPlusApplicationTests {
    @Autowired
    private UserMapper userMapper;
​
    @Test
    void contextLoads() {
    }
​
    @Test
    public void testSelect() {
        System.out.println(("----- selectAll method test ------"));
        List<User> userList = userMapper.selectList(null);
        userList.forEach(System.out::println);
    }
}

image-20210708172531239

上面直接继承BaseMapper,然后调用方法无需手撸sql 我们来看下BaseMapper,可以许多可以直接拿来用的方法image-20210708174453552

参数entityid就先忽略,直接使用就行。

我们来看下columnMapqueryWrapper这两个参数

columnMap是一个map,字面意思就是键值对,写个方法测试

    @Test
    public void testSelectByMap() {
        Map<String,Object> map = new HashMap<>();
        map.put("id",1);
        List<User> users = userMapper.selectByMap(map);
        System.out.println(users);
    }

再来看下queryWrapper,是Wrapper类型,是个条件构造器 \

image-20210708182123242

image-20210709085212708

Wrapper是个抽象类,有很多继承类。

我们先关注这三类Lambda,Query,Update

查看继承关系

image-20210709092242621

image-20210709105357621 QueryWrapperQueryChainWrapper

查看QueryWrapper方法

image-20210709092847124

image-20210709092930139

测试queryWrapper

    @Test
    public void testQueryWrapper() {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        //自定义所取的列
        QueryWrapper<User> ids = queryWrapper.select("id", "name", "age");
        //eq条件查询,相当于拼接的where条件
        queryWrapper.eq("id",1L);
        List<User> users = userMapper.selectList(ids);
        users.forEach(System.out::println);
    }

测试queryChainWrapper

queryChainWrapper多了链式查询方法,如list,one

    @Test
    public void testQueryChainWrapper() {
        //QueryChainWrapper使用
        QueryChainWrapper<User> queryChainWrapper = new QueryChainWrapper<>(userMapper);
        //list
        List<User> list = queryChainWrapper.list();
        list.forEach(System.out::println);
        //one
        queryChainWrapper.eq("id", 1L);
        User one = queryChainWrapper.one();
        System.out.println(one);
    }

UpdateWrapper 和**UpdateChainWrapper**

测试UpdateWrapper

@Test
public void testUpdateWrapper() {
    //updateWrapper使用
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
​
    //更新age列所有值
    UpdateWrapper<User> age = updateWrapper.set("age", 18);
    userMapper.update(new User(), age);
​
    //eq条件更新字段值
    updateWrapper.eq("name", "Jone");
    User user = new User();
    user.setEmail("Jone@baomidou.com");
    userMapper.update(user, updateWrapper);
    List<User> users = userMapper.selectList(null);
    users.forEach(System.out::println);
​
    //通过id修改字段值
    User user2 = new User();
    user2.setId(1L);
    user2.setAge(22);
    userMapper.updateById(user2);
​
    List<User> users2 = userMapper.selectList(null);
    users2.forEach(System.out::println);
}

测试UpdateChainWrapper

@Test
public void testUpdateChainWrapper() {
    //updateChainWrapper使用
    UpdateChainWrapper<User> updateChainWrapper = new UpdateChainWrapper<>(userMapper);
    updateChainWrapper.eq("name","Jone").set("email","test1@baomidou.com");
    //remove移除这条数据
    updateChainWrapper.remove();
}

LambdaQueryWrapperLambdaUpdateWrapper

测试LambdaQueryWrapper

 @Test
    public void testLambdaQueryWrapper() {
        //lambdaQueryWrapper使用
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getId, 2);
        List<User> users = userMapper.selectList(lambdaQueryWrapper);
        users.forEach(System.out::println);
​
        //LambdaQueryChainWrapper使用
        LambdaQueryChainWrapper<User> lambdaQueryChainWrapper = new LambdaQueryChainWrapper<>(userMapper);
        List<User> list = lambdaQueryChainWrapper.list();
        list.forEach(System.out::println);
    }

测试LambdaUpdateWrapper

@Test
    public void testLambdaUpdateWrapper() {
        //lambdaQueryWrapper使用
        LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        LambdaUpdateWrapper<User> xiaomi = lambdaUpdateWrapper.eq(User::getId, 2).set(User::getName, "xiaomi");
        userMapper.update(null, xiaomi);
        List<User> users = userMapper.selectList(null);
        users.forEach(System.out::println);

        //lambdaQueryWrapper使用
        LambdaUpdateChainWrapper<User> lambdaUpdateChainWrapper = new LambdaUpdateChainWrapper<>(userMapper);
        User user = new User();
        user.setName("xiaomi");
        lambdaUpdateChainWrapper.eq(User::getId, 3).update(user);
        List<User> users1 = userMapper.selectList(null);
        users1.forEach(System.out::println);
    }