一、简介

1.1 特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 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 操作智能分析阻断,也可自定义拦截规则,预防误操作

1.2 通用的MP模板

1.2.1 pom依赖

  1. <!--SpringBoot整合mybatis-plus-->
  2. <dependency>
  3. <groupId>com.baomidou</groupId>
  4. <artifactId>mybatis-plus-boot-starter-test</artifactId>
  5. <version>3.4.3.4</version>
  6. </dependency>
  7. <!-- mybatisPlus 代码生成器 -->
  8. <dependency>
  9. <groupId>com.baomidou</groupId>
  10. <artifactId>mybatis-plus-generator</artifactId>
  11. <version>3.3.1.tmp</version>
  12. </dependency>
  13. <!-- mybatisPlus Velocity 模版引擎 -->
  14. <dependency>
  15. <groupId>org.apache.velocity</groupId>
  16. <artifactId>velocity-engine-core</artifactId>
  17. <version>2.2</version>
  18. </dependency>
  19. <!-- mybatisPlus Freemarker 模版引擎 -->
  20. <dependency>
  21. <groupId>org.freemarker</groupId>
  22. <artifactId>freemarker</artifactId>
  23. <version>2.3.29</version>
  24. </dependency>
  25. <!--连接mysql-->
  26. <dependency>
  27. <groupId>mysql</groupId>
  28. <artifactId>mysql-connector-java</artifactId>
  29. <version>8.0.24</version>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.projectlombok</groupId>
  33. <artifactId>lombok</artifactId>
  34. <version>1.18.6</version>
  35. </dependency>
  36. <!--swagger-->
  37. <dependency>
  38. <groupId>io.springfox</groupId>
  39. <artifactId>springfox-swagger2</artifactId>
  40. <version>2.9.2</version>
  41. </dependency>
  42. <dependency>
  43. <groupId>io.springfox</groupId>
  44. <artifactId>springfox-swagger-ui</artifactId>
  45. <version>2.9.2</version>
  46. </dependency>

1.2.2MyBatisPlusConfig

  1. @Configuration
  2. public class MyBatisPlusConfig {
  3. @Bean
  4. public MybatisPlusInterceptor mybatisPlusInterceptor() {
  5. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  6. //注册乐观锁插件
  7. interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
  8. //分页插件
  9. interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
  10. return interceptor;
  11. }
  12. }

1.2.3application.yml

  1. #数据库
  2. spring:
  3. datasource:
  4. username: root
  5. password: qing
  6. driver-class-name: com.mysql.cj.jdbc.Driver
  7. url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&useUnicode=true&characterEncodeing=utf-8
  8. mybatis-plus:
  9. configuration:
  10. #日志
  11. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  12. global-config:
  13. db-config:
  14. # 全局逻辑删除的实体字段名(,配置后可以不用在实体类字段上使用@TableLogic注解)
  15. logic-delete-field: isDel
  16. logic-delete-value: 1 # 逻辑已删除值(默认为 1)
  17. logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

1.2.4 MyMetaObjectHandler

字段填充

  1. @Slf4j
  2. //必须使用@Component注解将handler注入到ioc容器中
  3. @Component
  4. public class MyMetaObjectHandler implements MetaObjectHandler {
  5. //插入
  6. @Override
  7. public void insertFill(MetaObject metaObject) {
  8. log.info("start insert fill ....");
  9. //要填充的字段 填充值 metaObject
  10. //注意 这里的第二个属性使用new Date() 则实体类对属性值必须是Date属性 不然会报错 如:private Date createTime;
  11. this.setFieldValByName("createTime",new Date(),metaObject);
  12. this.setFieldValByName("updateTime",new Date(),metaObject);
  13. }
  14. //更新
  15. @Override
  16. public void updateFill(MetaObject metaObject) {
  17. log.info("start update fill ....");
  18. this.setFieldValByName("updateTime",new Date(),metaObject);
  19. }
  20. }

