飞道的博客

一文速通MybatisPlus

598人阅读  评论(0)

目录

  Mybatis-plus简介

MP特性

框架的结构

 MP快速入门

 配置日志输出

主键生成策略

 自动填充

方式一:数据库级别

方式二:代码控制级别(常用)

乐观锁和悲观锁

测试乐观锁单线程成功的例子 

 乐观锁多线程失败案例

查询操作

分页查询

 删除操作

删除单个

 删除多个

 按map删除

逻辑删除

 性能分析插件p6spy

条件查询器wrapper

 isNotNull匹配不为空的

 eq匹配相等

 between查询区间

like模糊匹配

 insql子查询

 orderByDesc排序

 代码自动生成器


  Mybatis-plus简介

mybatis-plus官网

 r

mybatis-plus(简称MP)是一个mybatis的增强工具,在Mybatis的基础上自作增强不做改变,为简化开发、提高效率而生。Mybatis-plus提供了通用的mapper和service,可以在不便携任何sql语句的情况下,快速的实现对单表的crud、批量、逻辑删除、分页操作。

MP特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 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快速入门

新建一个数据表


  
  1. DROP TABLE IF EXISTS user;
  2. CREATE TABLE user
  3. (
  4. id BIGINT(20) NOT NULL COMMENT '主键ID',
  5. name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
  6. age INT(11) NULL DEFAULT NULL COMMENT '年龄',
  7. email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
  8. PRIMARY KEY ( id)
  9. );

插入一些数据


  
  1. INSERT INTO user ( id, name, age, email) VALUES
  2. (1, 'Jone', 18, 'test1@1.com'),
  3. (2, 'Jack', 20, 'test2@2.com'),
  4. (3, 'Tom', 28, 'test3@3.com'),
  5. (4, 'Sandy', 21, 'test4@4.com'),
  6. (5, 'Billie', 24, 'test5@5.com');

idea中 新建一个模块。

pom.xml中


  
  1. <dependencies>
  2. <dependency>
  3. <groupId>com.baomidou </groupId>
  4. <artifactId>mybatis-plus-boot-starter </artifactId>
  5. <version>3.4.2 </version>
  6. </dependency>
  7. <dependency>
  8. <groupId>mysql </groupId>
  9. <artifactId>mysql-connector-java </artifactId>
  10. <scope>runtime </scope>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.projectlombok </groupId>
  14. <artifactId>lombok </artifactId>
  15. <optional>true </optional>
  16. </dependency>
  17. <dependency>
  18. <groupId>org.springframework.boot </groupId>
  19. <artifactId>spring-boot-starter-test </artifactId>
  20. <scope>test </scope>
  21. <exclusions>
  22. <exclusion>
  23. <groupId>org.junit.vintage </groupId>
  24. <artifactId>junit-vintage-engine </artifactId>
  25. </exclusion>
  26. </exclusions>
  27. </dependency>
  28. </dependencies>

mapper类下


  
  1. package com.mapper;
  2. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  3. import com.pojo.User;
  4. import org.springframework.stereotype.Component;
  5. @Component
  6. public interface UserMapper extends BaseMapper<User> {
  7. }

pojo包下


  
  1. import lombok.Data;
  2. @Data
  3. public class User {
  4. private Long id;
  5. private String name;
  6. private Integer age;
  7. private String email;
  8. }

application.yaml配置文件下


  
  1. #配置相关信息
  2. spring:
  3. datasource:
  4. driver-class-name: com.mysql.cj.jdbc.Driver
  5. url: jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC
  6. username: root
  7. password: 123456

测试类


  
  1. import com.mapper.UserMapper;
  2. import com.pojo.User;
  3. import org.junit.jupiter.api.Test;
  4. import org.mybatis.spring.annotation.MapperScan;
  5. import org.springframework.beans.factory.annotation.Autowired;
  6. import org.springframework.boot.test.context.SpringBootTest;
  7. import java.util.List;
  8. @SpringBootTest
  9. @MapperScan("com.mapper") //扫描mapper,自动创建实现类
  10. class MybatisPlusQuickApplicationTests {
  11. @Autowired
  12. private UserMapper userMapper;
  13. @Test
  14. void contextLoads () {
  15. List<User> users = userMapper.selectList( null);
  16. users.forEach(System.out::println);
  17. }
  18. }

