亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么在MyBatis中通過自定義Generator 生成注釋

發布時間:2021-05-18 17:50:17 來源:億速云 閱讀:395 作者:Leah 欄目:編程語言

怎么在MyBatis中通過自定義Generator 生成注釋?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC
    "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    
<generatorConfiguration>
  <!-- 指定數據庫驅動的jdbc驅動jar包的位置 -->
  <classPathEntry location="./mysql-connector-java-5.1.40.jar" />

  <context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" >
    <!-- 生成的 Java 文件的編碼 -->
    <property name="javaFileEncoding" value="UTF-8"/>
    <!-- 格式化 Java 代碼 -->
    <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
    <!-- 格式化 XML 代碼 -->
    <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>

    <!-- 配置數據庫連接 -->
    <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8" userId="root" password="123456">
    </jdbcConnection>

    <!-- 生成實體的位置 -->
    <javaModelGenerator targetPackage="me.mizhoux.model" targetProject="src/main/java">
      <property name="enableSubPackages" value="true"/>
    </javaModelGenerator>

    <!-- 生成 Mapper 接口的位置 -->
    <sqlMapGenerator targetPackage="me.mizhoux.mapper" targetProject="src/main/java">
      <property name="enableSubPackages" value="true"/>
    </sqlMapGenerator>

    <!-- 生成 Mapper XML 的位置 -->
    <javaClientGenerator targetPackage="me.mizhoux.mapper" type="XMLMAPPER" targetProject="src/main/java">
      <property name="enableSubPackages" value="true"/>
    </javaClientGenerator>

    <!-- 設置數據庫的表名和實體類名 -->
    <table tableName="t_user" domainObjectName="User">
      <!-- generatedKey用于生成生成主鍵的方法 -->
      <generatedKey column="id" sqlStatement="SELECT LAST_INSERT_ID()"/>
    </table>

  </context>

</generatorConfiguration>

數據庫建庫建表的代碼:

CREATE SCHEMA `db_test` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ;

CREATE TABLE `db_test`.`t_user` (
 `id` INT NOT NULL AUTO_INCREMENT COMMENT '用戶 ID',
 `username` VARCHAR(30) NULL COMMENT '用戶名稱',
 `password` VARCHAR(20) NULL COMMENT '用戶密碼',
 `birthday` DATE NULL COMMENT '用戶生日',
 PRIMARY KEY (`id`),
 UNIQUE INDEX `username_UNIQUE` (`username` ASC)
) COMMENT = '用戶';

開開心心,執行命令,開始生成代碼:

java -jar mybatis-generator-core-1.3.7.jar -configfile generatorConfig.xml -overwrite

然后查看生成的 Java 實體類:

怎么在MyBatis中通過自定義Generator 生成注釋

看著這個注釋,讓我有點糾結啊 —— 為什么不是數據庫中每個字段對應的注釋呢?查找相關資料,得知 MBG 生成的是由 org.mybatis.generator.api.CommentGenerator 來控制的。這是一個接口,MBG 的默認實現類是做 org.mybatis.generator.internal.DefaultCommentGenerator。當你在 generatorConfig.xml 中配置了 commentGenerator 標簽,那么默認狀態下,生成注釋的工作,將由 DefaultCommentGenerator來完成。 所以我們來查看下這個 DefaultCommentGenerator 的源碼:

public class DefaultCommentGenerator implements CommentGenerator {
  // 屬性,即配置在 commentGenerator 標簽之內的 Property 標簽
  private Properties properties;
  // 是否不生成日期
  private boolean suppressDate;
  // 是否不生成注釋
  private boolean suppressAllComments;
  // 是否添加數據庫內的注釋
  private boolean addRemarkComments;
  // 日期格式化
  private SimpleDateFormat dateFormat;

  public DefaultCommentGenerator() {
    super();
    properties = new Properties();
    suppressDate = false;
    suppressAllComments = false;
    addRemarkComments = false;
  }

  @Override
  public void addConfigurationProperties(Properties properties) {
    this.properties.putAll(properties);

    suppressDate = isTrue(properties
        .getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_DATE));
    
    suppressAllComments = isTrue(properties
        .getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_ALL_COMMENTS));

    addRemarkComments = isTrue(properties
        .getProperty(PropertyRegistry.COMMENT_GENERATOR_ADD_REMARK_COMMENTS));
    
    String dateFormatString = properties.getProperty(PropertyRegistry.COMMENT_GENERATOR_DATE_FORMAT);
    if (StringUtility.stringHasValue(dateFormatString)) {
      dateFormat = new SimpleDateFormat(dateFormatString);
    }
  }
  
  // 其他代碼
  ...
}

addRemarkComments 這個屬性,看來就是用來生成數據庫注釋用的 —— 好開心,那把它設置為 true 試試:

<generatorConfiguration>
  <!-- 指定數據庫驅動的jdbc驅動jar包的位置 -->
  <classPathEntry location="./mysql-connector-java-5.1.40.jar" />
  
  <context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" >
    <property name="javaFileEncoding" value="UTF-8"/>
    <!-- 其他 Property -->

    <commentGenerator>
      <property name="suppressDate" value="true"/>
      <property name="addRemarkComments" value="true"/>
    </commentGenerator>
    
    ...
  </context>
</generatorConfiguration>

運行命令:

java -jar mybatis-generator-core-1.3.7.jar -configfile generatorConfig.xml -overwrite

怎么在MyBatis中通過自定義Generator 生成注釋