1.2.5 代码生成器

  1. public static void main(String[] args) {
  2. // 需要构建一个 代码自动生成器 对象
  3. AutoGenerator mpg = new AutoGenerator();
  4. // 配置策略
  5. // 1、全局配置
  6. GlobalConfig gcf = new GlobalConfig();
  7. String projectPath = System.getProperty("user.dir");
  8. gcf.setOutputDir(projectPath + "/src/main/java");
  9. gcf.setAuthor("卿帆");
  10. gcf.setOpen(false);
  11. // 是否覆盖
  12. gcf.setFileOverride(false);
  13. // 去Service的I前缀
  14. gcf.setServiceName("%sService");
  15. //设置主键策略 自增
  16. gcf.setIdType(IdType.AUTO);
  17. //日期类型
  18. gcf.setDateType(DateType.ONLY_DATE);
  19. //配置swagger文档
  20. gcf.setSwagger2(true);
  21. mpg.setGlobalConfig(gcf);
  22. //2、设置数据源
  23. DataSourceConfig dsc = new DataSourceConfig();
  24. dsc.setUrl("jdbc:mysql://localhost:3306/mybatis_plus? useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
  25. dsc.setDriverName("com.mysql.cj.jdbc.Driver");
  26. dsc.setUsername("root");
  27. dsc.setPassword("qing");
  28. dsc.setDbType(DbType.MYSQL);
  29. mpg.setDataSource(dsc);
  30. //3、包的配置
  31. PackageConfig pc = new PackageConfig();
  32. //只需要改实体类名字 和包名 还有 数据库配置即可
  33. //pc.setModuleName("");
  34. //父级包名
  35. pc.setParent("com.qing");
  36. pc.setEntity("entity");
  37. pc.setMapper("mapper");
  38. pc.setService("service");
  39. pc.setController("controller");
  40. mpg.setPackageInfo(pc);
  41. //4、策略配置
  42. StrategyConfig strategy = new StrategyConfig();
  43. //要转换的数据表 可同时配置多个
  44. strategy.setInclude("user");
  45. // 设置要映射的表名
  46. strategy.setNaming(NamingStrategy.underline_to_camel);
  47. strategy.setColumnNaming(NamingStrategy.underline_to_camel);
  48. // 自动lombok;
  49. strategy.setEntityLombokModel(true);
  50. //配置逻辑删除字段 与yml配置文件对应
  51. strategy.setLogicDeleteFieldName("isDel");
  52. // 自动填充配置
  53. //创建时间
  54. TableFill gmtCreate = new TableFill("create_time", FieldFill.INSERT);
  55. //修改时间
  56. TableFill gmtModified = new TableFill("update_time", FieldFill.INSERT_UPDATE);
  57. ArrayList<TableFill> tableFills = new ArrayList<>();
  58. tableFills.add(gmtCreate);
  59. tableFills.add(gmtModified);
  60. strategy.setTableFillList(tableFills);
  61. // 乐观锁
  62. strategy.setVersionFieldName("version");
  63. //驼峰命名
  64. strategy.setRestControllerStyle(true);
  65. // localhost:8080/hello_id_2
  66. strategy.setControllerMappingHyphenStyle(true);
  67. mpg.setStrategy(strategy);
  68. mpg.execute(); //执行
  69. }

二、快速入门

2.1 建立User表 导入数据

  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. );
  10. DELETE FROM user;
  11. INSERT INTO user (id, name, age, email) VALUES
  12. (1, 'Jone', 18, 'test1@baomidou.com'),
  13. (2, 'Jack', 20, 'test2@baomidou.com'),
  14. (3, 'Tom', 28, 'test3@baomidou.com'),
  15. (4, 'Sandy', 21, 'test4@baomidou.com'),
  16. (5, 'Billie', 24, 'test5@baomidou.com');

2.2 初始化一个SpringBoot项目

1、导入依赖

导入mybatis-plus依赖后就不用导入mybatis依赖了

  1. <dependency>
  2. <groupId>com.baomidou</groupId>
  3. <artifactId>mybatis-plus-boot-starter</artifactId>
  4. <version>3.4.3.4</version>
  5. </dependency>
  6. <!--连接mysql-->
  7. <dependency>
  8. <groupId>mysql</groupId>
  9. <artifactId>mysql-connector-java</artifactId>
  10. <version>8.0.24</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.projectlombok</groupId>
  14. <artifactId>lombok</artifactId>
  15. <version>1.18.6</version>
  16. </dependency>

2、配置文件

  1. spring:
  2. datasource:
  3. username: root
  4. password: qing
  5. driver-class-name: com.mysql.cj.jdbc.Driver
  6. url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&useUnicode=true&characterEncodeing=utf-8
  7. #mybatis内置日志
  8. mybatis-plus:
  9. configuration:
  10. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