运行结果

 配置日志输出

在控制台中想要知道mp的执行过程,在配置文件配置


  
  1. mybatis-plus:
  2. configuration:
  3. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

运行结果 

 由此可见,mp的底层还是调用了jdbc去创建SqlSession对象。

主键生成策略

  • 数据库自增长
  • UUID
  • Redis生成id
  • snowflake(雪花算法)

snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0

mybatisplus的主键生成策略就是采用这种雪花算法方式

测试插入


  
  1. @Test
  2. void insert () {
  3. User user = new User();
  4. user.setName( "kc");
  5. user.setAge( 18);
  6. user.setEmail( "123@qq.com");
  7. userMapper.insert(user);
  8. }

 配置主键自增

在实体类对象中配置,前提是数据库表中也是设置自增的


  
  1. @Data
  2. public class User {
  3. @TableId(type = IdType.AUTO)
  4. private Long id;
  5. private String name;
  6. private Integer age;
  7. private String email;
  8. }

IdType源码


  
  1. public enum IdType {
  2. AUTO( 0),数据库id自增
  3. NONE( 1),未设置主键
  4. INPUT( 2),手动输入
  5. ID_WORKER( 3),默认的全局唯一id
  6. ID_WORKER_STR (3), ID_WORKER字符串表示法
  7. UUID( 4); //全局唯一id uuid
  8. }

自动拼接动态sql 

 自动填充

创建时间、修改时间,这些操作一般都是自动化完成的,不希望手动更新。

阿里巴巴开发手册:一般所有的数据库表:都要配上gmt_create、gmt_modified这两个字段,而且需要自动化。

方式一:数据库级别

在数据库表中新增这两个字段,默认值为CURRENT_TIMESTAMP,表示当前时间

方式二:代码控制级别(常用)

数据库表通常是不能够修改的,在代码中使用自动填充

首先在对象上添加   @TableField字段


  
  1. import java.util.Date;
  2. @Data
  3. public class User {
  4. @TableId(type = IdType.AUTO)
  5. private Long id;
  6. private String name;
  7. private Integer age;
  8. private String email;
  9. @TableField(fill = FieldFill.INSERT) //插入的时候执行
  10. private Date creatTime;
  11. @TableField(fill = FieldFill.INSERT_UPDATE) //插入和更新时执行
  12. private Date updateTime;
  13. }

然后自定义实现类 MyMetaObjectHandler,好让spring识别并做出处理


  
  1. package com.handler;
  2. import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
  3. import lombok.extern.slf4j.Slf4j;
  4. import org.apache.ibatis.reflection.MetaObject;
  5. import org.springframework.stereotype.Component;
  6. import java.util.Date;
  7. @Slf4j
  8. @Component //得交给spring容器管理
  9. public class MyMetaObjectHandler implements MetaObjectHandler {
  10. @Override
  11. public void insertFill (MetaObject metaObject) {
  12. log.info( "start insert fill...");
  13. //setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
  14. this.setFieldValByName( "creatTime", new Date(),metaObject);
  15. this.setFieldValByName( "updateTime", new Date(),metaObject);
  16. }
  17. @Override
  18. public void updateFill (MetaObject metaObject) {
  19. log.info( "start update fill...");
  20. this.setFieldValByName( "updateTime", new Date(),metaObject);
  21. }
  22. }

测试插入


  
  1. @Test
  2. void insert () {
  3. User user = new User();
  4. user.setName( "autoInertTest");
  5. user.setAge( 123);
  6. user.setEmail( "12133@qq.com");
  7. userMapper.insert(user);
  8. }

运行结果 

测试更新 


  
  1. @Test
  2. void update () {
  3. User user = new User();
  4. user.setId( 5L);
  5. user.setName( "kongchaoAfter");
  6. user.setAge( 1222);
  7. user.setEmail( "nono@qq.com");
  8. userMapper.updateById(user);
  9. }

 运行结果

乐观锁和悲观锁

