如何在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
相关产品推荐
相关产品推荐