3、传统配置(不推荐使用)

controller+service+mapper+mapper.xml

4、plus配置

User实体类

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

UserMapper接口:

  1. @Mapper
  2. //使用mybatis-plus 只需要在mapper接口这里继承BaseMapper 所有基础的CRUD就不需要在编写xml文件了
  3. public interface UserMapper extends BaseMapper<User> {
  4. }

可以看到BaseMapper接口中给我们封装了所有的CRUD代码,方法接口如下图:

使用MapperScan注解扫描包下的所有接口:

  1. @SpringBootApplication
  2. @MapperScan("com.qing.mapper")
  3. public class MybatisPlusApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(MybatisPlusApplication.class, args);
  6. }
  7. }

5、测试

  1. @SpringBootTest
  2. class MybatisPlusApplicationTests {
  3. @Resource
  4. UserMapper userMapper;
  5. @Test
  6. void contextLoads() {
  7. User user = userMapper.selectById(1);
  8. System.out.println(user);
  9. // selectList() 方法的参数为 MP 内置的条件封装器 Wrapper,不填写就是无任何条件
  10. List<User> userList = userMapper.selectList(null);
  11. userList.forEach(System.out::println);
  12. }
  13. }

三、CRUD扩展

3.1 插入

调用封装的inset方法插入一个实体,当不插入id时,会自动生成一个long型的id,这个id还可能为负。这就是分布式系统的主键策略:雪花算法

  1. @Test
  2. void testInsert() {
  3. User user = new User();
  4. user.setAge(20);
  5. user.setName("卿帆");
  6. user.setEmail("2259");
  7. userMapper.insert(user);
  8. }

3.2 主键生成策略

在User实体类中的id字段上添加注解@TableId

  1. public class User {
  2. @TableId(type = IdType.*)
  3. private Integer id;
  4. }

1、IdType.ASSIGN_ID