乐观锁:顾名思义十分乐观,他总是认为不会出现问题,无论干什么都不去上锁,如果出现了问题,在次更新值测试

在数据库中新增字段version,在实体类中也要增加对应的,使用@Version表示他是一个乐观锁

乐观锁:先查询,获取它的版本号,然后在一系列的操作后,让他的版本号+1,前提是这个版本号还是之前查出来的那个版本号。


  
  1. @Version //乐观锁
  2. private Integer version;

 写一个配置类


  
  1. @Configuration
  2. @MapperScan("com.mapper")
  3. public class MyBatisPlusConfig {
  4. @Bean
  5. public MybatisPlusInterceptor mybatisPlusInterceptor () {
  6. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  7. interceptor.addInnerInterceptor( new OptimisticLockerInnerInterceptor());
  8. return interceptor;
  9. }
  10. }

测试乐观锁单线程成功的例子 

 更新下


  
  1. @Test
  2. void update () {
  3. User user = userMapper.selectById( 5L);
  4. user.setName( "kongchaoAfter");
  5. user.setAge( 21);
  6. user.setEmail( "kc@qq.com");
  7. userMapper.updateById(user);
  8. }

 说明:

  • 支持的数据类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime
  • 整数类型下 newVersion = oldVersion + 1
  • newVersion 会回写到 entity 中
  • 仅支持 updateById(id) 与 update(entity, wrapper) 方法
  • 在 update(entity, wrapper) 方法下, wrapper 不能复用!!!

 

 乐观锁多线程失败案例


  
  1. @Test
  2. void update2 () {
  3. //线程1
  4. User user = userMapper.selectById( 5L);
  5. user.setName( "kongchao1");
  6. user.setAge( 11);
  7. user.setEmail( "kc1@qq.com");
  8. //模拟另一个线程插队
  9. User user2 = userMapper.selectById( 5L);
  10. user2.setName( "kongchao2");
  11. user2.setAge( 22);
  12. user2.setEmail( "kc2@qq.com");
  13. userMapper.updateById(user2);
  14. //若没有乐观锁,则会覆盖user2的操作
  15. userMapper.updateById(user);
  16. }

数据库 

 运行结果

查询操作


  
  1. // 测试查询
  2. @Test
  3. public void testSelectById (){
  4. User user = userMapper.selectById( 1L);
  5. System.out.println(user);
  6. }


  
  1. // 测试批量查询!
  2. @Test
  3. public void testSelectByBatchId (){
  4. List<User> users = userMapper.selectBatchIds(Arrays.asList( 1, 2, 3));
  5. users.forEach(System.out::println);
  6. }


  
  1. @SpringBootTest
  2. @MapperScan("com.mapper") //扫描mapper,自动创建实现类
  3. class MybatisPlusQuickApplicationTests {
  4. @Autowired
  5. private UserMapper userMapper;
  6. //按条件查询之一使用map操作
  7. @Test
  8. public void testSelectByBatchIds (){
  9. HashMap<String, Object> map = new HashMap<>();
  10. // 自定义要查询
  11. map.put( "name", "kc");
  12. map.put( "age", 18);
  13. List<User> users = userMapper.selectByMap(map);
  14. users.forEach(System.out::println);
  15. }
  16. }

分页查询

在配置类中加入分页插件


  
  1. @Configuration
  2. @MapperScan("com.mapper")
  3. public class MyBatisPlusConfig {
  4. // 分页插件
  5. @Bean
  6. public PaginationInterceptor paginationInterceptor (){
  7. return new PaginationInterceptor();
  8. }
  9. }

在测试类中测试


  
  1. //测试分页查询
  2. @Test
  3. public void pageTest (){
  4. //第一页,每页三个数据
  5. Page<User> page= new Page<>( 1, 3);
  6. userMapper.selectPage(page, null);
  7. page.getRecords().forEach(System.out::print);
  8. }

可以获取各种参数 

运行结果

 删除操作

