基於h2數據庫使用mybatis-generator-maven-plugin生成代碼實踐-註解版

背景

在一般用到mybatis的項目中,大家一般都習慣用mybatis-generator直連數據庫來生成mapper文件和java代碼,然後再根據實際情況對項目中已有的mapper文件和java代碼進行調整,這樣做可能會存在2個問題:

  • 在把生成的mapper文件和java代碼整合到到原項目的過程中,有可能會出錯
  • 直連的數據庫有可能還沒有更新schema,導致生成的mapper文件和java代碼還不是預期的

因此,我們把mybatis-generator生成的mapper文件和java代碼直接作爲一個單獨的模塊來維護,輸出一個jar包即可。以maven工程爲例,其它項目只需要以dependency的方式引入並直接使用即可,避免了調整過程中可能出錯的環節;另外,我們把數據庫最新的schema先導入h2,然後再用mybatis-generator連接到h2,生成mapper文件和java代碼,這樣就保證了每次生成的代碼都是我們所期望的,而且這個過程我們不再需要連接實際的數據庫,隨時隨地生成mapper文件和java代碼。

接下來我們簡單介紹一下如何使用快嘉mbg-archetype快速生成這樣的一個模塊和這個模塊的基本使用方法。該模塊從1.1版本開始,默認生成mybatis註解代碼。如仍需mapper定義文件,調整mybatis-generator.xml中的相應參數即可。

1.環境準備

版本
開發機OS win10
JDK 1.8+
Maven Maven 3.3.9+

2.使用快嘉mbg原型生成一個新項目

原型聲明: com.fastjrun.archetype:mbg-archetype:1.2 原型參數:

  • groupId:pom座標
  • artifactId:pom座標,這個值同時會影響到工程下pom.xml中的artifactId、pom中引用的插件mybatis-generator-maven-plugin的配置sqlFile和鏈接的h2庫名稱、該工程下的sql文件名。
  • version:pom座標
  • package:生成代碼包名前綴 選擇合適的參數,在任一目錄下執行腳手1考如下示例命令,示例命令會在當前執行目錄生成一個mbgdemo文件夾)
mvn archetype:generate -U -B -DgroupId=com.fastjrun.share -DartifactId=mbgdemo -Dpackage="com.fastjrun.share.mbgdemo" -Dversion=1.0-SNAPSHOT -DarchetypeGroupId=com.fastjrun.archetype -DarchetypeArtifactId=mbg-archetype -DarchetypeVersion=1.2 -U

mbgdemo目錄下文件組織結構

│  pom.xml
│
└─src
    └─main
        ├─java
        │      don't kill me.info
        │
        └─resources
                mbgdemo.sql
                mybatis-generator.xml

=======================================================================

3.將mbgdemo.sql修改成你工程的建庫sql,可在本工程下生成mybatis相關entity和mapper代碼

新打開一個term窗口,並進入mbgdemo目錄,執行mvn clean package就可以在target目錄生成mbgdemo-1.0-SNAPSHOT.jar後,該jar裏已經包含了mybatis的entity和mapper代碼,該jar可以提供給其他模塊以dependency的方式引入並直接使用。

具體配置詳見 src/main/resources/mybatis-generator.xml,可參考(MyBatis GeneratorXML Configuration File Reference)進行調整

<?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>

    <!-- !!!! Driver Class Path !!!! -->
    <context id="context" targetRuntime="MyBatis3">
        <plugin type="org.mybatis.generator.plugins.RowBoundsPlugin"></plugin>
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"></plugin>
        <commentGenerator>
            <property name="suppressAllComments" value="true"/>
            <property name="suppressDate" value="true"/>
        </commentGenerator>
        <!-- !!!! Database Configurations !!!! -->
        <jdbcConnection driverClass="org.h2.Driver"
                        connectionURL="jdbc:h2:mem:mbgdemo;MODE=MYSQL;DB_CLOSE_DELAY=-1;DATABASE_TO_UPPER=FALSE"
                        userId="sa"
                        password="sa"/>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>
        <!-- !!!! Model Configurations !!!! -->
        <javaModelGenerator targetPackage="com.fastjrun.share.mbgdemo.entity"
                            targetProject="${targetJavaProject}">
            <property name="enableSubPackages" value="false" />
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- !!!! Mapper XML Configurations !!!! -->
        <sqlMapGenerator targetPackage="mappers"
                         targetProject="${targetResourcesProject}">
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>
        <!-- !!!! Mapper Interface Configurations !!!! when type in
        XMLMAPPER:生成xml文件
        ANNOTATEDMAPPER: 生成註解,忽略xml文件
        -->
        <javaClientGenerator targetPackage="com.fastjrun.share.mbgdemo.mapper"
                             targetProject="${targetJavaProject}" type="ANNOTATEDMAPPER">
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>
        <!-- !!!! Table Configurations !!!! -->
        <table tableName="t_user"
               enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false"
               enableSelectByExample="false" selectByExampleQueryId="false" >
        </table>
        <table tableName="t_user_login"/>
    </context>