雪花算法:保证id全球唯一

  • SnowFlake算法生成id的结果是一个64bit大小的整数,它的结构如下图:

    1. ![](https://img-blog.csdnimg.cn/20190402101612645.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MTM1Mjg3,size_16,color_FFFFFF,t_70#alt=img)

● 1位,不用。二进制中最高位为1的都是负数,但是我们生成的id一般都使用整数,所以这个最高位固定是0

● 41位,用来记录时间戳(毫秒)。
○ 41位可以表示MyBatis-Plus - 图1个数字,
○ 如果只用来表示正整数(计算机中正数包含0),可以表示的数值范围是:0 至 MyBatis-Plus - 图2,减1是因为可表示的数值范围是从0开始算的,而不是1。
○ 也就是说41位可以表示MyBatis-Plus - 图3个毫秒的值,转化成单位年则是MyBatis-Plus - 图4%20%2F%20(1000%20%2060%20%2060%20%2024%20%20365)%20%3D%2069#card=math&code=%282%5E%7B41%7D-1%29%20%2F%20%281000%20%2A%2060%20%2A%2060%20%2A%2024%20%2A%20365%29%20%3D%2069)年

10位,用来记录工作机器id。
○ 可以部署在MyBatis-Plus - 图5个节点,包括 5位datacenterId 和 5位workerId
○ 5位(bit)可以表示的最大正整数是MyBatis-Plus - 图6,即可以用0、1、2、3、….31这32个数字,来表示不同的datecenterId或workerId

12位,序列号,用来记录同毫秒内产生的不同id。
○ 12位(bit)可以表示的最大正整数是MyBatis-Plus - 图7,即可以用0、1、2、3、….4094这4095个数字,来表示同一机器同一时间截(毫秒)内产生的4095个ID序号

SnowFlake可以保证:
● 所有生成的id按时间趋势递增
● 整个分布式系统内不会产生重复id(因为有datacenterId和workerId来做区分)

2、 IdType.AUTO

主键自增策略,数据库中的id字段也必须设置为自动递增

3、其余策略

  1. public enum IdType {
  2. AUTO(0), //自增
  3. NONE(1), //未设置主键
  4. INPUT(2), //手动输入id 必须自己set注入
  5. ASSIGN_ID(3), //默认全局唯一(全球唯一) 雪花算法
  6. ASSIGN_UUID(4); //全局唯一uuid
  7. }

3.3 更新

  1. @Test
  2. void update(){
  3. User user=new User();
  4. user.setId(10);
  5. user.setEmail("22594797");
  6. userMapper.updateById(user);
  7. }
  1. @Test
  2. void update2(){
  3. User user=new User();
  4. user.setId(10);
  5. user.setAge(3);
  6. user.setEmail("22594797");
  7. userMapper.updateById(user);
  8. }

自动拼接动态sql语句!!

3.4 自动填充

每个表中都应该带有更新时间创建时间!这个操作可以自动化实现,方式有直接配置数据库和在代码中自动填充

3.4.1 数据库操作(不建议)

首先在数据库表中增加create_time和update_time字段,并需要勾选根据当前时间戳更新

User实体类中也添加对应的字段

  1. private String createTime;
  2. private String updateTime;

再次更新表中数据时就会自动填充!

3.4.2 代码操作

(1)在User实体类中的字段上添加 @TableField注解

  1. public class User {
  2. @TableId(type = IdType.AUTO)
  3. private Integer id;
  4. private String name;
  5. private Integer age;
  6. private String email;
  7. //插入时填充
  8. @TableField(fill = FieldFill.INSERT)
  9. private Date createTime;
  10. //插入-更新时填充
  11. @TableField(fill = FieldFill.INSERT_UPDATE)
  12. private Date updateTime;
  13. }

@TableField注解属性:

  1. public enum FieldFill {
  2. /**
  3. * 默认不处理
  4. */
  5. DEFAULT,
  6. /**
  7. * 插入时填充字段
  8. */
  9. INSERT,
  10. /**
  11. * 更新时填充字段
  12. */
  13. UPDATE,
  14. /**
  15. * 插入和更新时填充字段
  16. */
  17. INSERT_UPDATE
  18. }

(2)创建一个MyMetaObjectHandler处理器,设置自动填充属性

  1. @Slf4j
  2. //必须使用@Component注解将handler注入到ioc容器中
  3. @Component
  4. public class MyMetaObjectHandler implements MetaObjectHandler {
  5. //插入
  6. @Override
  7. public void insertFill(MetaObject metaObject) {
  8. log.info("start insert fill ....");
  9. //要填充的字段 填充值 metaObject
  10. //注意 这里的第二个属性使用new Date() 则实体类对属性值必须是Date属性 不然会报错 如:private Date createTime;
  11. this.setFieldValByName("createTime",new Date(),metaObject);
  12. this.setFieldValByName("updateTime",new Date(),metaObject);
  13. }
  14. //更新
  15. @Override
  16. public void updateFill(MetaObject metaObject) {
  17. log.info("start update fill ....");
  18. this.setFieldValByName("updateTime",new Date(),metaObject);
  19. }
  20. }

3.5 乐观锁

实现方式

乐观锁实现方式:很乐观,认为任何操作都不会出现问题,出现问题时才会报错

  • 取出记录时,获取当前 version
  • 更新时,带上这个 version
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果 version 不对,就更新失败

会出现问题:在单线程下不会出现问题,但在多线程中,如果有一个线程A正在执行修改操作,他校验的version是1,但此时来了一个线程B。且抢先执行,修改数据后version变成了2,那么此时线程A的修改就会停止!!,最终数据只是线程B修改后的数据!!

(1)在数据库表中增加字段version,初始化为1,并在实体类中同步添加属性version

  1. public class User {
  2. //乐观锁注解
  3. @Version
  4. private Integer version;
  5. }

(2)配置MyBatisPlusConfig组件

  1. @Configuration
  2. public class MyBatisPlusConfig {
  3. //注册乐观锁插件
  4. @Bean
  5. public MybatisPlusInterceptor mybatisPlusInterceptor() {
  6. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  7. interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
  8. return interceptor;
  9. }
  10. }

(3)单线程测试

修改用户信息

  1. @Test
  2. void testLock() {
  3. User user = userMapper.selectById(1);
  4. user.setName("qf");
  5. userMapper.updateById(user);
  6. }

修改时是带上了version字段的

数据库中的version版本号也会加一

(4)模拟多线程

  1. @Test
  2. void testLock() {
  3. //模拟线程A修改数据
  4. User user = userMapper.selectById(1);
  5. user.setName("qf");
  6. //模拟模拟线程B修改数据,且抢先执行
  7. User user2=userMapper.selectById(1);
  8. user.setName("qf2");
  9. userMapper.updateById(user2);
  10. //线程A在线程B之后执行
  11. userMapper.updateById(user);
  12. }

可以看到,数据库中的数据为线程B提交的数据,A线程执行修改失败!

说明:

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

3.6 查询

3.6.1 普通查询

  1. @Test
  2. void testSelect(){
  3. //批量查询
  4. List<User> userList = userMapper.selectBatchIds(Arrays.asList(1, 2,10,15));
  5. userList.forEach(System.out::println);
  6. //条件查询 map拼接
  7. Map<String,Object> map=new HashMap<>();
  8. map.put("name","qf2");
  9. map.put("age",18);
  10. List<User> userList1 = userMapper.selectByMap(map);
  11. userList1.forEach(System.out::println);
  12. }

3.6.2分页查询

使用MP内置的分页插件

配置拦截器:

  1. @Bean
  2. public MybatisPlusInterceptor mybatisPlusInterceptor() {
  3. MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  4. //分页插件
  5. interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));
  6. return interceptor;
  7. }