删除单个


  
  1. @Test
  2. public void deleteById (){
  3. userMapper.deleteById( 1583366844257988614L);
  4. }

 删除多个


  
  1. //删除多个
  2. @Test
  3. public void deleteByIds (){
  4. userMapper.deleteBatchIds(Arrays.asList( 1583366844257988612L, 1583366844257988613L));
  5. }

 按map删除


  
  1. //通过map删除
  2. @Test
  3. public void deleteMap (){
  4. HashMap<String,Object> hashMap= new HashMap<>();
  5. hashMap.put( "name", "kc");
  6. userMapper.deleteByMap(hashMap);
  7. }

逻辑删除

 物理删除:从数据库中移除

逻辑删除:数据还存在数据库中,是增加了一个deleted字段,以这个字段作为条件,当字段=1时不显示这条数据

这个功能类似于回收站。并没有真正删除。

在数据库中添加字段deleted然后在实体类中也加入,并带上注解


  
  1. @TableLogic //逻辑删除
  2. private Integer deleted;

 在application.yaml配置文件中配置


  
  1. mybatis-plus:
  2. global-config:
  3. db-config:
  4. # 没有逻辑删除的显示为0,否则显示1
  5. logic-delete-value: 1
  6. logic-not-delete-value: 0

测试之前的删除


  
  1. //逻辑删除单个
  2. @Test
  3. public void deleteById (){
  4. userMapper.deleteById( 6L);
  5. }

 运行结果,删除只是将deleted字段变为1

 测试查询


  
  1. // 测试查询
  2. @Test
  3. public void testSelectById (){
  4. User user = userMapper.selectById( 6L);
  5. }

运行结果,发现也会加上deleted=0的条件

 性能分析插件p6spy

在平时的使用中会遇到一些比较慢的sql

作用:性能分析拦截器,用于输出每条 SQL 语句及其执行时间
p6spy原理
p6spy将应用的数据源给劫持了,应用操作数据库其实在调用p6spy的数据源,p6spy劫持到需要执行的sql或者hql之类的语句之后,他自己去调用一个realDatasource,再去操作数据库
pom.xml导入p6spy坐标

   
  1. <!-- 性能分析插件 -->
  2. <dependency>
  3. <groupId>p6spy </groupId>
  4. <artifactId>p6spy </artifactId>
  5. <version>3.9.0 </version>
  6. </dependency>

application.yaml配置文件中


   
  1. #配置相关信息
  2. spring:
  3. datasource:
  4. # driver-class-name: com.mysql.cj.jdbc.Driver
  5. driver-class-name: com.p6spy.engine.spy.P6SpyDriver
  6. #
  7. url: jdbc:p6spy:mysql://localhost:3306/mybatisplus?useSSL= false&serverTimezone=GMT%2B8
  8. # url: jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC
  9. username: root
  10. password: 123456

在resource新建spy.properties


   
  1. driverlist=com.mysql.cj.jdbc.Driver
  2. logMessageFormat=com.p6spy.engine.spy.appender.MultiLineFormat
  3. #logMessageFormat=com.p6spy.engine.spy.appender.SingleLineFormat
  4. databaseDialectDateFormat=yyyy-MM- dd HH:mm:ss
  5. appender=com.p6spy.engine.spy.appender.StdoutLogger

测试代码


   
  1. // 测试批量查询!
  2. @Test
  3. public void testSelectByBatchId (){
  4. List<User> users = userMapper.selectBatchIds(Arrays.asList( 1, 2, 3));
  5. users.forEach(System.out::println);
  6. }

运行结果

条件查询器wrapper

官网查看mp条件构造器

 isNotNull匹配不为空的


   
  1. @SpringBootTest
  2. public class TestWrapper {
  3. @Autowired
  4. private UserMapper userMapper;
  5. @Test
  6. public void test1 (){
  7. QueryWrapper<User> wrapper= new QueryWrapper<>();
  8. //查询name字段不为空,且年龄大于等于15的
  9. //wrapper返回的还是对象,所以可以直接.操作
  10. wrapper.isNotNull( "name").ge( "age", 15);
  11. userMapper.selectList(wrapper);
  12. }
  13. }

