MyBatis-Plus 的使用,如何让你开发更高效、更快速!

小七学习网,助您升职加薪,遇问题可联系:客服微信【1601371900】 备注:来自网站

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。这是官方给的定义,关于 MyBatis-Plus 的更…

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。这是官方给的定义,关于 MyBatis-Plus 的更多介绍及特性,可以参考 MyBatis-Plus 官网。

本篇文章从实际项目出发,带你了解 MyBatis-Plus 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求。

  • 什么是 MyBatis-Plus?
  • MyBatis-Plus对比 MyBatis!
  • 如何使用 MyBatis-Plus?
  • MyBatis-Plus 如何运用到我们的项目中(实话实说现在是比较火的)?
  • 总结 MyBatis-Plus 在项目中的使用体验?


什么是 MyBatis-Plus?

MyBatis-Plus 是 MyBatis 的一种增强框架,目的就是为了简化开发,提高开发效率。数据库支持:任何能使用 MyBatis 进行 crud,并且支持标准 SQL 的数据库。

特性:

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

MyBatis-Plus 对比 MyBatis

MyBatis-Plus 对比 MyBatis 通俗来说在 MyBatis 基础上做了增强。在 MyBatis-Plus 上我们可以使用 MyBatis 上所有的基础功能包含(分页查询,代码自动生成等)。在我们使用 MyBatis 时我们在 DAO 写一个方法就要对应新增一条 SQL 语句。MyBatis-Plus 除了提供了很多基础的 SQL 执行方法外,还支持 SQL 性能监控、乐观锁、执行分析等。

如何使用 MyBatis-Plus

可能存在新人在看这篇文章,所以我们从新建 Spring Boot 项目开始整起。(大佬自动跳过,互相理解)

1. 新建 Spring Boot 项目(非一定时 Spring Boot 项目)

在这里插入图片描述

2. 测试数据脚本文件和添加依赖

 ##创建数据库drop database if exists `test`;create database `test` DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;##创建表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 \'邮箱\',    state bit NOT NULL DEFAULT 0 COMMENT \'是否删除\',    version int NULL DEFAULT NULL COMMENT \'版本号(用于乐观锁, 默认为 1)\',    PRIMARY KEY (id));##初始话语句DELETE FROM user;INSERT INTO user (id, name, age, email) VALUES(1, \'张三\', 18, \'test1@baomidou.com\'),(2, \'李四\', 20, \'test2@baomidou.com\'),(3, \'王五\', 28, \'test3@baomidou.com\'),(4, \'马六\', 21, \'test4@baomidou.com\'),(5, \'赵七\', 24, \'test5@baomidou.com\');
 <dependencies>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter</artifactId>        </dependency>        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-test</artifactId>            <scope>test</scope>        </dependency>        <dependency>            <groupId>com.baomidou</groupId>            <artifactId>mybatis-plus-boot-starter</artifactId>            <version>3.4.3</version>        </dependency>        <dependency>            <groupId>mysql</groupId>            <artifactId>mysql-connector-java</artifactId>            <version>5.1.44</version>        </dependency>        <dependency>            <groupId>org.projectlombok</groupId>            <artifactId>lombok</artifactId>        </dependency> </dependencies>

至此我们就可以开始体验 MyBatis-Plus 给我带来怎样的便捷和高效,它和 MyBatis 一样都支持逆向工程生成代码支持 ftl 模板引擎生成代码,感兴趣的同学可以在评论区留言,我会私发我们项目在使用的 ftl 模板生成代码的教程。

3. 针对与单数据库的操作 MyBatis-Plus 能给我们带来的极致体验有哪些?

首先看下实体类中有那些实际使用的注解。

     @Data    //表名注解    @TableName(\"user\")    public class User {        //@TableId 主键注解  IdType 支持丰富主键策略(AUTO、NONE、INPUT、ASSIGN_ID、ASSIGN_UUID)        @TableId(value = \"id\", type = IdType.ASSIGN_ID)        //乐观锁注解、标记 @Verison        @Version        private Long id;        private String name;        //内置 SQL 默认指定排序,优先级低于 wrapper(后续会讲到) 条件查询        @OrderBy        private Integer age;        //@TableField 数据自动填充        @TableField( fill = FieldFill.INSERT)        private String email;        //表字段逻辑处理注解(逻辑删除)        @TableLogic        private Boolean state;        //乐观锁实现        @Version        @TableField(fill = FieldFill.INSERT)        private Integer version;        //如果想使用表中不存在的字段    需要将 @TableField(exist = false)        @TableField(exist = false)        private String desc;    }