测试:

  1. @Test
  2. void testPage() {
  3. //当前页 页面大小
  4. Page<User> page = new Page<>(2, 5);
  5. //查询
  6. Page<User> userPage = userMapper.selectPage(page, null);
  7. //将page中的所有数据转存到实体集合中,方便返回给前端
  8. List<User> userList = userPage.getRecords();
  9. userList.forEach(System.out::println);
  10. }

3.7 删除

3.7.1 直接删除(不推荐)

直接删除数据库中的数据

  1. @Test
  2. void testDel() {
  3. //删除
  4. Map<String, Object> map = new HashMap<>();
  5. map.put("age",18);
  6. //根据id删除
  7. userMapper.deleteById(100);
  8. //批量删除
  9. userMapper.deleteBatchIds(Arrays.asList(10, 20, 30));
  10. //通过map条件删除
  11. userMapper.deleteByMap(map);
  12. }

3.7.2 逻辑删除

在数据库中添加is_del逻辑删除字段,并在实体类中添加对应的isDel属性,添加 @TableLogic注解;默认使用驼峰映射

  1. public class User {
  2. //逻辑删除
  3. @TableLogic
  4. private Integer isDel;
  5. }

配置yml

  1. mybatis-plus:
  2. global-config:
  3. db-config:
  4. # 全局逻辑删除的实体字段名(,配置后可以不用在实体类字段上使用@TableLogic注解)
  5. logic-delete-field: isDel #这里的isDel需和实体类中的isDel对应
  6. logic-delete-value: 1 # 逻辑已删除值(默认为 1)
  7. logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

测试

  1. @Test
  2. void testDel2() {
  3. /*配置了逻辑删除字段后,就无法在通过实体类来修改删除字段的值
  4. User user = new User();
  5. user.setId(1);
  6. user.setIsDel(1);
  7. userMapper.updateById(user);
  8. */
  9. //直接调用deleteById方法就行
  10. userMapper.deleteById(1);
  11. System.out.println(userMapper.selectById(1));
  12. }

四、条件构造器

  1. @Test
  2. void testWrapper1(){
  3. QueryWrapper<User> wrapper = new QueryWrapper<>();
  4. //查询姓名不为空,年龄大于18的所有用户
  5. wrapper
  6. .isNotNull("name")
  7. .ge("age",18);
  8. List<User> userList = userMapper.selectList(wrapper);
  9. //查询name等于qf的指定用户
  10. wrapper.eq("name","qf");
  11. userMapper.selectOne(wrapper);
  12. //查询age等于20的所有用户
  13. wrapper.eq("age",20);
  14. List<User> userList2 = userMapper.selectList(wrapper);
  15. //查询age在20-30之间的用户
  16. wrapper.between("age",20,30);
  17. //模糊查询 查询name中不包含e 且邮箱是以t开头的所有用户
  18. wrapper
  19. .notLike("name","a")
  20. //likeRight是以**开头,对右边迷糊查询,likeLeft则以**结尾对左边模糊查询
  21. .likeRight("email","t");
  22. List<User> userList = userMapper.selectList(wrapper);
  23. //查询id为1 2 3中任意一个的用户列表
  24. wrapper.in("id",Arrays.asList(1,2,3));
  25. List<User> userList = userMapper.selectList(wrapper);
  26. //groupBy orderByAsc orderByDesc having or and
  27. }

