3.3、相关注解
在使用MyBatis-Plus 时,我们仅仅在泛型中设置了实体类,并没有指明数据库的表名或字段,这些数据是MyBatis-Plus 自动判断并对应起来的,它默认操作的表名和实体类型的类名一致,所以当表名有下划线时,如 user 变成 t_user,这时候再进行查询,就会出现异常。
所以针对实体类和数据库表或字段的一些列问题, MyBatis-Plus 提供了几个注解:
-
@TableName(“数据表名”):用在实体类上,标识实体类对应的是那张数据表
属性 类型 描述 value String 对应数据库的表明,内部属性只有value时,可以省略直接写 “” resultMap String xml 中 resultMap 的 id(用于满足特定类型的实体类对象绑定) autoResultMap boolean 是否自动构建 resultMap 并使用(如果设置 resultMap 则不会进行 resultMap 的自动构建与注入) excludeProperty String[] 需要排除的属性名 keepGlobalPrefix boolean 是否保持使用全局的 tablePrefix 的值(当全局 tablePrefix 生效时) schema String schema -
@TableId(value = “主键的字段名” , type = IdType.AUTO):用在属性上,表示该属性为主键
- IdType.AUTO: 数据库 ID 自增
- IdType.NONE:没有设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
- IdType.INPUT:insert 前自行 set 主键值
- IdType.ASSIGN_ID:分配 ID(主键类型为 Number(Long 和 Integer)或 String),使用雪花算法
- IdType.ASSIGN_UUID:分配 UUID,主键类型为 String
-
@TableField(“字段名”):用于除主键外的其他属性上,用来和数据库字段名进行对应
属性 类型 描述 value String 数据库字段名 exist boolean 是否为数据库表字段,默认为true condition String where查询比较条件,有值则按设置的值为准,没有则为默认全局的 %s=#{%s} update String update set 部分注入,例如:当在version字段上注解 update=“%s+1” 表示更新时会 set version=version+1(该属性优先级高于 el 属性) fill Enum 字段自动填充策略 select boolean 是否进行 select 查询,默认为true keepGlobalFormat boolean 是否保持使用全局的 format 进行处理,默认为false jdbcType JdbcType JDBC 类型 typeHandler Class<? extends TypeHandler> 类型处理器 numericScale String 指定小数点后保留的位数 -
@FieldStrategy:字段策略枚举类
值 描述 IGNORED 忽略判断 NOT_NULL 非 NULL 判断 NOT_EMPTY 非空判断(只对字符串类型字段,其他类型字段依然为非 NULL 判断) DEFAULT 追随全局配置 NEVER 不加入SQL -
@TableLogic:用于数据库中表示删除的字段,因为在实际使用数据库是,不会真的删除某条数据,而是采用逻辑删除,比如设定一个deleted的字段,如为1则表示没有删除,如果为0则表示删除。
而将 @TableLogic 就是用在这种字段对应的属性上,表示逻辑删除,这样在删除时,实际上执行的是update的修改。
属性 类型 描述 value String 逻辑未删除值 delval String 逻辑删除值 -
@OrderBy:内置 SQL 默认指定排序,优先级低于 wrapper 条件查询
属性 类型 描述 isDesc boolean 是否倒序查询,默认true sort short 数字越小越靠前 -
@Version:乐观锁注解
3.5、代码生成器
在MyBatis-Plus中提供了代码生成器,我们提供了数据库表名后,代码生成器会根据表,自动生成 entity、mapper、service、controller等相关的代码,十分方便。
3.5.1、基础配置
-
数据库配置
属性 说明 示例 url jdbc 路径 jdbc:mysql://127.0.0.1:3306/mybatis-plus username 数据库账号 root password 数据库密码 123456 new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/库名","root","123456").build();
其他可选配置:
方法 说明 dbQuery(IDbQuery) 数据库查询 schema(String) 数据库 schema(部分数据库适用) typeConvert(ITypeConvert) 数据库类型转换器 keyWordsHandler(IKeyWordsHandler) 数据库关键字处理器 new DataSourceConfig.Builder("jdbc:mysql://127.0.0.1:3306/mybatis-plus","root","123456") .dbQuery(new MySqlQuery()) .schema("mybatis-plus") .typeConvert(new MySqlTypeConvert()) .keyWordsHandler(new MySqlKeyWordsHandler()) .build();
-
全局配置
方法 说明 示例 fileOverride 覆盖已生成文件 默认值:false disableOpenDir 禁止打开输出目录 默认值:true outputDir(String) 指定输出目录 /opt/baomidou/ 默认值: windows:D:// linux or mac : /tmp author(String) 作者名 baomidou 默认值:作者 enableKotlin 开启 kotlin 模式 默认值:false enableSwagger 开启 swagger 模式 默认值:false dateType(DateType) 时间策略 DateType.ONLY_DATE 默认值: DateType.TIME_PACK commentDate(String) 注释日期 默认值: yyyy-MM-dd new GlobalConfig.Builder() .fileOverride() .outputDir("/opt/baomidou") .author("baomidou") .enableKotlin() .enableSwagger() .dateType(DateType.TIME_PACK) .commentDate("yyyy-MM-dd") .build();
-
自动生成包的配置
方法 说明 示例 parent(String) 父包名 默认值:com.baomidou moduleName(String) 父包模块名 默认值:无 entity(String) Entity 包名 默认值:entity service(String) Service 包名 默认值:service serviceImpl(String) Service Impl 包名 默认值:service.impl mapper(String) Mapper 包名 默认值:mapper xml(String) Mapper XML 包名 默认值:mapper.xml controller(String) Controller 包名 默认值:controller other(String) 自定义文件包名 输出自定义文件时所用到的包名 pathInfo(Map<OutputFile, String>) 路径配置信息 Collections.singletonMap(OutputFile.mapperXml, “D://”) new PackageConfig.Builder() .parent("com.baomidou.mybatisplus.samples.generator") .moduleName("sys") .entity("po") .service("service") .serviceImpl("service.impl") .mapper("mapper") .xml("mapper.xml") .controller("controller") .other("other") .pathInfo(Collections.singletonMap(OutputFile.mapperXml, "D://")) .build();
-
模板配置
方法 说明 示例 disable 禁用所有模板 disable(TemplateType…) 禁用模板 TemplateType.ENTITY entity(String) 设置实体模板路径(JAVA) /templates/entity.java entityKt(String) 设置实体模板路径(kotlin) /templates/entity.java service(String) 设置 service 模板路径 /templates/service.java serviceImpl(String) 设置 serviceImpl 模板路径 /templates/serviceImpl.java mapper(String) 设置 mapper 模板路径 /templates/mapper.java mapperXml(String) 设置 mapperXml 模板路径 /templates/mapper.xml controller(String) 设置 controller 模板路径 /templates/controller.java new TemplateConfig.Builder() .disable(TemplateType.ENTITY) .entity("/templates/entity.java") .service("/templates/service.java") .serviceImpl("/templates/serviceImpl.java") .mapper("/templates/mapper.java") .mapperXml("/templates/mapper.xml") .controller("/templates/controller.java") .build();
-
注入配置
方法 说明 示例 beforeOutputFile(BiConsumer<TableInfo, Map<String, Object>>) 输出文件之前消费者 customMap(Map<String, Object>) 自定义配置 Map 对象 Collections.singletonMap(“test”, “baomidou”) customFile(Map<String, String>) 自定义配置模板文件 Collections.singletonMap(“test.txt”, “/templates/test.vm”) new InjectionConfig.Builder() .beforeOutputFile((tableInfo, objectMap) -> { System.out.println("tableInfo: " + tableInfo.getEntityName() + " objectMap: " + objectMap.size()); }) .customMap(Collections.singletonMap("test", "baomidou")) .customFile(Collections.singletonMap("test.txt", "/templates/test.vm")) .build();
-
策略配置
方法 说明 示例 enableCapitalMode 开启大写命名 默认值:false enableSkipView 开启跳过视图 默认值:false disableSqlFilter 禁用 sql 过滤 默认值:true,语法不能支持使用 sql 过滤表的话,可以考虑关闭此开关 enableSchema 启用 schema 默认值:false,多 schema 场景的时候打开 likeTable(LikeTable) 模糊表匹配(sql 过滤) likeTable 与 notLikeTable 只能配置一项 notLikeTable(LikeTable) 模糊表排除(sql 过滤) likeTable 与 notLikeTable 只能配置一项 addInclude(String…) 增加表匹配(内存过滤) include 与 exclude 只能配置一项 addExclude(String…) 增加表排除匹配(内存过滤) include 与 exclude 只能配置一项 addTablePrefix(String…) 增加过滤表前缀 addTableSuffix(String…) 增加过滤表后缀 addFieldPrefix(String…) 增加过滤字段前缀 addFieldSuffix(String…) 增加过滤字段后缀 entityBuilder 实体策略配置 controllerBuilder controller 策略配置 mapperBuilder mapper 策略配置 serviceBuilder service 策略配置 new StrategyConfig.Builder() .enableCapitalMode() .enableSkipView() .disableSqlFilter() .likeTable(new LikeTable("USER")) .addInclude("t_simple") .addTablePrefix("t_", "c_") .addFieldSuffix("_flag") .build();
-
Entity 策略配置
方法 说明 示例 nameConvert(INameConvert) 名称转换实现 superClass(Class<?>) 设置父类 BaseEntity.class superClass(String) 设置父类 com.baomidou.global.BaseEntity disableSerialVersionUID 禁用生成 serialVersionUID 默认值:true enableColumnConstant 开启生成字段常量 默认值:false enableChainModel 开启链式模型 默认值:false enableLombok 开启 lombok 模型 默认值:false enableRemoveIsPrefix 开启 Boolean 类型字段移除 is 前缀 默认值:false enableTableFieldAnnotation 开启生成实体时生成字段注解 默认值:false enableActiveRecord 开启 ActiveRecord 模型 默认值:false versionColumnName(String) 乐观锁字段名(数据库) versionPropertyName(String) 乐观锁属性名(实体) logicDeleteColumnName(String) 逻辑删除字段名(数据库) logicDeletePropertyName(String) 逻辑删除属性名(实体) naming 数据库表映射到实体的命名策略 默认下划线转驼峰命名:NamingStrategy.underline_to_camel columnNaming 数据库表字段映射到实体的命名策略 默认为 null,未指定按照 naming 执行 addSuperEntityColumns(String…) 添加父类公共字段 addIgnoreColumns(String…) 添加忽略字段 addTableFills(IFill…) 添加表字段填充 addTableFills(List) 添加表字段填充 idType(IdType) 全局主键类型 convertFileName(ConverterFileName) 转换文件名称 formatFileName(String) 格式化文件名称 new StrategyConfig.Builder() .entityBuilder() .superClass(BaseEntity.class) .disableSerialVersionUID() .enableChainModel() .enableLombok() .enableRemoveIsPrefix() .enableTableFieldAnnotation() .enableActiveRecord() .versionColumnName("version") .versionPropertyName("version") .logicDeleteColumnName("deleted") .logicDeletePropertyName("deleteFlag") .naming(NamingStrategy.no_change) .columnNaming(NamingStrategy.underline_to_camel) .addSuperEntityColumns("id", "created_by", "created_time", "updated_by", "updated_time") .addIgnoreColumns("age") .addTableFills(new Column("create_time", FieldFill.INSERT)) .addTableFills(new Property("updateTime", FieldFill.INSERT_UPDATE)) .idType(IdType.AUTO) .formatFileName("%sEntity") .build();
-
Controller 策略配置
方法 说明 示例 superClass(Class<?>) 设置父类 BaseController.class superClass(String) 设置父类 com.baomidou.global.BaseController enableHyphenStyle 开启驼峰转连字符 默认值:false enableRestStyle 开启生成@RestController 控制器 默认值:false convertFileName(ConverterFileName) 转换文件名称 formatFileName(String) 格式化文件名称 new StrategyConfig.Builder() .controllerBuilder() .superClass(BaseController.class) .enableHyphenStyle() .enableRestStyle() .formatFileName("%sAction") .build();
-
Service 策略配置
方法 说明 示例 superServiceClass(Class<?>) 设置 service 接口父类 BaseService.class superServiceClass(String) 设置 service 接口父类 com.baomidou.global.BaseService superServiceImplClass(Class<?>) 设置 service 实现类父类 BaseServiceImpl.class superServiceImplClass(String) 设置 service 实现类父类 com.baomidou.global.BaseServiceImpl convertServiceFileName(ConverterFileName) 转换 service 接口文件名称 convertServiceImplFileName(ConverterFileName) 转换 service 实现类文件名称 formatServiceFileName(String) 格式化 service 接口文件名称 formatServiceImplFileName(String) 格式化 service 实现类文件名称 new StrategyConfig.Builder() .serviceBuilder() .superServiceClass(BaseService.class) .superServiceImplClass(BaseServiceImpl.class) .formatServiceFileName("%sService") .formatServiceImplFileName("%sServiceImp") .build();
-
Mapper 策略配置
方法 说明 示例 superClass(Class<?>) 设置父类 BaseMapper.class superClass(String) 设置父类 com.baomidou.global.BaseMapper enableMapperAnnotation 开启 @Mapper 注解 默认值:false enableBaseResultMap 启用 BaseResultMap 生成 默认值:false enableBaseColumnList 启用 BaseColumnList 默认值:false cache(Class<? extends Cache>) 设置缓存实现类 MyMapperCache.class convertMapperFileName(ConverterFileName) 转换 mapper 类文件名称 convertXmlFileName(ConverterFileName) 转换 xml 文件名称 formatMapperFileName(String) 格式化 mapper 文件名称 formatXmlFileName(String) 格式化 xml 实现类文件名称 new StrategyConfig.Builder() .mapperBuilder() .superClass(BaseMapper.class) .enableMapperAnnotation() .enableBaseResultMap() .enableBaseColumnList() .cache(MyMapperCache.class) .formatMapperFileName("%sDao") .formatXmlFileName("%sXml") .build()
3.5.2、 3.5.1以后版本
<!-- MyBatis-Plus代码生成器依赖-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>最新版本</version>
</dependency>
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.3</version>
</dependency>
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/ssmtest?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
String username = "root";
String password = "521926";
//表名集合
List<String> tables = new ArrayList<>();
tables.add("tbl_user");
FastAutoGenerator.create(url, username, password)
//全局配置
.globalConfig(builder -> {
builder.fileOverride() // 开启覆盖之前生成的文件
.disableOpenDir() //禁止打开输出目录
.outputDir(System.getProperty("user.dir") + "\\src\\main\\java") //指定输出目录
.author("yu") //作者名
// .enableKotlin() //开启 kotlin 模式
// .enableSwagger() //开启 swagger 模式
.dateType(DateType.TIME_PACK) //时间策略
.commentDate("yyyy-MM-dd"); //注释日期
})
//包配置
.packageConfig(builder -> {
builder.parent("com.yu.mybatisplustest") //父包名
.entity("entity") //Entity 包名
.service("service") // Service 包名
.serviceImpl("service.impl") //Service Impl 包名
.mapper("mapper") //Mapper 包名
.xml("mapping") // Mapper XML 包名
.controller("controller") //Controller 包名
.pathInfo(Collections.singletonMap(OutputFile.xml, System.getProperty("user.dir") + "\\src\\main\\resources\\mapping"));//指定xml位置
})
//策略配置
.strategyConfig(builder -> {
builder.addInclude(tables)
.addTablePrefix("tbl_")//表名前缀,配置后生成的代码不会有此前缀
.serviceBuilder()
.formatServiceFileName("%sService")//服务层接口名后缀
.formatServiceImplFileName("%sServiceImpl")//服务层实现类名后缀
.entityBuilder()
.enableLombok()//实体类使用lombok,需要自己引入依赖
.logicDeleteColumnName("deleted")//逻辑删除字段,使用delete方法删除数据时会将status设置为1。调用update方法时并不会将该字段放入修改字段中,而是在条件字段中
.enableTableFieldAnnotation()//加上字段注解@TableField
.controllerBuilder()
.formatFileName("%sController")//控制类名称后缀
.enableRestStyle()
.mapperBuilder()
.superClass(BaseMapper.class)
.formatMapperFileName("%sMapper")
.enableMapperAnnotation()
.formatXmlFileName("%sMapper");
})
.execute();
}
3.5.3、 3.5.1以前的版本
public static void main(String[] args) {
// 全局配置
GlobalConfig config = new GlobalConfig();
config.setActiveRecord(true);//是否支持AR模式
config.setAuthor("lfh");//作者
config.setOutputDir(System.getProperty("user.dir") + "\\src\\main\\java");//生成路径
config.setFileOverride(true);//文件覆盖
config.setIdType(IdType.AUTO);//自增策略
config.setServiceName("%sService");//设置生成的service接口的名字首字母是否有I
config.setBaseResultMap(true);
config.setBaseColumnList(true);
//2.数据源配置
DataSourceConfig dsc = new DataSourceConfig();
dsc.setDbType(DbType.MYSQL);//设置数据库类型
dsc.setUrl("jdbc:mysql://localhost:3306/springboot-test-db?useUnicode=true&useSSL=false&characterEncoding=utf8");
dsc.setDriverName("com.mysql.cj.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("root");
//3.策略配置
StrategyConfig strategyConfig = new StrategyConfig();
strategyConfig.setCapitalMode(true);//开启全局大写命名
strategyConfig.setNaming(NamingStrategy.underline_to_camel);//数据库表映射到实体的命名策略
strategyConfig.setTablePrefix("tbl_");//表的前缀
strategyConfig.setInclude("tbl_user");//需要生成的表
//4.包名策略配置
PackageConfig pc = new PackageConfig();
pc.setParent("com.example.springboot")
.setMapper("mapper")
.setService("service")
.setController("controller")
.setEntity("bean")
.setXml("mapper");
//5.整合配置
AutoGenerator autoGenerator = new AutoGenerator();
autoGenerator.setGlobalConfig(config)
.setDataSource(dsc)
.setStrategy(strategyConfig)
.setPackageInfo(pc);
//6.执行
autoGenerator.execute();
}