MybatisPlus

2023/3/16 语法

# MybatisPlus简介

MyBatis-Plus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生,支持多种数据库MySQL,Oracle,DB2,H2,HSQL,SQLite,PostgreSQL,SQLServer,Phoenix,Gauss ,ClickHouse,Sybase,OceanBase,Firebird,Cubrid,Goldilocks,csiidb

# SpringBoot整合MybatisPlus

SpringBoot项目引入依赖

<!--mybatis-plus-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3.1</version>
</dependency>
1
2
3
4
5
6

然后在application.yml配置文件中配置数据库地址等。

mybatis-plus:
  # 指定全局配置文件
  config-location: classpath:mybatis-config.xml
  # 配置接口所对应的xml文件
  mapper-locations: classpath*:mybatis/*.xml
  # 指定别名路径 编写xml时resultMap每次都需要写全路径,配置此项后,仅编写对应实体类即可
  type-aliases-package: com.test.pojo
  configuration:
    # 关闭自动驼峰映射,该参数不能和mybatis-plus.config-location同时存在
    map-underscore-to-camel-case: false
    # 全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存,默认为 true。
    cache-enabled: false
  global-config:
    db-config:
      # 全局默认主键类型,设置后,即可省略实体对象中的@TableId(type = IdType.AUTO)配置。
      id-type: auto
      # 表名前缀,全局配置后可省略@TableName()配置。
      table-prefix: tb_
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

# 1.建立pojo类

@Data
@TableName("tb_user") // 设置表名
public class User {

    //主键自增,我这里使用的是mysql,支持自增
    @TableId(type = IdType.AUTO)
    private Long id;
    
    @TableField("user_name") // 字段名称,默认开启驼峰转换,即数据库"user_name"会自动映射为"userName"
    private String userName;
    private String password;
    private String name;
    private Integer age;
    private String email;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

# 2.编写Mapper

注意@Mapper注解不能少,也可以在启动类使用@MapperScan("com.test.mapper")扫描包,这样就不用每个mapper都写注解了

@Mapper
public interface UserMapper extends BaseMapper<User> {
}
1
2
3

# 3.service

public interface UserService {
    //查询所有用户
    List<User> findAll();
}
1
2
3
4

# 4.serviceImpl

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> findAll() {
        return userMapper.selectList(null);
    }
}
1
2
3
4
5
6
7
8
9
10
11

# 5.Controller

@RestController
@RequestMapping("api/vi/pub/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("all")
    public List<User> findAll(){
        return userService.findAll();
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

# MybatisPlus核心注解

# 1、表名注解:@TableName

属性 类型 必须指定 默认值 描述
value String "" 表名
excludeProperty String[] {} 需要排除的属性名(@since 3.3.1)

# 2、主键注解:@TableId

属性 类型 必须指定 默认值 描述
value String "" 主键字段名
type Enum IdType.NONE 主键类型

# 主键生成方式:IdType

描述
AUTO 数据库ID自增
NONE 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
INPUT insert前自行set主键值
ASSIGN_ID 分配ID(主键类型为Number(Long和Integer)或String) (since 3.3.0),使用接口IdentifierGenerator的方法nextId (默认实现类为DefaultIdentifierGenerator雪花算法)
ASSIGN_UUID 分配UUID,主键类型为String(since 3.3.0), 使用接口IdentifierGenerator的方法nextUUID(默认default方法)
ID_WORKER 分布式全局唯一ID 长整型类型(please use ASSIGN_ID)
UUID 32位UUID字符串(please use ASSIGN_UUID)
ID_WORKER_STR 分布式全局唯一ID 字符串类型(please use ASSIGN_ID)

# 3、字段注解(非主键):@TableField

属性 类型 必须指定 默认值 描述
value String "" 数据库字段名
exist boolean true 是否为数据库表字段
fill Enum FieldFill.DEFAULT 字段自动填充策略
select boolean true 是否进行 select 查询
numericScale String "" 指定小数点后保留的位数

# 字段填充策略:FieldFill

描述
DEFAULT 默认不处理
INSERT 插入时填充字段
UPDATE 更新时填充字段
INSERT_UPDATE 插入和更新时填充字段

# @Version

描述:乐观锁注解、标记 @Verison 在字段上

# @EnumValue

描述:通枚举类注解(注解在枚举字段上)

# 基础入门之增删改查

# 1、Service

public interface UserService {

    //查询所有用户
    List<User> findAll();

    //保存用户
    User saveUser(User user);

    //更新用户 - 根据id
    void updateUserById(User user);

    //根据条件更新用户
    void update(User user);

    //根据条件更新用户
    void update2(User user);

    //根据id删除
    void deleteById(Integer id);

    //根据用户信息删除
    void delete(User user);

    //根据id集合批量删除
    void deleteByIds(ArrayList<Integer> ids);

    //根据id查询用户
    User selectById(Integer id);

    //根据id集合查询用户
    List<User> selectByIds(ArrayList<Integer> ids);

    //根据条件查询用户
    User selectOne(User user);

    //根据条件查询总记录数 如果查询所有传入空
    Integer selectCount(User user);

    //查询所有记录
    Integer selectCountAll();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

# 2、ServiceImpl

下面有使用到QueryWrapper和UpdateWrapper条件构造器的地方,详细AP看MP核心操作之条件构造器查询

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> findAll() {
        return userMapper.selectList(null);
    }

    @Override
    public User saveUser(User user) {
        userMapper.insert(user);
        //此时返回user会返回User自动生成的is,MyBatisPlus已经帮我们做好了相关工作
        return user;
    }

    @Override
    public void updateUserById(User user) {
        userMapper.updateById(user);
    }

    @Override
    public void update(User user) {
        //构建条件
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        //根据用户名更新,参数1对应数据库中的字段
        wrapper.eq("user_name","zhangsan");
        //参数1:实体对象
        userMapper.update(user, wrapper);
    }

    //UpdateWrapper和QueryWrapper的区别在于UpdateWrapper可以设置更新的字段,update中一个是对象一个是null
    @Override
    public void update2(User user) {
        //构建条件
        UpdateWrapper<User> wrapper = new UpdateWrapper<>();
        //更改"user_name"为"zhangsan"的age和password字段
        wrapper.set("age",21).set("password","88888").eq("user_name","zhangsan");
        //参数1:实体对象
        userMapper.update(null, wrapper);
    }


    @Override
    public void deleteById(Integer id) {
        userMapper.deleteById(id);
    }

    @Override
    public void delete(User user) {
        QueryWrapper<User> wrapper = new QueryWrapper<>(user);
        userMapper.delete(wrapper);
    }

    @Override
    public void deleteByIds(ArrayList<Integer> ids) {
        userMapper.deleteBatchIds(ids);
    }

    @Override
    public User selectById(Integer id) {
        return userMapper.selectById(id);
    }

    @Override
    public List<User> selectByIds(ArrayList<Integer> ids) {
        return userMapper.selectBatchIds(ids);
    }

    @Override
    public User selectOne(User user) {
        return userMapper.selectOne(new QueryWrapper<>(user));
    }

    @Override
    public Integer selectCount(User user) {
        return userMapper.selectCount(new QueryWrapper<>(user));
    }

    @Override
    public Integer selectCountAll() {
        return userMapper.selectCount(new QueryWrapper<>(null));
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86

# MybatisPlus之分页操作

MybatisPlus的分页API不能直接使用,创建配置类配置好分页插件,MybatisPlus的分页功能才能正常使用。

# 1、创建配置类

@Configuration
public class MyBatisConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}
1
2
3
4
5
6
7
8
9
10

# 2、Service

public interface UserService {

    /**
     * 分页查询所有用户
     * @param current 第几页
     * @param size 多少条信息
     * @return 分页User对象
     */
    Page<User> selectPage(Integer current,Integer size);
}
1
2
3
4
5
6
7
8
9
10