</generatorConfiguration>

注意:mybatis-generator的覆蓋只針對以上配置文件中出現的table節點有效,以上面配置文件爲例:如果第一次代碼生成同時配置了t_user和t_user_login,第二次代碼生成只配置了t_user,則t_user相關java代碼和xml配置文件會被覆蓋,而t_user_login相關java代碼和xml配置文件將會保留不會被處理,本示例工程提供了一種解決方案,在生成代碼之前,使用maven-clean-plugin同時刪除了src/main/java/下所有java代碼和src/main/resources下的mappers目錄。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-clean-plugin</artifactId>
    <version>${maven-clean-plugin.version}</version>
    <configuration>
        <filesets>
            <fileset>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*</include>
                </includes>
               <useDefaultExcludes>true</useDefaultExcludes>
               <!--對這些文件不清理-->
               <excludes>
                   <exclude>*.info</exclude>
               </excludes>
            </fileset>
            <fileset>
                <directory>src/main/resources</directory>
                <includes>
                    <include>mappers/</include>
                </includes>
            </fileset>
        </filesets>
    </configuration>
</plugin>

4.下面演示一下定製化maven-clean-plugin取得的效果

新打開一個term窗口,並進入mbgdemo目錄

cd mbgdemo
mvn clean generate-sources

這時候mbgdemo目錄下文件組織結構,這是mybatis-generator新生成代碼的時候,這時還沒有編譯

│  pom.xml
│
└─src
    └─main
        ├─java
        │  │  don't kill me.info
        │  │
        │  └─com
        │      └─fastjrun
        │          └─share
        │              └─mbgdemo
        │                  ├─entity
        │                  │      TUser.java
        │                  │      TUserLogin.java
        │                  │      TUserLoginExample.java
        │                  │
        │                  └─mapper
        │                          TUserLoginMapper.java
        │                          TUserLoginSqlProvider.java
        │                          TUserMapper.java
        │                          TUserSqlProvider.java
        │
        └─resources
                mbgdemo.sql
                mybatis-generator.xml

接下來執行mvn clean,會發現mbgdemo還原到了初始化的時候,文件組織結構又變如下

│  pom.xml
│
└─src
    └─main
        ├─java
        │      don't kill me.info
        │
        └─resources
                mbgdemo.sql
                mybatis-generator.xml

使用H2數據庫的一些注意事項

  • 用mysqldump導出demo.sql結構,參考命令 mysqldump -uroot -p123456 -d demo> demo.sql
  • 用導出的demo.sql替換項目中的mbgdemo.sql
  • Date字段不能爲“0000-00-00 00:00:00”,建議替換爲“1970-01-01 08:00:01”
  • 無論字段還是表級別,h2都不支持CHARSET=utf8類似字段,可以全部替換爲空字符
  • h2不支持顯示聲明USING BTREE ,可以全部替換爲空字符
  • h2表級別只支持COMMENT和ENGINE兩個屬性,且COMMENT要在ENGINE之前
  • h2要求全庫索引名稱全庫唯一,這樣就需要處理數據庫中所有重複的索引名稱,保證,如DEMO_INDEX一共出現了4次,依次調整爲DEMO_INDEX、DEMO_INDEX2、DEMO_INDEX3和DEMO_INDEX4

原型源碼地址:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章