企业站群cms,中国互联网上网服务行业协会,西安做公司网站,wordpress个人博客主题模板中文文章目录 1. 简介2. 入门使用3. 核心功能3.1 CRUD 接口3.1.1 Mapper CRUD 接口3.1.2 Service CRUD 接口 3.2 条件构造器3.3 分页插件3.4 Mybatis-Plus 注解 4. 拓展4.1 逻辑删除4.2 MybatisX快速开发插件 5. 插件5.1 [分页插件](#page)5.2 乐观锁插件 1. 简介
MyBatis Plus在 MyBatis 的基础上只做增强不做改变为简化开发、提高效率而生。官网https://baomidou.com/ 下面功能及使用都可从官网找到
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 操作智能分析阻断也可自定义拦截规则预防误操作
2. 入门使用 创建Maven工程 添加依赖这里给一份 springboot3 较为完整依赖 parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion3.2.0/version
/parentdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-aop/artifactId/dependencydependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-spring-boot3-starter/artifactIdversion3.5.5/version/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jdbc/artifactId/dependencydependencygroupIdcom.alibaba/groupIdartifactIddruid-spring-boot-3-starter/artifactIdversion1.2.20/version/dependencydependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.33/version/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdversion1.18.28/version/dependency
/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins
/build启动类配置 MapperScan(com.springboot.mapper) mapper接口扫描注解 配置文件 application.yaml spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:username: rootpassword: rooturl: jdbc:mysql:///mybatisplusdriver-class-name: com.mysql.cj.jdbc.Driver编写 mapper 接口继承 BaseMapper 继承mybatis-plus提供的基础Mapper接口将自带crud方法
部分约定配置
map-underscore-to-camel-case 下划线驼峰命名默认开启
mapper扫描classpath*:/mapper/**/*.xml
3. 核心功能
3.1 CRUD 接口
3.1.1 Mapper CRUD 接口
官网https://baomidou.com/pages/49cc81/#mapper-crud-接口
使用时ScheduleMapper extends BaseMapperSchedule
通用 CRUD 封装 BaseMapper 接口为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器泛型 T 为任意实体对象参数 Serializable 为任意类型主键 Mybatis-Plus 不推荐使用复合主键约定每一张表都有自己的唯一 id 主键对象 Wrapper 为 条件构造器
ScheduleMapper 将包含 BaseMapper 中的一系列增删改查及分页查询方法
3.1.2 Service CRUD 接口
官网https://baomidou.com/pages/49cc81/#service-crud-接口
通用 Service CRUD 封装 IService 接口进一步封装 CRUD 采用 get 查询单行 remove 删除 list 查询集合 page 分页 前缀命名方式区分 Mapper 层避免混淆泛型 T 为任意实体对象建议如果存在自定义通用 Service 方法的可能请创建自己的 IBaseService 继承 Mybatis-Plus 提供的基类对象 Wrapper 为 条件构造器
3.2 条件构造器 Wrapper 条件构造抽象类最顶端父类
AbstractWrapper 用于查询条件封装生成 sql 的 where 条件 QueryWrapper 查询/删除条件封装UpdateWrapper 修改条件封装AbstractLambdaWrapper 使用Lambda 语法 LambdaQueryWrapper 用于Lambda语法使用的查询WrapperLambdaUpdateWrapper Lambda 更新封装Wrapper
组装条件 这里仅介绍基于 Lambda 的条件封装的使用非 Lambda 自行创建对象 QueryWrapper 用类似方法进行拼接即可
LambdaQueryWrapper
RequestMapping(query)
public ResultListSchedule query() {LambdaQueryWrapperSchedule queryWrapper new LambdaQueryWrapper();queryWrapper.eq(Schedule::getId, 2);return new Result(scheduleService.list(queryWrapper));
}LambdaUpdateWrapper 使用 set() 方法设置属性
RequestMapping(update)
public ResultBoolean update() {LambdaUpdateWrapperSchedule updateWrapper new LambdaUpdateWrapper();updateWrapper.eq(Schedule::getId, 2).eq(Schedule::getCompleted, 0);updateWrapper.set(Schedule::getCompleted, 1).set(Schedule::getTitle, 学个P呀);return new Result(scheduleService.update(updateWrapper));
}3.3 分页插件
配置方法配置类中将 MybatisPlusInterceptor 注入 IoC容器中注入前添加 PaginationInnerInterceptor 拦截器
MapperScan(com.springboot.mapper)
SpringBootApplication
public class SpringBootApplicationMain {public static void main(String[] args) {SpringApplication.run(SpringBootApplicationMain.class);}Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加//interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbTypereturn interceptor;}
}使用默认实现的分页scheduleService.page 返回的是 Page 对象与 new Page 是同一个只是对象中有了更多信息
RequestMapping(query)
public ResultPageSchedule query() {PageSchedule page new Page(1,5);return new Result(scheduleService.page(page));
}Page 该类继承了 IPage 类实现了 简单分页模型 如果你要实现自己的分页模型可以继承 Page 类或者实现 IPage 类
属性名类型默认值描述recordsListemptyList查询数据列表totalLong0查询列表总记录数sizeLong10每页显示条数默认 10currentLong1当前页ordersListemptyList排序字段信息允许前端传入的时候注意 SQL 注入问题可以使用 SqlInjectionUtils.check(...) 检查文本optimizeCountSqlbooleantrue自动优化 COUNT SQL 如果遇到 jSqlParser 无法解析情况设置该参数为 falseoptimizeJoinOfCountSqlbooleantrue自动优化 COUNT SQL 是否把 join 查询部分移除searchCountbooleantrue是否进行 count 查询如果只想查询到列表不要查询总记录数设置该参数为 falsemaxLimitLong单页分页条数限制countIdStringxml 自定义 count 查询的 statementId 也可以不用指定在分页 statementId 后面加上 _mpCount 例如分页 selectPageById 指定 count 的查询 statementId 设置为 selectPageById_mpCount 即可默认找到该 SQL 执行
自定义分页方法接口
//传入参数携带Ipage接口
//返回结果为IPage
IPageUser selectPageVo(IPage? page, Integer id);select idselectPageVo resultTypexxx.xxx.xxx.UserSELECT * FROM user WHERE id #{id}
/select如果返回类型是 IPage 则入参的 IPage 不能为null因为 返回的 IPage 入参的IPage如果想临时不分页可以在初始化 IPage 时 size 参数传 0 的值 如果返回类型是 List 则入参的 IPage 可以为 null(为 null 则不分页)但需要你手动 入参的IPage.setRecords(返回的 List); 如果 xml 需要从 page 里取值,需要 page.属性 获取 注意多个插件使用的情况请将分页插件放到 插件执行链 最后面。如在租户插件前面会出现 COUNT 执行 SQL 不准确问题
3.4 Mybatis-Plus 注解
详情可参考官网https://baomidou.com/pages/223848/#tablename
TableName 表名注解标识实体类对应的表TableId 主键注解。type指定为 ASSIGN_ID 会调用主键生成默认实现类以雪花算法生成 IDTableField 字段注解非主键Version 乐观锁注解TableLogic 逻辑处理注解增加注解后删除会进行逻辑删除。默认逻辑删除属性已删除值为 1未删除值为 0。也可通过 mybatis-plus.global-config.db-config.logic-delete-field 配置全局逻辑删除属性。二者必须配置一个逻辑删除才会生效注意也会影响默认查询逻辑查询中会过滤逻辑删除的数据OrderBy 内置 SQL 默认指定排序优先级低于 wrapper 条件查询
4. 拓展
4.1 逻辑删除
配置 application.yaml 从 3.3.0 版本开始可以忽略不配置 TableLogic 注解
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)实体类字段上加上 TableLogic 注解
4.2 MybatisX快速开发插件
在 idea 插件中搜索 MybatisX 安装后右侧导航栏(Datasbase)连接数据源后即可选择表右键直接生成代码 如果需要生成是子模块代码这里需要手动填一下子模块目录目前版本选中子模块不会自动填入如我这里是 T01
relative package 实体类的生成包 之后需选中 Model 才会生成实体类 5. 插件
目前已有的功能:
自动分页: PaginationInnerInterceptor乐观锁: OptimisticLockerInnerInterceptor多租户: TenantLineInnerInterceptor动态表名: DynamicTableNameInnerInterceptor非法SQL拦截: IllegalSQLInnerInterceptor防止全表更新与删除: BlockAttackInnerInterceptor数据权限DataPermissionInterceptor数据变动记录DataChangeRecorderInnerInterceptor
插件配置注入 MybatisPlusInterceptor 对象即可注入前把需要的对应拦截器添加到该对象中
MapperScan(com.springboot.mapper)
SpringBootApplication
public class SpringBootApplicationMain {public static void main(String[] args) {SpringApplication.run(SpringBootApplicationMain.class);}Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));//如果配置多个插件,切记分页最后添加//interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); 如果有多数据源可以不配具体类型 否则都建议配上具体的DbTypereturn interceptor;}
}注意:
使用多个功能需要注意顺序关系建议使用如下顺序
多租户动态表名分页乐观锁sql 性能规范防止全表更新与删除
总结: 对 sql 进行单次改造的优先放入不对 sql 进行改造的最后放入
具体可参考官网使用https://baomidou.com/pages/2976a3/
5.1 分页插件
5.2 乐观锁插件
配置完拦截器后在实体类的字段上加上 Version 注解即可
说明:
支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime整数类型下 newVersion oldVersion 1 newVersion 会回写到 entity 中仅支持 updateById(id) 与 update(entity, wrapper) 方法在 update(entity, wrapper) 方法下, wrapper 不能复用!!!