Mybatis-Plus简单使用,轻松上手
1.介绍
MyBatis-Plus是一个 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 操作智能分析阻断,也可自定义拦截规则,预防误操作
框架结构
官方文档详细介绍:https://baomidou.com/
2.使用步骤
2.1使用的maven工程,在pom文件引入MyBatis-Plus坐标。
<!-- lombok 代码简化 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.22</version> <scope>provided</scope> </dependency> <!-- mybatis-plus 所需依赖 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-generator</artifactId> <version>3.5.1</version> </dependency> <dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.31</version> </dependency> <!-- 开发热启动 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional> </dependency> <!-- MySQL连接 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
tips:
mybatis-plus-boot-starter:核心的应用包
mybatis-plus-generator、freemarker:逆向生成的工具类,生成mapper, service,controller。
2.2 编写 MybatisPlusGenerator工具类
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import com.baomidou.mybatisplus.generator.fill.Column;
import java.util.Collections;
/** * @className: MybatisPlusGenerator * @description: * @author: 沙漏倒装回忆1024 * @date: 2022-10-23 10:19 */ public class MybatisPlusGenerator { public static void main(String[] args) { //数据库链接配置 FastAutoGenerator.create("jdbc:mysql://localhost:3306/springboot_learning?useUnicode=true&useSSL=false&characterEncoding=utf8", "root", "root") .globalConfig(builder -> { builder.author("沙漏倒装回忆1024") // 设置作者 //.enableSwagger() // 开启 swagger 模式 .fileOverride() // 覆盖已生成文件 .outputDir(System.getProperty("user.dir")+"/src/main/java"); // 指定输出目录 }) .packageConfig(builder -> { builder.parent("com.lsqingfeng") // 设置父包名 .moduleName("springboot") // 设置父包模块名 // .service() // 设置自定义service路径,不设置就是默认路径 .pathInfo(Collections.singletonMap(OutputFile.mapperXml, System.getProperty("user.dir") +"/src/main/resources/mapper/")); // 设置mapperXml生成路径 }) .strategyConfig(builder -> { builder.addInclude("table_name") // 设置需要生成的表名 .addTablePrefix("t_", "c_") // 设置自动填充的时间字段 .entityBuilder().addTableFills( new Column("create_time", FieldFill.INSERT),new Column("update_time", FieldFill.INSERT_UPDATE)) ; // 设置过滤表前缀 }) .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板 .execute(); } }
2.3添加配置
a.启动类上添加一个Mapper扫描的注解MapperScan,用来配置需要扫描的mapper包所在的位置。
import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * @className: SpringBootApplication * @description: springboot启动类 * @author: 沙漏倒装回忆1024 * @date: 2022-10-23 14:36 */ @SpringBootApplication @MapperScan("com.项目路径.mapper") public class SpringBootApplication { public static void main(String[] args) { SpringApplication.run(SpringBootApplication.class, args); } }
b.添加Mybatis-Plus中的分页功能,加入分页拦截器的配置。
import com.baomidou.mybatisplus.annotation.DbType; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** * @className: MybatisPlusConfig * @description: * @author: 沙漏倒装回忆1024 * @date: 2022-10-23 14:55 */ @Configuration public class MybatisPlusConfig { /** * 老版本,目前已失效 * @return */ /**@Bean public PaginationInterceptor paginationInterceptor() { PaginationInterceptor paginationInterceptor = new PaginationInterceptor(); return paginationInterceptor; }*/ /** * 新的分页插件,一缓和二缓遵循mybatis的规则, */ @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }
c.自动填充create_time和update_time的配置类,配合实体类使用。
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import lombok.extern.slf4j.Slf4j; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.time.LocalDateTime; /** * @className: MyMetaObjectHandler * @description: * @author: 沙漏倒装回忆1024 * @date: 2022-10-23 14:57 */ @Slf4j @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { log.info("start insert fill..."); this.setFieldValByName("createTime", LocalDateTime.now(), metaObject); this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject); } @Override public void updateFill(MetaObject metaObject) { log.info("start update fill..."); this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject); } }
/** * 创建时间 */ @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; /** * 更新时间 */ @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime;
4.常用Maybatis-Plus lambdaQuery和mapper中EQ、NE、GT、LT、GE、LE的用法及详解
1.等于当前时间 //EQ 就是 EQUAL等于 xxService.lambdaQuery().eq(xx实体类::getUpdateTime,DateUtil.now()) 2.不等于当前时间 //NE就是 NOT EQUAL不等于 xxService.lambdaQuery().ne(xx实体类::getUpdateTime,DateUtil.now()); 3.大于当前时间 //GT 就是 GREATER THAN大于 xxService.lambdaQuery().gt(xx实体类::getUpdateTime,DateUtil.now()); 4.小于当前时间 //LT 就是 LESS THAN小于 xxService.lambdaQuery().lt(xx实体类::getUpdateTime,DateUtil.now()); 5.大于等于当前时间 //GE 就是 GREATER THAN OR EQUAL 大于等于 xxService.lambdaQuery().ge(xx实体类::getUpdateTime,DateUtil.now()); 6.小于等于当前时间 //LE 就是 LESS THAN OR EQUAL 小于等于 xxService.lambdaQuery().le(xx实体类::getUpdateTime,DateUtil.now()); 7.2个时间段是否相交 if ((!startTime.after(endDate)) && (!endTime.before(startDate))) { System.out.println("时间重叠"); }
8.限制条数limit 10
xxService.lambdaQuery().last("limit 10");
9.字段 IN ( sql语句 )
inSql(R column, String inValue)
inSql(boolean condition, R column, String inValue);
10.字段 NOT IN ( sql语句 )
notInSql(R column, String inValue)
notInSql(boolean condition, R column, String inValue)
11.拼接 EXISTS ( sql语句 )
exists(String existsSql)
exists(boolean condition, String existsSql)
12.拼接 NOT EXISTS ( sql语句 )
notExists(String notExistsSql)
notExists(boolean condition, String notExistsSql)
13.HAVING ( sql语句 )
having(String sqlHaving, Object... params)
having(boolean condition, String sqlHaving, Object... params)
14.拼接 sql
apply(String applySql, Object... params)
apply(boolean condition, String applySql, Object... params)
15.desc倒序
xxService.lambdaQuery().orderByDesc("id")
tips:请注意本文中代码没有指定package,因为每个项目的路径都不一样!
笔者: 沙漏倒装回忆1024
出处:https://www.cnblogs.com/lpan1024/
版权所有,欢迎保留原文链接进行转载!
请点赞关注留言,如果有任何建议也可以留言,因为我会回复每一条评论,感谢阅读。
版权所有,转载请注明原文链接: https://www.cnblogs.com/lpan1024/p/16818032.html
请点赞关注留言,如果有任何建议也可以留言,因为我会回复每一条评论,感谢阅读。