MyBatis-Plus中提供的注解和自动代码生成器

Java知识点总结:想看的可以从这里进入

3.3、相关注解

在使用MyBatis-Plus 时,我们仅仅在泛型中设置了实体类,并没有指明数据库的表名或字段,这些数据是MyBatis-Plus 自动判断并对应起来的,它默认操作的表名和实体类型的类名一致,所以当表名有下划线时,如 user 变成 t_user,这时候再进行查询,就会出现异常。

所以针对实体类和数据库表或字段的一些列问题, MyBatis-Plus 提供了几个注解:

  1. @TableName(“数据表名”):用在实体类上,标识实体类对应的是那张数据表

    属性类型描述
    valueString对应数据库的表明,内部属性只有value时,可以省略直接写 “”
    resultMapStringxml 中 resultMap 的 id(用于满足特定类型的实体类对象绑定)
    autoResultMapboolean是否自动构建 resultMap 并使用(如果设置 resultMap 则不会进行 resultMap 的自动构建与注入)
    excludePropertyString[]需要排除的属性名
    keepGlobalPrefixboolean是否保持使用全局的 tablePrefix 的值(当全局 tablePrefix 生效时)
    schemaStringschema
  2. @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
  3. @TableField(“字段名”):用于除主键外的其他属性上,用来和数据库字段名进行对应

    属性类型描述
    valueString数据库字段名
    existboolean是否为数据库表字段,默认为true
    conditionStringwhere查询比较条件,有值则按设置的值为准,没有则为默认全局的 %s=#{%s}
    updateStringupdate set 部分注入,例如:当在version字段上注解 update=“%s+1” 表示更新时会 set version=version+1(该属性优先级高于 el 属性)
    fillEnum字段自动填充策略
    selectboolean是否进行 select 查询,默认为true
    keepGlobalFormatboolean是否保持使用全局的 format 进行处理,默认为false
    jdbcTypeJdbcTypeJDBC 类型
    typeHandlerClass<? extends TypeHandler>类型处理器
    numericScaleString指定小数点后保留的位数
  4. @FieldStrategy:字段策略枚举类

    描述
    IGNORED忽略判断
    NOT_NULL非 NULL 判断
    NOT_EMPTY非空判断(只对字符串类型字段,其他类型字段依然为非 NULL 判断)
    DEFAULT追随全局配置
    NEVER不加入SQL
  5. @TableLogic:用于数据库中表示删除的字段,因为在实际使用数据库是,不会真的删除某条数据,而是采用逻辑删除,比如设定一个deleted的字段,如为1则表示没有删除,如果为0则表示删除。

    而将 @TableLogic 就是用在这种字段对应的属性上,表示逻辑删除,这样在删除时,实际上执行的是update的修改。

    属性类型描述
    valueString逻辑未删除值
    delvalString逻辑删除值
  6. @OrderBy:内置 SQL 默认指定排序,优先级低于 wrapper 条件查询

    属性类型描述
    isDescboolean是否倒序查询,默认true
    sortshort数字越小越靠前
  7. @Version:乐观锁注解

3.5、代码生成器

在MyBatis-Plus中提供了代码生成器,我们提供了数据库表名后,代码生成器会根据表,自动生成 entity、mapper、service、controller等相关的代码,十分方便。

3.5.1、基础配置
  1. 数据库配置

    属性说明示例
    urljdbc 路径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();
    
  2. 全局配置

    方法说明示例
    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();
    
  3. 自动生成包的配置

    方法说明示例
    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();
    
  4. 模板配置

    方法说明示例
    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();
    
  5. 注入配置

    方法说明示例
    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();
    
  6. 策略配置

    方法说明示例
    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实体策略配置
    controllerBuildercontroller 策略配置
    mapperBuildermapper 策略配置
    serviceBuilderservice 策略配置
    new StrategyConfig.Builder()
        .enableCapitalMode()
        .enableSkipView()
        .disableSqlFilter()
        .likeTable(new LikeTable("USER"))
        .addInclude("t_simple")
        .addTablePrefix("t_", "c_")
        .addFieldSuffix("_flag")
        .build();
    
  7. 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();
    
  8. 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();
    
  9. 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();
    
  10. 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();
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

辰 羽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值