日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

xml生成2维码_MyBatis(2)之MyBatis-Generator最佳实践

發布時間:2023/12/10 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 xml生成2维码_MyBatis(2)之MyBatis-Generator最佳实践 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

自定義注釋

自定義注解

指定xml文件模式

上一篇文章詳細闡述了xml配置文件的各種標簽及其含義。其實從標簽開始,每一個標簽都對應一個實體類。context.class對應標簽,而每一個子標簽都對應一個屬性;如圖:

標簽與實體類的對應關系

。有了實體類的關系,那么自定義起來還不是易如反掌。

自定義添加注釋

以用數據庫中字段的注釋,作為Model屬性的注釋為例:

針對注解的標簽是,對應的接口實體類是CommentGenerator,該類中封裝了針對GetterComment、SetterComment、FieldComment、ClassComment以及xml中的注解,這些方法在生成實體類時,會通過Context被調用;該接口默認有默認的實現類DefaultCommentGenerator。切入點就是該DefaultCommentGenerator:

  • 去除原始的Getter、Setter方法的默認注釋,只要實現addSetterComment、addGetterComment方法,返回為空,原生注釋就不會再生成;
  • 實現addFieldComment方法(管控Model屬性的注釋內容),具體如下:
  • @Override public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { StringBuffer sb = new StringBuffer(); field.addJavaDocLine("/**"); field.addJavaDocLine("*"); // 獲取表的名稱 sb.append("* TableName: " + introspectedTable.getFullyQualifiedTable() + ""); //獲取該表中屬性的名稱 sb.append("* ColumnName: " + introspectedColumn.getActualColumnName() + ""); sb.append("*" + ""); //該字段的comment 信息 sb.append("*" + introspectedColumn.getRemarks()); field.addJavaDocLine(sb.toString()); field.addJavaDocLine("*"); field.addJavaDocLine("**/"); }

    解釋:

  • addFieldComment方法有重載,意思是是否標注當前屬性對應數據庫的那個字段,看個人需要選擇性實現。
  • IntrospectedTable實體類封裝了數據庫表對應的原始信息,相應的IntrospectedColumn則是封裝了表中字段的原始信息,所有我們通過該對象獲取到字段的注釋,在添加到實體類的屬性上.(我這個地方沒有封裝,源碼中是封裝了生成所有注釋的通用方法,實際運用中可統一封裝)。
  • MyBatis將java中類、方法、接口、枚舉、內部類、內部類枚舉抽象成JavaElement對象,而Field則是針對類中屬性的封裝。
  • 本人感覺xml文件中的注釋多余,就實現addComment方法,不做任何的實現,去除xml中的原生注釋;
  • 自定義注解

    在目前我們開發中,注解使用的非常廣發,大大簡化了我們的開發,比如:

    • LomBook針對實體類對象各種注解,最常用的@Data(@Setter,@Getter)、@NoArgsConstructor等。那能否再Model上自動添加上我們需要的注解呢?
    • 我們知道Spring Boot中Mapper接口對應的注解是@Repository注解,但原生生成時不會有該注解的,那要一個一個類手動添加嗎?

    針對以上需求,我們詳細聊聊PluginAdapter。通過Idea查看該類的結構,可以看到該中方法非常之多,但可分為:

    • clientxxxx相關的方法控制Mapper接口生成規則,細粒度到每個能夠生成的方法上
    • sqlMapxxxx相關方法控制xml文件生成的方式,細粒度到每個能夠生成的方法上;
    • modelxxxx相關方法控制Model類的生成規則。model類的生成規則有三種,所以model相關的方法也是關于三種規則生成時的相關方法;
    • 針對以上需求,我們逐個擊破:
  • 生成的Model上增加Lombook相關的注釋,繼承PluginAdapter類,重寫modelBaseRecordClassGenerated方法,具體如下:
  • @Override public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { javaTypes().forEach(item->topLevelClass.addImportedType(item)); addAnnons().forEach(item->topLevelClass.addAnnotation(item)); return super.modelBaseRecordClassGenerated(topLevelClass, introspectedTable); } //注解對應的完整的類路徑 private List javaTypes(){ List javaTypes = new ArrayList<>(2); javaTypes.add(new FullyQualifiedJavaType("lombok.Data")); javaTypes.add(new FullyQualifiedJavaType("lombok.NoArgsConstructor")); return javaTypes; } //需要添加的注解 private List addAnnons(){ List annons = new ArrayList<>(2); annons.add("@Data"); annons.add("@NoArgsConstructor"); return annons; }

    通過上面方法,在生成Model時會自動添加上相應的注解;再比如:Spring Boot的Swagger也是通過注解,如果返回前端的實體類也是通過Mybatis Generator自動生成,那么就可以將@ApiModel以及@ApiModelProperty注解添加到生成的類中;是不是特別的方便;

    xml文件的兩種模式

    在MyBatis生成的xml默認是append的方式,比如:隨著需求版本的迭代,數據庫中的字段改變,對應的實體類以及xml需要重新生成,那么默認新生成的xml內容,會追加到舊的版本中,這時啟動項目會報錯(resultMap標簽重復),所以這時需要將舊的覆蓋掉;

    此時我們要干預xml文件的生成方式,那么繼承PluginAdaptor重寫sqlMapGenerated方法。該方法中GeneratedXmlFile參數是封裝xml文件的所有屬性,其中私有屬性isMergeable即是否合并的意思,默認為false,那么我們現在就要改變該屬性的值。可惜的是該屬性沒有公開,需要通過反射改變,具體如下:

    @Override public boolean sqlMapGenerated(GeneratedXmlFile sqlMap, IntrospectedTable introspectedTable) { try { Field field = sqlMap.getClass().getDeclaredField("isMergeable"); field.setAccessible(true); field.setBoolean(sqlMap, false); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } return true; }

    在生成時就會覆蓋原來的舊文件。那如果自定義的sql也寫在該文件,那么也會被覆蓋,目前我實踐的解決方案有兩種:

  • 通過版本管理工具控制。比如git,被覆蓋掉的方法,都會有提示或者能夠重新回退到最近的一個版本,方法就可以再找回來;
  • 分兩個xml文件,同一個Mapper接口對應兩個xml,一個是自動生成的,永遠保存自動生成的,另外在創建一個自定義的sql語句的xml文件。
  • 個人推薦第二種,最不易出錯。
  • 總結

    以上是生活随笔為你收集整理的xml生成2维码_MyBatis(2)之MyBatis-Generator最佳实践的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。