MyBatisPlus(SpringBoot版)--2022

MyBatisPlus(SpringBoot版)–2022

文章目录

  • MyBatisPlus(SpringBoot版)--2022
  • 一、MyBatis-Plus简介
    • 1、简介
    • 2、特性
    • 3、支持数据库
    • 4、 框架结构
    • 5、代码文档及文档地址
  • 二、入门案例
    • 1、开发环境
    • 2、创建数据库及表
      • a>创建表
      • b>添加数据
    • 3、创建SpringBoot工程
      • a>初始化工程
      • img
      • b>引入依赖
      • c>idea中安装lombok插件
    • 4、编写代码
      • a>配置application.yml
        • 注意:
      • b>启动类
      • c>添加实体
      • img
      • d>添加mapper
      • e>测试
        • 结果
        • 注意:
      • f>添加日志
  • 三、基本CRUD
    • 1、BaseMapper
    • 2、插入
    • 3、删除
      • a>根据id查询用户信息
      • b>根据多个id查询多个用户信息
      • c>通过map条件删除记录
    • 4、修改
    • 5、查询
      • a>根据id查询用户信息
      • b>根据多个id查询多个用户信息
      • c>通过map条件查询用户信息
      • d> 查询所有数据
      • e> 自定义功能
    • 6、通用Service
      • a>IService
      • b>创建Service接口和实现类
      • c>测试查询记录数
      • d>测试批量插入
  • 四、常用注解
    • 1、@TableName
      • a>问题
      • b>通过@TableName 解决问题
      • c>通过全局配置解决问题
    • 2、@Tableld
      • a>问题
      • **b>通过@TableId解决问题**
      • **c>@TableId的value属性**
      • d>@Tableld的type属性
        • 常用的主键策略:
        • 配置全局主键策略:
      • e>雪花算法
        • - 背景
        • - 数据库分表
          • - 垂直分表
          • - 水平分表
    • 3、@TableField
      • a>情况1
      • a>情况2
    • 4、@TableLogic
      • a>逻辑删除
      • b>实现逻辑删除
  • 五、条件构造器和常用接口
    • 1、wrapper介绍
    • 2、QueryWrapper
      • a>例1:组装查询条件
      • b>例2:组装排序条件
      • c>例3:组装删除条件
      • d>例4:条件的优先级
      • e>例5:组装select子句
      • f>例6:实现子查询
    • 3、UpdateWrapper
    • 4、Condition
      • 思路一:
      • 思路二:
    • 5、LambdaQueryWrapper
    • 6、LambdaUpdateWrapper
  • 六、插件
    • 1、分页插件
      • a>添加配置类
      • b>测试
    • 2、xml自定义分页
      • a>UserMapper中定义接口方法
      • b>UserMapper.xml中编写SQL
      • c>测试
    • 3、乐观锁
      • a>场景
      • b>乐观锁和悲观锁
      • c>模拟修改冲突
        • 数据库中增加商品表
        • 添加数据
        • 添加实体
        • 添加mapper
        • 测试
      • d>乐观锁实现流程
      • e>MyBatis-Plus实现乐观锁
        • 修改实体类
        • 添加乐观锁插件配置
        • 测试修改冲突
        • 优化流程
  • 七、通过枚举
    • a>数据库表添加字段sex
      • b>创建通过枚举类型
      • c>配置扫描通过枚举
      • d>测试
  • 八、代码生成器
    • 1、引入依赖
    • 2、快速生成
  • 九、多数据源
    • 1、创建数据库及表
    • 2、引入依赖
    • 3、配置多数据源
    • 4、创建用户service
    • 5、创建商品service
    • 6、测试
  • 十、MyBatisX插件

一、MyBatis-Plus简介

1、简介

MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为 简化开发、提高效率而生。

愿景

我们的愿景是成为 MyBatis 最好的搭档,就像魂斗罗中的 1P、2P,基友搭配,效率翻倍。

MyBatisPlus(SpringBoot版)--2022_第1张图片

2、特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防 误操作

3、支持数据库

