You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MyBatis中保留并使用自定义Setter方法?

如何在MyBatis中保留并使用自定义Setter方法?

你这个思路完全没问题!在setter方法里统一添加日志记录,确实是处理这类全局字段日志需求的最优方案——毕竟字段在项目里被广泛使用,通过setter来统一拦截赋值操作,能避免在每个调用点重复写日志代码。

一、关于自定义Setter的写法

你写的setter逻辑是合理的:先完成字段赋值,再追加日志记录。需要注意的是,如果你的log是类的成员变量,要确保它已经被正确初始化(比如通过SLF4J的LoggerFactory获取实例),避免空指针问题。

二、防止MyBatis Generator覆盖自定义Setter的两种实用方法

MyBatis Generator默认会重新生成实体类的所有代码,包括setter,所以要通过配置或代码标记来保护你的自定义代码,这里有两种最常用的方案:

方案1:通过Generator配置禁止生成指定字段的Setter

在你的MyBatis Generator XML配置文件中,找到对应的<table>标签,添加<columnOverride>来指定不生成my_field的setter:

<table tableName="your_table_name" domainObjectName="YourEntity">
    <!-- 针对my_field字段,禁止生成setter -->
    <columnOverride column="my_field" generateSetters="false"/>
</table>

这样下次运行Generator时,就不会为myField生成setter方法,你手写的自定义setter会被完整保留。

方案2:使用Generator的用户代码标记块

MyBatis Generator默认会识别并保留// BEGIN USER CODE和// END USER CODE之间的代码,不会在重新生成时覆盖。你可以把自定义的setter放在这个标记块里:

/**
 * This field was generated by MyBatis Generator. This field corresponds to the database column
 * my_field
 *
 * @mbg.generated {DATETIME}
 */
@ParentToChildSync(sync = StringSync.class)
protected String myField;

// BEGIN USER CODE
protected void setMyField(String myField) {
    this.myField = myField;
    log.add("set my field as: %s", myField);
}
// END USER CODE

这种方法的好处是不需要修改Generator配置,直接在代码里标记即可,适合快速修改单个实体类的场景。

如果只有少数字段需要自定义setter,用方案2更方便;如果多个实体类或字段都有类似需求,方案1的配置方式更高效。

备注:内容来源于stack exchange,提问作者Steven

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 09:25:29