MybatisPlus学习笔记

226 阅读4分钟

MybatisPlus是一个无入侵的SQL拼接框架,它是基于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 操作智能分析阻断,也可自定义拦截规则,预防误操作

以上都是官网说的一些特性,具体的我也很多不是很清楚,但是通过使用MP可以减少大量的SQL编写操作

同时通过MP提供的代码生成器,可以减少通过数据库表结构快速生成controller、service和serviceImpl、entity、mapper代码模板

同时自带了大量的mybatis插件,包括我们常用的分页插件

二、框架架构

mybatis-plus-framework.jpg

从上面的架构图可以看出,MP的本质就是一个类似于SpringBoot starter的一个存在,通过自动配置我们常用的controller、service、serviceImpl、mapper、entity,同时生成了我们日常业务中需要大量编写的常用CRUD操作,实现无需编写xml文件即可以访问数据库,节省了大量的开发时间。

三、实际学习

3.1 BaseMapper接口

 public interface UserMapper extends BaseMapper<User> {
 ​
 }

以上就是一个通过mapper实现的mapper接口

期中User是用户实体类,UserMapper是用户dao层接口

BaseMapper接口.jpg

通过查看BaseMapper接口的我们发现,期中已经预定义好了我们常用的CRUD操作接口

其中的泛型T就是我们传入的User实体类,表名继承这个接口的mapper的操作对象

3.2 IService接口

image.png

 public interface IService<T> {
 ​
     /**
      * 默认批次提交数量
      */
     int DEFAULT_BATCH_SIZE = 1000;
 ​
     /**
      * 插入一条记录(选择字段,策略插入)
      *
      * @param entity 实体对象
      */
     default boolean save(T entity) {
         return SqlHelper.retBool(getBaseMapper().insert(entity));
     }
 }

IService接口内封装了大量的常用的service操作,包括批处理等操作

基本上和mapper接口中的操作对应,普通CRUD操作都可以不用写具体业务逻辑就可以使用

以上的实现方式是MP通过IOC容器自动写入通过预定义好的常用CRUD操作,在Spring容器启动以后自动将代码逻辑写入

以上的泛型接口指定了我们需要操作的对象,

3.3 ServiceImpl<M extends BaseMapper, T>

image.png

 public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {
 ​
     protected Log log = LogFactory.getLog(getClass());
 ​
     @Autowired
     protected M baseMapper;
 ​
     @Override
     public M getBaseMapper() {
         return baseMapper;
     }
 ​
     protected Class<T> entityClass = currentModelClass();
 ​
     @Override
     public Class<T> getEntityClass() {
         return entityClass;
     }
 ​
     protected Class<T> mapperClass = currentMapperClass();
 }

ServiceImpl类将MP自动生成的service接口和mapper接口关联起来,确定service层代码调用的dao层代码 对于service接口中定义的一些批处理操作做了实现,如saveBatch等操作

四、学习心得

通过初步的使用,MP大大减少了我们日常开发中重复性劳动。对于一些通用的CRUD操作,我们可以直接使用,不需要进行编码

但同时我们也保留了对于自定义SQL拼接操作的可能性,对于一些复杂的dao操作保留了可能性,从而实现更加复杂的业务


通过对比,MP和JPA的思路是类似的,算是一种ORM技术,但是MP是基于Mybatis的,JPA则是通过JDBC封装

两者都保留了自定义SQL查询,但是MP基于Mybatis,可以更加便捷的进行自定义拼接SQL操作

以上均为本人学习MP的一点体会,内容仅供参考,如有错误,望指正。