任何能使用MyBatis进行 CRUD, 并且支持标准 SQL 的数据库,具体支持情况如下

  • MySQL,Oracle,DB2,H2,HSQL,SQLite,PostgreSQL,SQLServer,Phoenix,Gauss , ClickHouse,Sybase,OceanBase,Firebird,Cubrid,Goldilocks,csiidb
  • 达梦数据库,虚谷数据库,人大金仓数据库,南大通用(华库)数据库,南大通用数据库,神通数据 库,瀚高数据库

4、 框架结构

MyBatisPlus(SpringBoot版)--2022_第2张图片

5、代码文档及文档地址

官方地址: http://mp.baomidou.com

代码发布地址:

Github: https://github.com/baomidou/mybatis-plus

Gitee: https://gitee.com/baomidou/mybatis-plus

文档发布地址: https://baomidou.com/pages/24112f

二、入门案例

1、开发环境

IDE:idea:2021.3

JDK:JDK8+

构建工具:maven 3.8.4

MySQL版本:MySQL 8.0.27

Spring Boot:2.6.4

MyBatis-Plus:3.5.1

系统:mac m1

2、创建数据库及表

a>创建表

CREATE DATABASE `mybatis_plus` /*!40100 DEFAULT CHARACTER SET utf8mb4 */;
use `mybatis_plus`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL COMMENT '主键ID', `name` varchar(30) DEFAULT NULL COMMENT '姓名', `age` int(11) DEFAULT NULL COMMENT '年龄', `email` varchar(50) DEFAULT NULL COMMENT '邮箱', PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

b>添加数据

INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, '[email protected]'),
(2, 'Jack', 20, '[email protected]'),
(3, 'Tom', 28, '[email protected]'),
(4, 'Sandy', 21, '[email protected]'),
(5, 'Billie', 24, '[email protected]');

3、创建SpringBoot工程

a>初始化工程

MyBatisPlus(SpringBoot版)--2022_第3张图片

MyBatisPlus(SpringBoot版)--2022_第4张图片

b>引入依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starterartifactId>
    dependency>

    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-testartifactId>
        <scope>testscope>
    dependency>

    
    <dependency>
        <groupId>com.baomidougroupId>
        <artifactId>mybatis-plus-boot-starterartifactId>
        <version>3.5.1version>
    dependency>

    
    <dependency>
        <groupId>org.projectlombokgroupId>
        <artifactId>lombokartifactId>
        <optional>trueoptional>
    dependency>

    
    <dependency>
        <groupId>mysqlgroupId>
        <artifactId>mysql-connector-javaartifactId>
    dependency>
dependencies>

c>idea中安装lombok插件

MyBatisPlus(SpringBoot版)--2022_第5张图片

一般现在IDEA都内置有这个插件

4、编写代码

a>配置application.yml

spring:
  # 配置数据源信息
  datasource:
    # 配置数据源类型
    type: com.zaxxer.hikari.HikariDataSource
    # 配置连接数据库信息
    driver-class-name: com.mysql.cj.jdbc.Driver
    # 我的数据库是8.0.27 5版本的可以使用 jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
    url: jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false
    username: root
    password: 'root'
注意:

1、驱动类driver-class-name

spring boot 2.0(内置jdbc5驱动),驱动类使用:

driver-class-name: com.mysql.jdbc.Driver

spring boot 2.1及以上(内置jdbc8驱动),驱动类使用:

driver-class-name: com.mysql.cj.jdbc.Driver

否则运行测试用例的时候会有 WARN 信息

2、连接地址url

MySQL5.7版本的url:

jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false

MySQL8.0版本的url:

jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8&characterEncoding=utf-8&useSSL=false

否则运行测试用例报告如下错误:

java.sql.SQLException: The server time zone value ‘ÖÐ1ú±ê×1⁄4ʱ1⁄4ä’ is unrecognized or represents more

b>启动类

在Spring Boot启动类中添加@MapperScan注解,扫描mapper包

@SpringBootApplication
// 扫描mapper接口所在的包
@MapperScan("com.atguigu.mybatisplus.mapper")
public class MybatisplusApplication {
   

    public static void main(String[] args) {
   
        SpringApplication.run(MybatisplusApplication.class, args);
    }

}

c>添加实体

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
   

    private Long id;
    private String name;
    private Integer age;
    private String email;
}

使用了Lombok注解

MyBatisPlus(SpringBoot版)--2022_第6张图片

d>添加mapper

