Mybatis Plus 不常用的功能 2022-06-26 程序之旅,记录 暂无评论 805 次阅读 ## Mybatis Plus 不常用的功能 Mybatis Plus 是 Mybatis 的一个增强工具,官网是 https://mp.baomidou.com/,github 地址是 https://github.com/baomidou/mybatis-plus ,社区还是比较活跃。其中的功能强大有许多人都不太了解,这里做简单的记录。 ### 特性 - 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 - 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可`自定义拦截规则`,预防误操作 > 特性摘抄于互联网 这里就以 ActiveRecord 、自动填充、逻辑删除和注入器等这几个强大的功能作为深入了解 MP(Mybatis-Plus)的切入点。信息量有点大,可以挑选自己感兴趣的动能进行学习。 ### ActiveRecord (AR) ActiveRecord 也属于 ORM 层,是 Rails 最早提出,遵守标准的 ORM 模型。 AR 的主要思想: - 每一个数据库对应创建一个类,类的每一个对象实例数据库中表的一条记录;通常表的每一个字段在类中都有相应的 Field; - ActiveRecord 中封装了对数据库的访问,即 CURD; - ActiveRecord 是一种领域模型(Domain Model),封装了部分业务逻辑; #### 使用方法 使用很简单,首先要是 MP 框架,其次满足一下条件: 1、需要有 Mapper,并且实现 baseMapper 2、实体类集成 Model 例如 ```java import com.baomidou.mybatisplus.extension.activerecord.Model; @Data @NoArgsConstructor @AllArgsConstructor public class User extends Model { private Long id; private String userName; private String password; private String name; private Integer age; private String email; } ``` 使用 ```java @RunWith(SpringRunner.class) @SpringBootTest public class UserMapperTest { @Autowired private UserMapper userMapper; @Test public void testAR() { User user = new User(); user.setId(2L); User user2 = user.selectById(); System.out.println(user2); } } ``` ### 自动填充 在开发过程中,希望有些字段可以自动填充数据,例如创建时间、更新时间,MP 提供了自动填充的功能。 #### 使用方法 满足一下两个条件 1、字段上添加注解 @TableField,定义 fill 内容 2、编写实现 MetaObjectHandler 接口 FieldFill 提供的模式 ```java public enum FieldFill { DEFAULT, INSERT, UPDATE, /** * 插⼊和更新时填充字段 */ INSERT_UPDATE; private FieldFill() { } } ``` 例子 ```java /** * 创建时间 */ @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime = LocalDateTime.now(); ``` 实现 MetaObjectHandler ```java @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName("createTime", LocalDateTime.now(), metaObject); this.setFieldValByName("modifyTime", LocalDateTime.now(), metaObject); } @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName("modifyTime", LocalDateTime.now(), metaObject); } } ``` 如果存在 `createTime` 或 `modifyTime` 的字段并且字段上有 fill = FieldFill.INSERT 的配置,就会进行内容的填充。 ### 逻辑删除 顾名思义,逻辑删除,不是物理删除,删除的状态是使用数据库字段表示。 在实体字段上添加 `@TableLogic`即可。默认 1:已删除;0:未删除。可以在配置文件中配置删除状态。 application.properties ```properties # 逻辑已删除值(默认为 1) mybatis-plus.global-config.db-config.logic-delete-value=1 # 逻辑未删除值(默认为 0) mybatis-plus.global-config.db-config.logic-not-delete-value=0 ``` ### 注入器 MP 已经提供了 CURD 的操作,业务开发中往往会因为业务的需要而扩充 BaseMapper 中的方法,这个时候我们需要自定义实现 MyBaseMapper(继承 BaseMapeer) ,并通过 AbstractSqlInjector 将 MyBaseMapper 注入到 Mybatis 容器中。 #### 使用方法 ```java import com.baomidou.mybatisplus.core.mapper.BaseMapper; import java.util.List; public interface MyBaseMapper extends BaseMapper { // findAll 是自定义的方法 List findAll(); } ``` 实现 FindAll 方法操作 ```java import com.baomidou.mybatisplus.core.injector.AbstractMethod; import com.baomidou.mybatisplus.core.metadata.TableInfo; import org.apache.ibatis.mapping.MappedStatement; import org.apache.ibatis.mapping.SqlSource; public class FindAll extends AbstractMethod { @Override public MappedStatement injectMappedStatement(Class> mapperClass, Class> modelClass, TableInfo tableInfo) { String sql = "select * from " + tableInfo.getTableName(); SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass); return this.addSelectMappedStatement(mapperClass, "findAll", sqlSource, modelClass, tableInfo); } } ``` 使用注入器 ```java public class MySqlInjector extends DefaultSqlInjector { @Override public List getMethodList() { List methodList = super.getMethodList(); methodList.add(new FindAll()); return methodList; } } ``` MP 配置中添加注入器 ```java /* 自定义的sql注入器 */ @Bean public MySqlInjector mySqlInjector(){ return new MySqlInjector(); } ``` 打赏: 微信, 支付宝 标签: mybatis 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。