五、自动生成器(重要)

  • dao、pojo、service、controller都自动编写完成!
  • AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、
  • Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。
  • 只需要改实体类名字 和包名 还有 数据库配置即可

pom依赖:

注:这是旧版生成器,mybatis-plus-generator包的版本必须是3.5.0以下的,如果使用3.5.0以上的则需要使用新版生成器

  1. <!-- mybatisPlus 代码生成器 -->
  2. <dependency>
  3. <groupId>com.baomidou</groupId>
  4. <artifactId>mybatis-plus-generator</artifactId>
  5. <version>3.3.1.tmp</version>
  6. </dependency>
  7. <!-- mybatisPlus Velocity 模版引擎 -->
  8. <dependency>
  9. <groupId>org.apache.velocity</groupId>
  10. <artifactId>velocity-engine-core</artifactId>
  11. <version>2.2</version>
  12. </dependency>
  13. <!-- mybatisPlus Freemarker 模版引擎 -->
  14. <dependency>
  15. <groupId>org.freemarker</groupId>
  16. <artifactId>freemarker</artifactId>
  17. <version>2.3.29</version>
  18. </dependency>

方法:

  1. public static void main(String[] args) {
  2. // 需要构建一个 代码自动生成器 对象
  3. AutoGenerator mpg = new AutoGenerator();
  4. // 配置策略
  5. // 1、全局配置
  6. GlobalConfig gcf = new GlobalConfig();
  7. String projectPath = System.getProperty("user.dir");
  8. gcf.setOutputDir(projectPath + "/src/main/java");
  9. gcf.setAuthor("卿帆");
  10. gcf.setOpen(false);
  11. // 是否覆盖
  12. gcf.setFileOverride(false);
  13. // 去Service的I前缀
  14. gcf.setServiceName("%sService");
  15. //设置主键策略 自增
  16. gcf.setIdType(IdType.AUTO);
  17. //日期类型
  18. gcf.setDateType(DateType.ONLY_DATE);
  19. //配置swagger文档
  20. gcf.setSwagger2(true);
  21. mpg.setGlobalConfig(gcf);
  22. //2、设置数据源
  23. DataSourceConfig dsc = new DataSourceConfig();
  24. dsc.setUrl("jdbc:mysql://localhost:3306/mybatis_plus? useSSL=false&useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8");
  25. dsc.setDriverName("com.mysql.cj.jdbc.Driver");
  26. dsc.setUsername("root");
  27. dsc.setPassword("qing");
  28. dsc.setDbType(DbType.MYSQL);
  29. mpg.setDataSource(dsc);
  30. //3、包的配置
  31. PackageConfig pc = new PackageConfig();
  32. //只需要改实体类名字 和包名 还有 数据库配置即可
  33. //pc.setModuleName("");
  34. //父级包名
  35. pc.setParent("com.qing");
  36. pc.setEntity("entity");
  37. pc.setMapper("mapper");
  38. pc.setService("service");
  39. pc.setController("controller");
  40. mpg.setPackageInfo(pc);
  41. //4、策略配置
  42. StrategyConfig strategy = new StrategyConfig();
  43. //要转换的数据表 可同时配置多个
  44. strategy.setInclude("user");
  45. // 设置要映射的表名
  46. strategy.setNaming(NamingStrategy.underline_to_camel);
  47. strategy.setColumnNaming(NamingStrategy.underline_to_camel);
  48. // 自动lombok;
  49. strategy.setEntityLombokModel(true);
  50. //配置逻辑删除字段
  51. strategy.setLogicDeleteFieldName("isDel");
  52. // 自动填充配置
  53. //创建时间
  54. TableFill gmtCreate = new TableFill("create_time", FieldFill.INSERT);
  55. //修改时间
  56. TableFill gmtModified = new TableFill("update_time", FieldFill.INSERT_UPDATE);
  57. ArrayList<TableFill> tableFills = new ArrayList<>();
  58. tableFills.add(gmtCreate);
  59. tableFills.add(gmtModified);
  60. strategy.setTableFillList(tableFills);
  61. // 乐观锁
  62. strategy.setVersionFieldName("version");
  63. //驼峰命名
  64. strategy.setRestControllerStyle(true);
  65. // localhost:8080/hello_id_2
  66. strategy.setControllerMappingHyphenStyle(true);
  67. mpg.setStrategy(strategy);
  68. mpg.execute(); //执行
  69. }