BaseMapper是MyBatis-Plus提供的模板mapper,其中包含了基本的CRUD方法,泛型为操作的实体类型

public interface UserMapper extends BaseMapper<User> {
   
}

e>测试

@SpringBootTest
class MybatisplusApplicationTests {
   

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testSelectList() {
   
        // 通过条件构造器查询一个List集合,若没有条件,则可以设置null为参数
        List<User> list = userMapper.selectList(null);
        list.forEach(System.out::println);
    }
}
结果

MyBatisPlus(SpringBoot版)--2022_第7张图片

注意:

IDEA在 userMapper 处报错,因为找不到注入的对象,因为类是动态创建的,但是程序可以正确 的执行。

为了避免报错,可以在mapper接口上添加 @Repository 注解

f>添加日志

在application.yml中配置日志输出

# 加入日志功能
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

MyBatisPlus(SpringBoot版)--2022_第8张图片

三、基本CRUD

1、BaseMapper

MyBatis-Plus中的基本CRUD在内置的BaseMapper中已得到了实现,我们可以直接使用,接口如下:

/*
 * Copyright (c) 2011-2022, baomidou ([email protected]).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.baomidou.mybatisplus.core.mapper;

import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.core.toolkit.ExceptionUtils;
import org.apache.ibatis.annotations.Param;

import java.io.Serializable;
import java.util.Collection;
import java.util.List;
import java.util.Map;

/*

               :`
                    .:,
                     :::,,.
             ::      `::::::
             ::`    `,:,` .:`
             `:: `::::::::.:`      `:';,`
              ::::,     .:::`   `@++++++++:
               ``        :::`  @+++++++++++#
                         :::, #++++++++++++++`
                 ,:      `::::::;'##++++++++++
                 .@#@;`   ::::::::::::::::::::;
                  #@####@, :::::::::::::::+#;::.
                  @@######+@:::::::::::::.  #@:;
           ,      @@########':::::::::::: .#''':`
           ;##@@@+:##########@::::::::::: @#;.,:.
            #@@@######++++#####'::::::::: .##+,:#`
            @@@@@#####+++++'#####+::::::::` ,`::@#:`
            `@@@@#####++++++'#####+#':::::::::::@.
             @@@@######+++++''#######+##';::::;':,`
              @@@@#####+++++'''#######++++++++++`
               #@@#####++++++''########++++++++'
               `#@######+++++''+########+++++++;
                `@@#####+++++''##########++++++,
                 @@######+++++'##########+++++#`
                @@@@#####+++++############++++;
              ;#@@@@@####++++##############+++,
             @@@@@@@@@@@###@###############++'
           @#@@@@@@@@@@@@###################+:
        `@#@@@@@@@@@@@@@@###################'`
      :@#@@@@@@@@@@@@@@@@@##################,
      ,@@@@@@@@@@@@@@@@@@@@################;
       ,#@@@@@@@@@@@@@@@@@@@##############+`
        .#@@@@@@@@@@@@@@@@@@#############@,
          @@@@@@@@@@@@@@@@@@@###########@,
           :#@@@@@@@@@@@@@@@@##########@,
            `##@@@@@@@@@@@@@@@########+,
              `+@@@@@@@@@@@@@@@#####@:`
                `:@@@@@@@@@@@@@@##@;.
                   `,'@@@@##@@@+;,`
                        ``...``

 _ _     /_ _ _/_. ____  /    _
/ / //_//_//_|/ /_\  /_///_/_\      Talk is cheap. Show me the code.
     _/             /
 */

/**
 * Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能
 * 

这个 Mapper 支持 id 泛型

* * @author hubin * @since 2016-01-23 */
public interface BaseMapper<T> extends Mapper<T> { /** * 插入一条记录 * * @param entity 实体对象 */ int insert(T entity); /** * 根据 ID 删除 * * @param id 主键ID */ int deleteById(Serializable id); /** * 根据实体(ID)删除 * * @param entity 实体对象 * @since 3.4.4 */ int deleteById(T entity); /** * 根据 columnMap 条件,删除记录 * * @param columnMap 表字段 map 对象 */ int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap); /** * 根据 entity 条件,删除记录 * * @param queryWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句) */ int delete(@Param(Constants.

你可能感兴趣的:(spring,boot,mybatis,java)