# 3、ServiceImp

@Service
public class UserServiceImpl implements UserService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public Page<User> selectPage(Integer current,Integer size) {
        Page<User> page = new Page<>(current,size);
        return userMapper.selectPage(page, null);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12

# 4、Controller

访问:http://localhost:端口号/api/vi/pub/user/page/2/2

@RestController
@RequestMapping("api/vi/pub/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("page/{current}/{size}")
    public Page<User> selectPage(@PathVariable Integer current,@PathVariable Integer size){
        return userService.selectPage(current,size);
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13

# MP核心操作之条件构造器

这是MybatisPlus最为核心的功能了,之前在基础入门之增删改查提到过一些简单的逻辑不需要去写sql就可以完成,这个SQL就是使用条件构造器去构造的。

属性 解释
eq 等于 =
ne 不等于 <>
gt 大于 >
ge 大于等于 >=
lt 小于 <
le 小于等于 <=
between BETWEEN 值1 AND 值2
notBetween NOT BETWEEN 值1 AND 值2
in in("age", 1, 2, 3)
notIn notIn("age",{1,2,3})
groupBy groupBy("id", "name")
orderByAsc orderByAsc("id", "name")
orderByDesc orderByDesc("id", "name")
orderBy orderBy(true, true, "id", "name")
having having("sum(age) > {0}", 11)
and and(i -> i.eq("name", "李白").ne("status", "活着"))

# 1、使用案例

我把基础入门之增删改查中使用到条件构造器的地方复制了一部分,其中QueryWrapper是构建查询语句,UpdateWrapper是构建修改语句,二者的区别是UpdateWrapper多了set属性。

@Autowired
private UserMapper userMapper;

public void update(User user) {
    //构建条件
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    //根据用户名更新,参数1对应数据库中的字段
    wrapper.eq("user_name","zhangsan");
    //参数1:实体对象
    userMapper.update(user, wrapper);
}

public void update2(User user) {
    //构建条件
    UpdateWrapper<User> wrapper = new UpdateWrapper<>();
    //更改"user_name"为"zhangsan"的age和password字段
    wrapper.set("age",21).set("password","88888").eq("user_name","zhangsan");
    //参数1:实体对象
    userMapper.update(null, wrapper);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# MP里面的ActiveRecord

ActiveRecord(简称AR)一直广受动态语言(PHP、Ruby等)的喜爱,而Java作为准静态语言,对于ActiveRecord往往只能感叹其优雅,所以我们也在AR道路上进行了一定的探索,喜欢大家能够喜欢。

ActiveRecord也属于ORM(对象关系映射)层,由Rails最早提出,遵循标准的ORM模型:表映射到记录,记录映射到对象,字段映射到对象属性。配合遵循的命名和配置惯例,能够很大程度的快速实现模型的操作,而且简洁易懂。

ActiveRecord的主要思想是:

  • 每一个数据库表对应创建一个类,类的每一个对象实例对应于数据库中表的一行记录;通常表的每个字段在类中都有相应的Field;
  • ActiveRecord同时负责把自己持久化,在ActiveRecord中封装了对数据库的访问,即CURD;
  • ActiveRecord是一种领域模型(Domain Model),封装了部分业务逻辑;

# 1、开始使用

在MP中,开启AR非常简单,只需要将实体对象继承Model即可。

@Data
@TableName("tb_user")
public class User extends Model<User> {

    @TableId(type = IdType.AUTO)
    private Long id;
    @TableField("user_name")
    private String userName;
    private String password;
    private String name;
    private Integer age;
    private String email;
}
1
2
3
4
5
6
7
8
9
10
11
12
13

# 2、根据主键查询

public User selectOne(User user) {
    return user.selectById();
}
1
2
3

# 3、新增数据

public User saveUser(User user) {
    user.insert();
    //此时返回user会返回User自动生成的id,MyBatisPlus已经帮我们做好了相关工作
    return user;
}
1
2
3
4
5

# 4、更新操作

public void updateUserById(User user) {
    user.updateById();
}
1
2
3

# 5、删除操作

public void deleteById(Integer id) {
    User user = new User();
    user.setId(id);
    user.deleteById();
}
1
2
3
4
5

# 6、根据条件查询

public List<User> findAll() {
    User user = new User();
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.le("age","20");
    List<User> users = user.selectList(wrapper);
    return users;
}
1
2
3
4
5
6
7

# MybatisPlus使用乐观锁

当要更新一条记录的时候,希望这条记录没有被别人更新,此时我们就可以使用乐观锁来进行判断。

# 乐观锁实现方式

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

# 1、配置

//乐观锁配置
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
    return new OptimisticLockerInterceptor();
}
1
2
3
4
5

# 2、注解实体字段

需要为实体字段添加@Version注解。

  1. 为表添加version字段,并且设置初始值为1;
  2. 为User实体对象添加version字段,并且添加@Version注解;
@Version 
private Integer version;
1
2

# MybatisPlus自动填充功能

我们可以给某些字段赋一个初始值,使用场景例如新用户注册或者添加用户时,默认密码相同。当然你也可以使用数据库的默认值功能,但是如果你没有修改数据库的权限或者你使用的数据库不支持这个功能,那么这个功能就非常有用了。

  • 减低代码的耦合度,多人合作不容易出现BUG。
  • 对插入的数据进行增强操作,例如密码加密。

# 1、添加@TableField注解

//插入数据时进行填充 
@TableField(fill = FieldFill.INSERT) 
private String password;
1
2
3

FieldFill提供了多种模式选择:

public enum FieldFill { 

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

# 2、编写MyMetaObjectHandler

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    
    /** 插入数据时填充 */
    @Override
    public void insertFill(MetaObject metaObject) {
        // 获取password的值,如果为空则填充,不为空不做处理
        Object password = getFieldValByName("password", metaObject);
        if (null == password) {
            //字段为空,可以进行填充 
            setFieldValByName("password", "123456", metaObject);
        }
    }

    /** 更新数据时填充*/
    @Override
    public void updateFill(MetaObject metaObject) {

    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# MybatisPlus之逻辑删除

# 1、修改表结构

为tb_user表增加deleted字段,用于表示数据是否被删除,1代表删除,0代表未删除。

ALTER TABLE `tb_user` ADD COLUMN `deleted` int(1) NULL DEFAULT 0 COMMENT '1代表删除,0代表未删除' AFTER `version`;
1

同时,也修改User实体,增加deleted属性并且添加@TableLogic注解:

@TableLogic 
private Integer deleted;
1
2

# 2、配置

mybatis-plus:
  global-config:
    db-config:
      # 逻辑已删除值(默认为 1)
      logic-delete-value: 1
      # 逻辑未删除值(默认为 0)
      logic-not-delete-value: 0
1
2
3
4
5
6
7

# 3、测试

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

# MybatisPlus新版代码生成器

# 1、添加依赖

<dependencies>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>3.5.3</version>
    </dependency>
    <dependency>
        <groupId>org.apache.velocity</groupId>
        <artifactId>velocity-engine-core</artifactId>
        <version>2.3</version>
    </dependency>
</dependencies>
1
2
3
4
5
6
7
8
9
10
11
12

# 2、核心代码书写

package generator;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.fill.Column;
import org.apache.commons.lang3.StringUtils;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;


public class CodeGenerator {

    /**
     * 生成的代码放到哪个工程中
     */
    public static final String PROJECT_NAME = "xk857-core";

    /**
     * 数据库名称
     */
    public static final String DATABASE_NAME = "qq-card";

    /**
     * 父包名
     */
    public static final String PARENT_MODULE_NAME = "com.xk857";

    /**
     * 子包名
     */
    public static final String MODULE_NAME = "module.admin";

    /**
     * 去掉表前缀
     */
    public static final String[] REMOVE_TABLE_PREFIX = {"tb_","sys"};

    /**
     * ip地址
     */
    public static final String MY_IP = "localhost";

    /**
     * 端口号
     */
    public static final String MY_PORT = "3306";

    /**
     * 账号
     */
    public static final String MY_USERNAME = "root";

    /**
     * 密码
     */
    public static final String MY_PASSWORD = "root";

    /**
     * 作者名称
     */
    private static final String author = "cv大魔王";

    public static void main(String[] args) {
        String url = "jdbc:mysql://"+MY_IP+":"+MY_PORT+"/"+ DATABASE_NAME +"?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8";
        String projectPath = System.getProperty("user.dir") + "/";

        FastAutoGenerator.create(url,MY_USERNAME,MY_PASSWORD)
                // 全局配置
                .globalConfig(( builder) -> builder.author("c").enableSwagger().outputDir(projectPath+ PROJECT_NAME +"/src/main/java"))
                // 包配置
                .packageConfig((builder) -> builder.parent(PARENT_MODULE_NAME).moduleName(MODULE_NAME))
                // 策略配置
                .strategyConfig((scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?所有输入 all")))
                        .addTablePrefix(REMOVE_TABLE_PREFIX)
                        .controllerBuilder().enableRestStyle().enableHyphenStyle()
                        .entityBuilder().enableLombok().addTableFills(new Column("create_time", FieldFill.INSERT))
                        .build())
                /*
                    模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker
                   .templateEngine(new BeetlTemplateEngine())
                   .templateEngine(new FreemarkerTemplateEngine())
                 */
                .execute();


    }

    // 处理 all 情况
    protected static List<String> getTables(String tables) {
        return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97

# MybatisPlus之代码生成器

# 1、依赖导入

在你的项目下新建一个 generator 模块,maven依赖如下,注意不需要耦合父工程。

<dependencies>
    <!-- 代码生成器核心依赖 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-generator</artifactId>
        <version>3.4.1</version>
    </dependency>
    <dependency>
        <groupId>org.freemarker</groupId>
        <artifactId>freemarker</artifactId>
    </dependency>
</dependencies>
1
2
3
4
5
6
7
8
9
10
11
12

# 2、代码生成器代码

配置好你的数据库名称、地址、密码、还有你要生成的模块名称后,控制台输入要生成的表明,点击回车就生成啦。

package generator;


import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.apache.commons.lang3.StringUtils;

import java.util.Scanner;

/**
 * 执行 main 方法控制台输入模块表名回车自动生成对应项目目录中
 */
public class CodeGenerator {

    /**
     * 生成的代码放到哪个工程中
     */
    public static final String PROJECT_NAME = "card-core";

    /**
     * 数据库名称
     */
    public static final String DATABASE_NAME = "qq-card";

    /**
     * 子包名
     */
    public static final String MODULE_NAME = "word";

    /**
     * 去掉表前缀
     */
    public static final String REMOVE_TABLE_PREFIX = "tb_";

    /**
     * ip地址
     */
    public static final String MY_IP = "localhost";

    /**
     * 端口号
     */
    public static final String MY_PORT = "3306";

    /**
     * 账号
     */
    public static final String MY_USERNAME = "root";

    /**
     * 密码
     */
    public static final String MY_PASSWORD = "root";

    public static void main(String[] args) {
        // 代码生成器
        AutoGenerator mpg = new AutoGenerator();

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://"+MY_IP+":"+MY_PORT+"/"+ DATABASE_NAME +"?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername(MY_USERNAME);
        dsc.setPassword(MY_PASSWORD);
        mpg.setDataSource(dsc);

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir") + "/";
        gc.setOutputDir(projectPath + PROJECT_NAME +"/src/main/java");
        // 分布式id
        gc.setIdType(IdType.ASSIGN_ID);
        gc.setAuthor("cv大魔王");
        //覆盖现有的
        gc.setFileOverride(true);
        //是否生成后打开
        gc.setOpen(false);
        gc.setDateType(DateType.ONLY_DATE);
        //实体属性 Swagger2 注解
        gc.setSwagger2(true);
        mpg.setGlobalConfig(gc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        //父包名
        pc.setParent("com.card");
        // com.card.aritcle.controller
        pc.setController(MODULE_NAME+".controller");
        pc.setService(MODULE_NAME+".service");
        pc.setServiceImpl(MODULE_NAME+".service.impl");
        pc.setMapper(MODULE_NAME+".mapper");
        pc.setXml(MODULE_NAME+".mapper.xml");
        //实体类存储包名 com.card.modules.system.entities
        pc.setEntity(MODULE_NAME+".entities");
        mpg.setPackageInfo(pc);


        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        //使用lombok
        strategy.setEntityLombokModel(true);
        // 实体类的实现接口Serializable
        strategy.setEntitySerialVersionUID(true);
        // @RestController
        strategy.setRestControllerStyle(true);
        strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
        strategy.setControllerMappingHyphenStyle(true);
        // 去掉表前缀
        strategy.setTablePrefix(REMOVE_TABLE_PREFIX);
        mpg.setStrategy(strategy);

        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();
    }


    /**
     *
     * 读取控制台内容
     *
     */
    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        StringBuilder help = new StringBuilder();
        help.append("请输入").append(tip).append(":");
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotBlank(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145