运行结果,条件构造器的本质就是省sql语句的编写,可以用来做些判断

 eq匹配相等


   
  1. @Test
  2. public void test2 (){
  3. QueryWrapper<User> wrapper= new QueryWrapper<>();
  4. //查询name为kongchao的
  5. wrapper.eq( "name", "kongchao");
  6. userMapper.selectOne(wrapper);
  7. }

 between查询区间


   
  1. @Test
  2. public void test3 (){
  3. QueryWrapper<User> wrapper= new QueryWrapper<>();
  4. //查询年龄在10-18岁的(闭区间)
  5. wrapper.between( "age", 10, 18);
  6. userMapper.selectList(wrapper);
  7. }

like模糊匹配


   
  1. @Test
  2. public void test4 (){
  3. QueryWrapper<User> wrapper= new QueryWrapper<>();
  4. //名字中不含o,邮箱是以t开头 (t%)
  5. wrapper.notLike( "name", "o").likeRight( "email", "t");
  6. userMapper.selectList(wrapper);
  7. }

 insql子查询


   
  1. @Test
  2. public void test5 (){
  3. QueryWrapper<User> wrapper= new QueryWrapper<>();
  4. wrapper.inSql( "id", "select id from user where age>=20");
  5. userMapper.selectList(wrapper);
  6. }

 orderByDesc排序


   
  1. @Test
  2. public void test6 (){
  3. //id降序排序
  4. QueryWrapper<User> wrapper= new QueryWrapper<>();
  5. wrapper.orderByDesc( "id");
  6. userMapper.selectList(wrapper);
  7. }

 代码自动生成器

pom.xml下


   
  1. <dependencies>
  2. <dependency>
  3. <groupId>com.baomidou </groupId>
  4. <artifactId>mybatis-plus-generator </artifactId>
  5. <version>3.4.1 </version>
  6. </dependency>
  7. <!--velocity 模版引擎,代码自动生成时用-->
  8. <dependency>
  9. <groupId>org.apache.velocity </groupId>
  10. <artifactId>velocity-engine-core </artifactId>
  11. <version>2.0 </version>
  12. </dependency>
  13. <!--文件上传-->
  14. <dependency>
  15. <groupId>com.alibaba </groupId>
  16. <artifactId>fastjson </artifactId>
  17. <version>1.2.47 </version>
  18. </dependency>
  19. <dependency>
  20. <groupId>com.baomidou </groupId>
  21. <artifactId>mybatis-plus-boot-starter </artifactId>
  22. <version>3.4.2 </version>
  23. </dependency>
  24. <!-- 性能分析插件 -->
  25. <dependency>
  26. <groupId>p6spy </groupId>
  27. <artifactId>p6spy </artifactId>
  28. <version>3.9.0 </version>
  29. </dependency>
  30. <!--druid-->
  31. <dependency>
  32. <groupId>com.alibaba </groupId>
  33. <artifactId>druid </artifactId>
  34. <version>1.2.12 </version>
  35. </dependency>
  36. <!--log4j-->
  37. <dependency>
  38. <groupId>log4j </groupId>
  39. <artifactId>log4j </artifactId>
  40. <version>1.2.17 </version>
  41. </dependency>
  42. <dependency>
  43. <groupId>io.springfox </groupId>
  44. <artifactId>springfox-swagger-ui </artifactId>
  45. <version>2.7.0 </version>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.springframework.boot </groupId>
  49. <artifactId>spring-boot-starter-thymeleaf </artifactId>
  50. </dependency>
  51. <dependency>
  52. <groupId>org.springframework.boot </groupId>
  53. <artifactId>spring-boot-devtools </artifactId>
  54. </dependency>
  55. <dependency>
  56. <groupId>org.springframework.boot </groupId>
  57. <artifactId>spring-boot-configuration-processor </artifactId>
  58. </dependency>
  59. <dependency>
  60. <groupId>mysql </groupId>
  61. <artifactId>mysql-connector-java </artifactId>
  62. <scope>runtime </scope>
  63. </dependency>
  64. <dependency>
  65. <groupId>org.projectlombok </groupId>
  66. <artifactId>lombok </artifactId>
  67. <optional>true </optional>
  68. </dependency>
  69. <dependency>
  70. <groupId>org.springframework.boot </groupId>
  71. <artifactId>spring-boot-starter-test </artifactId>
  72. <scope>test </scope>
  73. <exclusions>
  74. <exclusion>
  75. <groupId>org.junit.vintage </groupId>
  76. <artifactId>junit-vintage-engine </artifactId>
  77. </exclusion>
  78. </exclusions>
  79. </dependency>
  80. </dependencies>

