Mybatis Generator是很好的工具幫助我們生成表映射關聯代碼,最近博主遇到一個問題,找了很久才解決,
就是用Mybatis Generator生成實體類的時候,Date 時間無法格式化輸出,導致前端掉接口的時候格式不對,
解決方案如下,希望能幫助到需要的人:
給我啟發的博客地址:https://blog.csdn.net/lchq1995/article/details/78417993
解決的關鍵是我們需要在實體類中加上如下注解,這樣查詢的時候日期會自動格式化
注意:我的表中updatedTime的jdbcType是timestamp類型的
問題是如何在生成代碼時候自動加入這兩個注解呢?
首先我們要自定義注釋生成器,讓他自動在實體類中加上注解 我的生成器代碼如下(本人也是借鑒某位大神的寫法):
import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.dom.java.CompilationUnit; import org.mybatis.generator.api.dom.java.Field; import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType; import org.mybatis.generator.internal.DefaultCommentGenerator; import org.mybatis.generator.internal.util.StringUtility; import java.util.Properties; /** * 自定義注釋生成器 * */ public class CommentGenerator extends DefaultCommentGenerator { private boolean addRemarkComments = false; private static final String EXAMPLE_SUFFIX="Example"; private static final String API_MODEL_PROPERTY_FULL_CLASS_NAME="io.swagger.annotations.ApiModelProperty"; private static final String API_JSON_SERIALIZE="com.fasterxml.jackson.databind.annotation.JsonSerialize"; private static final String API_JSON_DATE_SERIALIZER="com.chuanmian.common.util.JsonDateSerializer"; private static final String API_DATE_TIME_FORMAT="org.springframework.format.annotation.DateTimeFormat"; /** * 設置用戶配置的參數 */ @Override public void addConfigurationProperties(Properties properties) { super.addConfigurationProperties(properties); this.addRemarkComments = StringUtility.isTrue(properties.getProperty("addRemarkComments")); } /** * 給字段添加注釋 */ @Override public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { String remarks = introspectedColumn.getRemarks(); //根據參數和備注信息判斷是否添加備注信息 if(addRemarkComments&&StringUtility.stringHasValue(remarks)){ // addFieldJavaDoc(field, remarks); //數據庫中特殊字符需要轉義 if(remarks.contains("\"")){ remarks = remarks.replace("\"","'"); } //給model的字段添加swagger注解 field.addJavaDocLine("@ApiModelProperty(value = \""+remarks+"\")"); // createdTime或者updatedTime時間格式化 if("createdTime".equals(field.getName()) || "updatedTime".equals(field.getName())) { field.addJavaDocLine("@DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")"); field.addJavaDocLine("@JsonSerialize(using=JsonDateSerializer.class)"); } } } /** * 給model的字段添加注釋 */ private void addFieldJavaDoc(Field field, String remarks) { //文檔注釋開始 field.addJavaDocLine("/**"); //獲取數據庫字段的備注信息 String[] remarkLines = remarks.split(System.getProperty("line.separator")); for(String remarkLine:remarkLines){ field.addJavaDocLine(" * "+remarkLine); } addJavadocTag(field, false); field.addJavaDocLine(" */"); } @Override public void addJavaFileComment(CompilationUnit compilationUnit) { super.addJavaFileComment(compilationUnit); //只在model中添加swagger注解類的導入 if(!compilationUnit.isJavaInterface()&&!compilationUnit.getType().getFullyQualifiedName().contains(EXAMPLE_SUFFIX)){ compilationUnit.addImportedType(new FullyQualifiedJavaType(API_MODEL_PROPERTY_FULL_CLASS_NAME)); compilationUnit.addImportedType(new FullyQualifiedJavaType(API_JSON_SERIALIZE)); compilationUnit.addImportedType(new FullyQualifiedJavaType(API_JSON_DATE_SERIALIZER)); compilationUnit.addImportedType(new FullyQualifiedJavaType(API_DATE_TIME_FORMAT)); } } }
以下代碼就是在特定字段上加入格式化注解的
// createdTime或者updatedTime時間格式化 if("createdTime".equals(field.getName()) || "updatedTime".equals(field.getName())) { field.addJavaDocLine("@DateTimeFormat(pattern=\"yyyy-MM-dd HH:mm:ss\")"); field.addJavaDocLine("@JsonSerialize(using=JsonDateSerializer.class)"); }
以下代碼是在實體類頂部引入對應的包的
compilationUnit.addImportedType(new FullyQualifiedJavaType(API_MODEL_PROPERTY_FULL_CLASS_NAME)); compilationUnit.addImportedType(new FullyQualifiedJavaType(API_JSON_SERIALIZE)); compilationUnit.addImportedType(new FullyQualifiedJavaType(API_JSON_DATE_SERIALIZER)); compilationUnit.addImportedType(new FullyQualifiedJavaType(API_DATE_TIME_FORMAT));
實體類我就不拷貝出來了,因為每個人情況不一樣,大體就是注意以上兩點。
附上Mybatis-generator 配置文件詳解地址:https://www.jianshu.com/p/22ac0a58cecb