mybatis-plus代码生成器 localdatetime 指定时间类型

本文介绍了如何在GeneratorCodeConfig类中配置数据库连接信息,使用MyBatisPlus进行代码自动生成,包括设置数据源、全局配置、包结构和自定义输出。重点展示了如何设置日期类型和实体类的前后端日期格式转换。
部署运行你感兴趣的模型镜像

自动生成代码

public class GeneratorCodeConfig {
    private static final String URL = "jdbc:mysql://127.0.0.1:3306/kyx?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "123456";

    public static String scanner(String tip) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入" + tip + ":");
        if (scanner.hasNext()) {
            String ipt = scanner.next();
            if (StringUtils.isNotEmpty(ipt)) {
                return ipt;
            }
        }
        throw new MybatisPlusException("请输入正确的" + tip + "!");
    }

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

        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        String projectPath = System.getProperty("user.dir");
        gc.setOutputDir(projectPath + "/src/main/java");
        gc.setAuthor("xyang");
        gc.setOpen(false);
        //实体属性 Swagger2 注解
        gc.setSwagger2(false);
        gc.setActiveRecord(true);
        // XML 二级缓存
        gc.setEnableCache(false);
        // XML ResultMap
        gc.setBaseResultMap(true);
        // XML columList
        gc.setBaseColumnList(true);
        // 指定生成日期类型
		// gc.setDateType(DateType.ONLY_DATE);
        mpg.setGlobalConfig(gc);

        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl(URL);
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername(USERNAME);
        dsc.setPassword(PASSWORD);
        mpg.setDataSource(dsc);

        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName(scanner("模块名"));
        pc.setParent("com.kyx.orderSys.biz");
        pc.setEntity("model");
        pc.setMapper("mapper");
        pc.setService("service");
        pc.setServiceImpl("service.impl");
        mpg.setPackageInfo(pc);

        // 自定义配置
        InjectionConfig cfg = new InjectionConfig() {
            @Override
            public void initMap() {
                // to do nothing
            }
        };

        // 如果模板引擎是 freemarker
        String templatePath = "/templates/mapper.xml.ftl";
        // 如果模板引擎是 velocity
        // String templatePath = "/templates/mapper.xml.vm";

        // 自定义输出配置
        List<FileOutConfig> focList = new ArrayList<>();
        // 自定义配置会被优先输出
        focList.add(new FileOutConfig(templatePath) {
            @Override
            public String outputFile(TableInfo tableInfo) {
                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
                return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
            }
        });
        cfg.setFileOutConfigList(focList);
        mpg.setCfg(cfg);

        // 配置模板
        TemplateConfig templateConfig = new TemplateConfig();

        // 配置自定义输出模板
        //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
        // templateConfig.setEntity("templates/entity.java");
        // templateConfig.setService();
        // templateConfig.setController();

        templateConfig.setXml(null);
        mpg.setTemplate(templateConfig);

        // 策略配置
        StrategyConfig strategy = new StrategyConfig();
        strategy.setNaming(NamingStrategy.underline_to_camel);
        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
        strategy.setSuperEntityClass(Model.class);
        strategy.setEntityLombokModel(true);
        strategy.setRestControllerStyle(true);

        strategy.setEntityLombokModel(true);
        // 公共父类
        strategy.setSuperControllerClass(BaseController.class);
        // 写于父类中的公共字段
        // strategy.setSuperEntityColumns("id");
        String[] split = scanner("表名,多个英文逗号分割").split(",");
        strategy.setInclude(Arrays.stream(split).map(i -> pc.getModuleName() + "_" + i).toArray(String[]::new));
        strategy.setControllerMappingHyphenStyle(true);
        strategy.setTablePrefix(pc.getModuleName() + "_");
        mpg.setStrategy(strategy);
        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
        mpg.execute();
    }
}

默认生成日期格式为 LocalDateTimeLocalDate

@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_user")
public class User extends Model<User> {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 创建时间
     */
    private LocalDateTime createTime;

    /**
     * 是否删除
     */
    private Boolean deleted;

    /**
     * 更新时间
     */
    private LocalDateTime updateTime;

}

可在 GeneratorCodeConfig 类中添加设置 gc.setDateType(DateType.ONLY_DATE); 已实现 Date 类型. 添加后生成的实体类如下所示

@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_user")
public class User extends Model<User> {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 创建时间
     */
    private Date createTime;

    /**
     * 是否删除
     */
    private Boolean deleted;

    /**
     * 更新时间
     */
    private Date updateTime;

}

可添加注解来实现前后端日期格式的转换

@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sys_user")
public class User extends Model<User> {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 创建时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
    private Date createTime;

    /**
     * 是否删除
     */
    private Boolean deleted;

    /**
     * 更新时间
     */
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8")
    private Date updateTime;

}