MyBatis-Plus 的使用,如何让你开发更高效、更快速!

通过测试可以发现 MyBatis-Plus 我们可以使用 mapper 和 service 的 CURD 可以通过条件构造器或者更加简洁好用的链式表达式来实现对于单表数据的所有操作。再也不用在 DAO 层每写一个方法就写一个 SQL 语句,极大的提高了我们的开发效率。让我们在编写代码时可以减少很多重复代码的编写,更加专注与业务本身。对于联表查询来说可以直接在 mapper 类中新增方法把 SQL 语句写在方法上,也可使用 xml 文件形式。整体框架易用度高、上手更加简单。总结来说:这些提供的特性也就是现在导致这个框架火的原因。强烈建议没使用该框架的同学来体验体验。(整体项目代码我会打包放在文章结尾,大家可以实际上手体验一番)

MyBatis-Plus 如何运用到我们的项目中

目前对于这个框架大家好像出现两种极端,有说不符合三层分层的或者直言 baomidou 就很 low 的同学,有说用了就回不来的同学。总体来说还是根据自己的实际需求出发,选择适合自己业务架构的技术就是最好的。给同学们分享一下,我当时采用这个框架的原因,因为公司新启动一个项目,业务复杂(也就是我们常说的行业壁垒,跟技术无关)。领导重视度高。但是客观原因就是没人没资源。在通过不断和 cto 协商给了 3 名 java 高级开发。(总体来说这也是我选择这个框架的最大原因之一)。熟练的开发人员对于新技术的上手能力更强,学习成本也更低。只需对传统的 mapper 封装一下就可以减少很多代码量。剩下的时间可以更加专心业务。

Mybatis-Plus 特性、更加丰富的插件

1. SQL 日志执行分析

  mybatis-plus:    configuration:      log-impl: org.apache.ibatis.logging.stdout.StdOutImp

在这里插入图片描述

2. 逻辑删除(好用)

      mybatis-plus:      global-config:        db-config:          logic-delete-field: flag  # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤 2)          logic-delete-value: 1 # 逻辑已删除值(默认为 1)          logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

在这里插入图片描述

3. 自动填充数据