自动生成的代码


   
  1. package conf;
  2. import com.baomidou.mybatisplus.generator.config.GlobalConfig;
  3. import com.baomidou.mybatisplus.annotation.DbType;
  4. import com.baomidou.mybatisplus.annotation.FieldFill;
  5. import com.baomidou.mybatisplus.annotation.IdType;
  6. import com.baomidou.mybatisplus.generator.AutoGenerator;
  7. import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
  8. import com.baomidou.mybatisplus.generator.config.PackageConfig;
  9. import com.baomidou.mybatisplus.generator.config.StrategyConfig;
  10. import com.baomidou.mybatisplus.generator.config.po.TableFill;
  11. import com.baomidou.mybatisplus.generator.config.rules.DateType;
  12. import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
  13. import java.util.ArrayList;
  14. public class AutoMP {
  15. // 代码自动生成器
  16. public static void main (String[] args) {
  17. // 需要构建一个 代码自动生成器 对象
  18. AutoGenerator mpg = new AutoGenerator();
  19. // 配置策略
  20. // 1、全局配置
  21. GlobalConfig gc = new GlobalConfig();
  22. String projectPath = System.getProperty( "user.dir");
  23. gc.setOutputDir(projectPath+ "/src/main/java");
  24. gc.setAuthor( "执久呀");
  25. gc.setOpen( false);
  26. gc.setFileOverride( false); // 是否覆盖
  27. gc.setServiceName( "%sService"); // 去Service的I前缀
  28. gc.setIdType(IdType.ID_WORKER);
  29. gc.setDateType(DateType.ONLY_DATE);
  30. gc.setSwagger2( true);
  31. mpg.setGlobalConfig(gc);
  32. //2、设置数据源
  33. DataSourceConfig dsc = new DataSourceConfig();
  34. dsc.setUrl( "jdbc:mysql://localhost:3306/mybatisplus?useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
  35. dsc.setDriverName( "com.mysql.cj.jdbc.Driver");
  36. dsc.setUsername( "root");
  37. dsc.setPassword( "123456");
  38. dsc.setDbType(DbType.MYSQL);
  39. mpg.setDataSource(dsc);
  40. //3、包的配置
  41. PackageConfig pc = new PackageConfig();
  42. pc.setModuleName( "blog");
  43. pc.setParent( "autopage");
  44. pc.setEntity( "pojo");
  45. pc.setMapper( "mapper");
  46. pc.setService( "service");
  47. pc.setController( "controller");
  48. mpg.setPackageInfo(pc);
  49. //4、策略配置
  50. StrategyConfig strategy = new StrategyConfig();
  51. strategy.setInclude( "user"); // 设置要映射的表名
  52. strategy.setNaming(NamingStrategy.underline_to_camel);
  53. strategy.setColumnNaming(NamingStrategy.underline_to_camel);
  54. strategy.setEntityLombokModel( true); // 自动lombok;
  55. strategy.setLogicDeleteFieldName( "deleted");
  56. // 自动填充配置
  57. TableFill gmtCreate = new TableFill( "create_time", FieldFill.INSERT);
  58. TableFill gmtModified = new TableFill( "update_time",FieldFill.INSERT_UPDATE);
  59. ArrayList<TableFill> tableFills = new ArrayList<>();
  60. tableFills.add(gmtCreate);
  61. tableFills.add(gmtModified);
  62. strategy.setTableFillList(tableFills);
  63. // 乐观锁
  64. strategy.setVersionFieldName( "version");
  65. strategy.setRestControllerStyle( true);
  66. strategy.setControllerMappingHyphenStyle( true); //localhost:8080/hello_id_2
  67. mpg.setStrategy(strategy);
  68. mpg.execute(); //执行
  69. }
  70. }


转载:https://blog.csdn.net/weixin_60719453/article/details/126771456
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场