數據庫注釋倒是拿到了,但是生成的一堆其他信息,看著實在是太扎眼了。查看源碼,發現這些內容已經寫死在 DefaultCommentGenerator 中了,沒有辦法自定義。

怎么在MyBatis中通過自定義Generator 生成注釋

自己動手豐衣足食,我們為啥不自己寫個類實現 CommentGenerator 接口,然后自定義自己想要的注釋呢。查看 commentGenerator 的 DTD,發現正好 commentGenerator 有個 type 屬性,可以用來指定自己的注釋實現類:

怎么在MyBatis中通過自定義Generator 生成注釋

查看 CommentGenerator 接口,發現里面的方法非常多,不僅包含了生成 Java 實體注釋對應的方法,還包括了生成 XML 中注釋的方法。所以我們先寫一個默認的實現類,實現CommentGenerator 接口,但不做任何操作 —— 因為 DefaultCommentGenerator 本文已經存在了,為了避免混淆,就叫它SimpleCommentGenerator吧。然后定義我們自己的注釋類,MySQLCommentGenerator,繼承 SimpleCommentGenerator,重寫我們需要的方法:

public class MySQLCommentGenerator extends SimpleCommentGenerator {

  private Properties properties;

  public MySQLCommentGenerator() {
    properties = new Properties();
  }

  @Override
  public void addConfigurationProperties(Properties properties) {
    // 獲取自定義的 properties
    this.properties.putAll(properties);
  }

  @Override
  public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
    String author = properties.getProperty("author");
    String dateFormat = properties.getProperty("dateFormat", "yyyy-MM-dd");
    SimpleDateFormat dateFormatter = new SimpleDateFormat(dateFormat);

    // 獲取表注釋
    String remarks = introspectedTable.getRemarks();

    topLevelClass.addJavaDocLine("/**");
    topLevelClass.addJavaDocLine(" * " + remarks);
    topLevelClass.addJavaDocLine(" *");
    topLevelClass.addJavaDocLine(" * @author " + author);
    topLevelClass.addJavaDocLine(" * @date " + dateFormatter.format(new Date()));
    topLevelClass.addJavaDocLine(" */");
  }

  @Override
  public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
    // 獲取列注釋
    String remarks = introspectedColumn.getRemarks();
    field.addJavaDocLine("/**");
    field.addJavaDocLine(" * " + remarks);
    field.addJavaDocLine(" */");
  }
}

因為我們現在要使用到我們自己自定義的 CommentGenerator ,所以我們 通過代碼的方式來操作 MBG:

public class Generator {

  public static void main( String[] args ) throws Exception {
    List<String> warnings = new ArrayList<>();
    File configFile = new File("generatorConfig.xml");
    ConfigurationParser cp = new ConfigurationParser(warnings);
    Configuration config = cp.parseConfiguration(configFile);
    DefaultShellCallback callback = new DefaultShellCallback(true);
    MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
    myBatisGenerator.generate(null);
  }

}

然后配置 generatorConfig.xml設置我們自己的注釋生成器:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC
    "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
  <!-- 指定數據庫驅動的jdbc驅動jar包的位置 -->
  <!-- 不再需要,因為 jar 包已經在 classpath 中
  <classPathEntry location="./mysql-connector-java-5.1.40.jar" /> 
  -->

  <context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" >
    ...
    
    <!-- 自定義注釋生成器 -->
    <commentGenerator type="me.mizhoux.mbgcomment.MySQLCommentGenerator">
      <property name="author" value="Michael Chow"/>
      <property name="dateFormat" value="yyyy/MM/dd"/>
    </commentGenerator>
    
    ...
  </context>

</generatorConfiguration>

完整的 Maven 項目在 我的 GitHub。現在,我們運行主類 Generator,成功生成了數據庫中的注釋:

怎么在MyBatis中通過自定義Generator 生成注釋

想來應該是 JDBC 連接 MySQL 的時候需要添加什么屬性才能獲取表的注釋,上網查詢,發現是 useInformationSchema,需要將其設置為 true(看來是 MBG 給自己的 DefaultCommentGenerator 開了小灶):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC
    "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
  <context id="mysql" defaultModelType="hierarchical" targetRuntime="MyBatis3Simple" >
    ...
    
    <!-- 自定義注釋生成器 -->
    <commentGenerator type="me.mizhoux.mbgcomment.MySQLCommentGenerator">
      <property name="author" value="Michael Chow"/>
      <property name="dateFormat" value="yyyy/MM/dd"/>
    </commentGenerator>

    <!-- 配置數據庫連接 -->
    <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8" userId="root" password="123456">
       <!-- 設置 useInformationSchema 屬性為 true -->
       <property name="useInformationSchema" value="true" />
    </jdbcConnection>
    
    ...
  </context>
</generatorConfiguration>

然后再次運行主類 Generator

怎么在MyBatis中通過自定義Generator 生成注釋

看完上述內容,你們掌握怎么在MyBatis中通過自定義Generator 生成注釋的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泊头市| 邳州市| 遂平县| 和龙市| 小金县| 乐至县| 大新县| 广昌县| 山西省| 大英县| 南昌市| 米泉市| 安仁县| 宁晋县| 彭州市| 库伦旗| 平舆县| 姚安县| 新民市| 胶州市| 贺兰县| 农安县| 蒙城县| 扶风县| 本溪| 沿河| 永济市| 平罗县| 泸西县| 台山市| 钟祥市| 太仓市| 宣武区| 平昌县| 西丰县| 迁西县| 惠来县| 连云港市| 常熟市| 陇川县| 巢湖市|