您可能感兴趣的与本文相关的镜像

Seed-Coder-8B-Base

Seed-Coder-8B-Base

文本生成
Seed-Coder

Seed-Coder是一个功能强大、透明、参数高效的 8B 级开源代码模型系列,包括基础变体、指导变体和推理变体,由字节团队开源

<think>我们正在使用MyBatis-Plus Generator,用户希望了解如何配置字段以生成特定的Java类型。根据引用[2]中的代码片段,我们可以看到在策略配置(StrategyConfig)中,可以通过.entityBuilder()来配置实体类的生成选项。但是,引用中并没有直接展示如何为特定字段配置Java类型。 实际上,在MyBatis-Plus Generator中,我们可以通过自定义类型映射(typeConvert)或者通过指定字段的注解来实现。但更常见的是使用`TableField`注解的`jdbcType`属性,或者在配置中使用`overrideColumn`方法。 然而,根据用户的问题,我们可能需要在生成代码时为特定字段指定Java类型。这可以通过以下步骤实现: 1. 在策略配置中,使用`entityBuilder().addTableFills()`来添加字段的填充配置(但这通常用于自动填充字段,如插入时间、更新时间等)。 2. 使用`entityBuilder().formatFileName()`等方法来设置文件名格式,但这不是针对字段的。 3. 更直接的方法:使用`StrategyConfig`的`columnOverride`方法(在旧版本中)或在新版本中通过`addColumnOverride`方法(或类似方法)来覆盖特定列的配置。 但是,从引用[2]的代码片段中,我们看到使用的是`StrategyConfig.Builder`,其中并没有直接展示列覆盖的方法。实际上,在MyBatis-Plus Generator 3.5.1+中,我们可以通过以下方式: ```java StrategyConfig strategyConfig = new StrategyConfig.Builder() // ... 其他配置 .addTableOverride(new TableOverride("表名") .addColumnOverride("字段名", new ColumnOverride() .setJavaType("com.example.MyType"))) .build(); ``` 但是,官方文档中更常见的做法是使用`entityBuilder().addTableFills()`并不直接解决此问题。 另一种方法是使用自定义模板,但这样比较麻烦。 实际上,我们可以通过`columnOverride`(在旧版本中)或`addColumnOverride`(在新版本中)来为特定字段指定Java类型。具体如下: 在策略配置中,我们可以这样写: ```java StrategyConfig strategyConfig = new StrategyConfig.Builder() .addInclude("table_name") // 表名 .entityBuilder() // ... 其他实体配置 .addColumnOverride("column_name", column -> column.setJavaType(Boolean.class)) .build(); ``` 但是,请注意,在MyBatis-Plus Generator 3.5.1版本中,`StrategyConfig`的构建方式可能有所不同。根据官方文档,我们可以使用以下方式覆盖列的Java类型: ```java StrategyConfig strategyConfig = new StrategyConfig.Builder() .entityBuilder() .addTableFills(new Column("update_time") // 这里只是示例,不是覆盖类型 .addColumnOverride("is_deleted", column -> { column.setJavaType(Boolean.class); // 还可以设置其他属性,如类型处理器等 }) .build(); ``` 但是,我查阅官方文档和示例,更准确的做法是使用`TableOverride`和`ColumnOverride`,但这种方式在Builder模式中可能不是直接可见的。 实际上,在最新版本(如3.5.1)中,推荐使用`addColumnOverride`方法,它属于`entityBuilder()`下的方法。具体如下: ```java StrategyConfig strategyConfig = new StrategyConfig.Builder() .entityBuilder() .enableLombok() .addColumnOverride("is_deleted", column -> { column.setJavaType(Boolean.class); // 将数据库中的tinyint映射为Boolean // 如果数据库字段类型与Java类型不是默认映射,还需要设置类型转换器 // column.setTypeHandler("com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler"); }) .build(); ``` 这样,在生成实体类时,名为`is_deleted`的字段就会被生成为`Boolean`类型。 因此,总结如下: 在MyBatis-Plus Generator配置中,通过`StrategyConfig`的`entityBuilder()`下的`addColumnOverride`方法,可以针对特定字段设置其Java类型。 下面是一个完整的示例配置: ```java // 配置策略 StrategyConfig strategy = new StrategyConfig.Builder() .addInclude("t_user") // 表名 .entityBuilder() .enableLombok() .enableChainModel() .idType(IdType.AUTO) .addColumnOverride("gender", column -> column.setJavaType(Integer.class)) // 假设数据库中的gender字段我们想映射为Integer(例如0,1,2) .addColumnOverride("is_vip", column -> column.setJavaType(Boolean.class)) // 将数据库中的tinyint(1)映射为Boolean .controllerBuilder() .enableRestStyle() .serviceBuilder() .formatServiceFileName("%sService") .mapperBuilder() .enableMapperAnnotation() .build(); ``` 这样,生成代码时,`t_user`表中的`gender`字段在实体类中会被生成为`Integer`类型,`is_vip`字段会被生成为`Boolean`类型。 注意:如果数据库字段类型与Java类型不是默认的映射关系(例如,数据库是varchar,但你想映射成枚举),那么除了设置JavaType,还需要考虑在MyBatis中如何处理类型转换(例如使用类型处理器)。在生成代码时,可以通过`column.setTypeHandler()`来设置类型处理器。 因此,用户可以根据需要,在`addColumnOverride`中为每个字段设置Java类型。 另外,如果多个表有相同字段需要覆盖,可以多次调用`addColumnOverride`,但注意第一个参数是字段名,如果多个表有同名字段且需要相同的覆盖设置,那么会同时生效。如果不同表需要不同设置,则可能需要分别配置,但目前MyBatis-Plus Generator似乎不支持在同一个策略配置中为不同表的同名字段设置不同的覆盖(除非使用多个`TableOverride`,但Builder模式中似乎没有直接提供)。在这种情况下,可能需要多次生成(每个表单独一个策略配置)或者使用自定义模板。 但是,对于大多数情况,同名字段我们希望映射为相同的Java类型,所以这种方式是可行的。 所以,针对用户的问题,我们可以这样回答:</think>在 MyBatis-Plus Generator 中配置字段生成指定Java 类型,主要通过`StrategyConfig`的列覆盖功能实现。以下是具体操作步骤和示例: ### 核心配置方法 使用`ColumnOverride`类对指定字段进行类型映射: ```java StrategyConfig strategyConfig = new StrategyConfig.Builder() .addInclude("your_table") // 指定表名 .entityBuilder() // 配置字段类型覆盖 ▼ .addColumnOverride("db_field_name", column -> { column.setJavaType("com.example.CustomType"); // 指定Java类型 column.setJdbcType(JdbcType.VARCHAR); // 指定JDBC类型(可选) }) // 其他配置 ▼ .enableLombok() .idType(IdType.AUTO) .build(); ``` ### 完整配置示例 ```java AutoGenerator generator = new AutoGenerator(dataSourceConfig); // 全局配置 GlobalConfig globalConfig = new GlobalConfig.Builder() .outputDir(System.getProperty("user.dir") + "/src/main/java") .author("YourName") .build(); // 策略配置(重点) StrategyConfig strategyConfig = new StrategyConfig.Builder() .addInclude("user") // 生成user表 .entityBuilder() // 字段类型覆盖配置 ▼ .addColumnOverride("status", col -> col.setJavaType("com.example.enums.UserStatus")) .addColumnOverride("birthday", col -> col.setJavaType("java.time.LocalDate")) .addColumnOverride("created_at", col -> col.setJavaType("java.time.LocalDateTime")) // 通用配置 ▼ .enableLombok() .enableChainModel() .idType(IdType.AUTO) .build(); generator.global(globalConfig) .strategy(strategyConfig) .execute(); ``` ### 关键说明 1. **字段定位** `addColumnOverride("db_field_name", ...)`中的参数必须是**数据库字段名**(非实体类属性名) 2. **类型映射规则** | 数据库类型 | 默认Java类型 | 自定义示例 | |------------------|----------------------|-------------------------------| | `tinyint(1)` | `Boolean` | `.setJavaType("Integer")` | | `datetime` | `Date` | `.setJavaType("LocalDateTime")`| | `varchar` | `String` | `.setJavaType("com.example.CustomType")` | 3. **枚举类型处理** 若需生成枚举类: ```java .addColumnOverride("gender", col -> col.setJavaType("com.example.enums.GenderEnum") ) ``` 4. **类型处理器集成**(可选) 如需特殊类型转换: ```java .addColumnOverride("json_field", col -> { col.setJavaType("com.example.model.JsonData"); col.setTypeHandler("com.example.handler.JsonTypeHandler"); }) ``` ### 生成效果 ```java // 生成后的实体类片段 public class User { // 自定义类型字段 private UserStatus status; // com.example.enums.UserStatus private LocalDate birthday; // java.time.LocalDate private LocalDateTime createdAt; // java.time.LocalDateTime } ``` > **注意事项** > 1. 确保自定义类型存在(如枚举类需提前创建) > 2. 复杂类型需配合`@TableField(typeHandler = ...)`使用 > 3. 日期类型建议使用`java.time`包下的类(需JDK8+) [^1]: MyBatis-Plus 官方文档 - 代码生成器配置 [^2]: MyBatis-Plus Generator 高级配置指南
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

明天你好369

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

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

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

打赏作者

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

抵扣说明:

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

余额充值