增加 MyMetaObjectHandler 配置:

    @Component    public class MyMetaObjectHandler implements MetaObjectHandler {            @Override            public void insertFill(MetaObject metaObject) {                //可以指定自动填充的实体类(一般直接用于 BaseEntity)可以执行自动填充数据的类型(String.class)                //一般设置为创建时间   创建人   更新时间    更新人等(更新人和创建人直接从 threadLocal 中获取  这里就不演示)                this.strictInsertFill(metaObject, \"email\", String.class, \"test@qq.com\");            }            @Override            public void updateFill(MetaObject metaObject) {                this.strictUpdateFill(metaObject, \"email\", String.class, \"test@qq.com\");            }    }

在这里插入图片描述

4. SQL 注入器

自定义自己的通用方法可以实现接口 ISqlInjector 也可以继承抽象类 AbstractSqlInjector 注入通用方法 SQL 语句 然后继承 BaseMapper 添加自定义方法,全局配置 sqlInjector 注入 MP 会自动将类所有方法注入到 MyBatis 容器中。

       /**         * SQL 默认注入器         *         * @author 一叶知秋         * @since 2020-06-10         */        public class DefaultSqlInjector extends AbstractSqlInjector {            @Override            public List<AbstractMethod> getMethodList(Class<?> mapperClass) {                return Stream.of(                        new Insert(),                        new Delete(),                        new DeleteByMap(),                        new DeleteById(),                        new DeleteBatchByIds(),                        new Update(),                        new UpdateById(),                        new SelectById(),                        new SelectBatchByIds(),                        new SelectByMap(),                        new SelectOne(),                        new SelectCount(),                        new SelectMaps(),                        new SelectMapsPage(),                        new SelectObjs(),                        new SelectList(),                        new SelectPage()                ).collect(toList());            }     }

数据安全

保护数据库配置及数据安全:

    //  数据库配置或者其他配置均可使用    spring:      datasource:        url: mpw:qRhvCwF4GOqjessEB3G+a5okP+uXXr96wcucn2Pev6Bf1oEMZ1gVpPPhdDmjQqoM        password: mpw:Hzy5iliJbwDHhjLs1L0j6w==        username: mpw:Xb+EgsyuYRXw7U7sBJjBpA==加密及使用    // 生成 16 位随机 AES 密钥    String randomKey = AES.generateRandomKey();    // 随机密钥加密    String result = AES.encrypt(data, randomKey);     //设置启动环境参数(把生成的 key 作为启动参数)    --mpw.key=d1104d7c3b616f0b

乐观锁的实现(重点)

为什么要是用乐观锁(数据库主要是读写的问题)读的问题是:脏读、幻读、不可重复读。写的问题:丢失更新。这些还不是很明白的同学建议回头在区看看(基础)。我们一般使用乐观锁和悲观锁和解决写的问题:乐观锁假设最好的情况每次读取的数据都未被修改过,悲观锁反之。

  • 乐观锁一般用于读比较多的场合,尽量减少加锁的开销。
  • 悲观锁一般用于写比较多的场合,尽量减少 类似 乐观锁重试更新引起的性能开销。

MyBatis-Plus 实现乐观锁我们主要讲一下乐观锁,首先是乐观锁实现原理有两种:

  • 通过版本号机制实现
  • CAS 算法(一种无锁算法)

MyBatis-Plus 则是使用的第一种。在数据库表中新增字段 version,先获取该条数据的 version,执行更新时将 version 作为条件,若相同则更新成功,不同则更新失败。现在主流设计都是采用这种方式。

在这里插入图片描述

在这里插入图片描述

支持多数据源

1. 引入依赖

     <dependency>      <groupId>com.baomidou</groupId>      <artifactId>dynamic-datasource-spring-boot-starter</artifactId>      <version>${version}</version>    </dependency>

2. 配置多数据源

      spring:      datasource:        dynamic:          primary: master #设置默认的数据源或者数据源组,默认值即为 master          strict: false #严格匹配数据源,默认 false. true 未匹配到指定数据源时抛异常,false 使用默认数据源          datasource:            master:              url: jdbc:mysql://xx.xx.xx.xx:3306/dynamic              username: root              password: 123456              driver-class-name: com.mysql.jdbc.Driver # 3.2.0 开始支持 SPI 可省略此配置            slave_1:              url: jdbc:mysql://xx.xx.xx.xx:3307/dynamic              username: root              password: 123456              driver-class-name: com.mysql.jdbc.Driver            slave_2:              url: jdbc:mysql://xx.xx.xx.xx:3307/dynamic              username: root              password: 123456              driver-class-name: com.mysql.jdbc.Driver

3. 使用 @DS 切换数据源。(@DS 可以注解在方法上或类上,同时存在就近原则方法上注解优先于类上注解。)

    @Service    @DS(\"slave_1\")    public class UserServiceImpl implements UserService {      @Autowired      private JdbcTemplate jdbcTemplate;      public List selectAll() {        return  jdbcTemplate.queryForList(\"select * from user\");      }      @Override      @DS(\"slave_2\")      public List selectByCondition() {        return  jdbcTemplate.queryForList(\"select * from user where age >10\");      }    }

另外它的多租户、动态表名、防止全表更新与删除的 BlockAttackInnerInterceptor 等都有很不错的体验。感兴趣的同学可以了解下。

总结 MyBatis-Plus 在项目中的使用体验?

至此 MyBatis-Plus 核心配置使用就结束了,这里没有很多原理方面的需求。我们主要时了解并使用 MyBatis-Plus 带来的新特性及新的用法。并且思考我们从 MyBatis-Plus 相比 MyBatis 我们获得了更加高效、便捷的操作来提高我们的开发效率。MyBatis-Plus 可以让我们思考从传统的三层架构中跳出来。总之还是仁者见仁、智者见智。可能它目前还不是最好用的,但是通过的简单的封装,在开发中提简化开发提交效率这点是毋庸置疑的。强烈安利没用过的小伙伴们来试一试。Demo 放在文章结尾。

Demo 传送门

 

小七学习网,助您升职加薪,遇问题可联系:客服微信【1601371900】 备注:来自网站

免责声明: 1、本站信息来自网络,版权争议与本站无关 2、本站所有主题由该帖子作者发表,该帖子作者与本站享有帖子相关版权 3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和本站的同意 4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责 5、用户所发布的一切软件的解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 6、您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 7、请支持正版软件、得到更好的正版服务。 8、如有侵权请立即告知本站(邮箱:1099252741@qq.com,备用微信:1099252741),本站将及时予与删除 9、本站所发布的一切破解补丁、注册机和注册信息及软件的解密分析文章和视频仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。