mybatis generator 使用maven 在idea中實現

最近在用mybatis開發項目,由於原來使用的hibernate,感覺mybatis幹了很多體力活,比如大量的表對應的實體類,dao,mapper都需要寫,並且我們目前還沒有進行封裝basemapper 這樣的類,自身的增刪改查,都需要自己去寫,我感覺這樣會大大降低以後的開發效率,今天週末沒事,自己從網上找了下資料,原來mybatis3之後已經和hibernate那樣可以逆向工程方法生產這些無技術含量的代碼, 後面再研究下basemapper如何通過泛型進行封裝,這樣每個類的簡單的增刪改查我們都不用寫了,只需要寫業務相關的代碼就可以了,減少了30%的代碼量基本

如果感覺我寫的不好或者不全,自己可以看官方文檔,裏面寫的比較詳細
官方文檔

添加mave 支持

在這裏插入圖片描述
這說明下:
一定放到和< /pluginManagement> 同級別,不然截圖右側mybatis-genertor 這個插件不顯示,我就是遇到這個問題了,百度才發現是這麼一個問題

<plugins>
      <plugin>
        <groupId>org.mybatis.generator</groupId>
        <artifactId>mybatis-generator-maven-plugin</artifactId>
        <version>1.3.3</version>
        <configuration>
          <!-- 配置文件路徑 -->
          <configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile>
        </configuration>
      </plugin>
    </plugins>

generatorConfig.xml 配置文件是主要的

主要的有以下四部分:

  1. 指定數據庫連接的屬

  2. javaModelGenerator:Java模型生成器

  3. sqlMapGenerator:SQL Map的XML文件生成器

  4. javaClientGenerator:即生成 Mapper 接口

  5. 指定要逆向分析哪些表

<!DOCTYPE generatorConfiguration PUBLIC
        "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>

    <classPathEntry location="D:\projects2\HRP_ECS\WebRoot\WEB-INF\lib\mysql-connector-java-5.1.44-bin.jar"/>
    <!-- context:一組環境
       id:必選,唯一標識符,用於在生成錯誤時提示
       defaultModelType:指定生成 JavaBean 的模式
           conditional:默認,類似於層次模型,表只包含一個字段時不會生成單獨的類,該字段將合併到基本記錄類中。
           flat:所有字段生成在一個 JavaBean 中
           hierarchical:主鍵列會生成主鍵類,Blob 列也單獨生成一個類,再其餘字段一個類,類之間存在適當的繼承關係。
       targetRuntime:
           MyBatis3:默認的值,生成基於 MyBatis3.x 以上版本的內容,包括XXXBySample
           MyBatis3Simple:類似 MyBatis3,不生成 XXXBySample
           MyBatis3DynamicSql、Ibatis2Java2、Ibatis2Java5
       introspectedColumnImpl:值爲類的全限定名,用於擴展 MBG -->

    <context id="simple" targetRuntime="MyBatis3Simple">
        <!--默認false,爲true將分隔SQL關鍵字(如果它們在表中用作列名)。 MBG維護了不同數據庫的SQL關鍵字列表(SqlReservedWords),如特定關鍵字不在MBG的列表中,可使用<columnOverride>分隔-->
        <property name="autoDelimitKeywords" value="false"/>
        <!-- 指明數據庫的用於標記數據庫對象名的符號,如ORACLE是雙引號",MYSQL是反引號`
        導出的sql裏面就有這個差距,原來我還真不知道這麼回事-->
        <property name="beginningDelimiter" value="`"/>
        <property name="endingDelimiter" value="`"/>

        <!-- 生成 Java 文件的編碼格式,有關有效編碼的信息參閱 java.nio.charset.Charset -->
        <property name="javaFileEncoding" value="UTF-8"/>

        <!-- Java代碼格式化程序的全類名,該類須實現org.mybatis.generator.api.JavaFormatter,並有無參數構造函數,MBG 默認 org.mybatis.generator.api.dom.DefaultJavaFormatter -->
        <property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/>
        <!-- XML代碼格式化,須實現org.mybatis.generator.api.XmlFormatter,並有無參數構造函數,MBG 默認 org.mybatis.generator.api.dom.DefaultXmlFormatter -->
        <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/>


        <!-- 插件,讓實體類實現序列化接口 -->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin" />

        <commentGenerator>
            <!-- 指定 MBG 是否去除生成代碼中的註釋 這個如果不去除 裏面一大堆英文的註釋,沒有多大意義 -->
            <property name="suppressAllComments" value="true" />
            <!-- 指定 MBG 是否在生成的註釋中包含生成時間戳 -->
            <property name="suppressDate" value="true"/>
        </commentGenerator>

        <!-- 指定數據庫連接的屬-->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                connectionURL="jdbc:mysql://ip:3306/hrp_ecs" password="" userId=""/>


        <!-- javaTypeResolver:處理數據庫中的類型到 Java 中的類型,默認使用 org.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl
                       type:指定用戶提供的 Java Type Resolver。該類必須實現 org.mybatis.generator.api.JavaTypeResolver 接口,並必須有公共默認構造函數。可寫 DEFAULT-->
        <javaTypeResolver type="DEFAULT">
            <!-- forceBigDecimals:MBG 是否強制對 DECIMAL 和 NUMERIC 字段使用 java.math.BigDecimal,而不是在可能時替換整數類型
                    true:如果數據庫列的類型爲 DECIMAL 或 NUMERIC,則 Java 類型解析程序將始終使用 java.math.BigDecimal
                    false:默認,
                        scale > 0 或 length > 18 使用 BigDecimal
                        scale = 0 且 length [10,18] 使用 Long
                        scale = 0 且 length [5,9] 使用 Integer
                        scale = 0 且 length < 5 使用 Short -->
            <property name="forceBigDecimals" value="false"/>

            <!-- useJSR310Types:指定 MyBatis Generator 是否應強制在 DATE,TIME 和 TIMESTAMP 字段中使用 JSR-310 數據類型,而不是使用 java.util.Date
                    true:則類型將按如下方式解析:
                        DATE    java.time.LocalDate
                        TIME    java.time.LocalTime
                        TIMESTAMP    java.time.LocalDateTime
                注意:類型解析器將始終解析以下JSR-310類型,無論此屬性的值如何:
                    TIME_WITH_TIMEZONE    java.time.OffsetTime
                    TIMESTAMP_WITH_TIMEZONE    java.time.OffsetDateTime -->
            <property name="useJSR310Types" value="true"/>
        </javaTypeResolver>


        <!-- javaModelGenerator:Java模型生成器,此元素是 context 元素的必需子元素,負責:1,key類(見context的defaultModelType);2,java類;3,查詢類
            targetPackage:生成的類將被放置的包,真實的包受 enableSubPackages 屬性控制
            targetProject:目標項目,指定一個存在的本地文件系統目錄,生成的內容會放到指定目錄中,如果目錄不存在,MBG 不會自動建目錄 -->
        <javaModelGenerator targetPackage="com.hrp.sys.entity" targetProject="src/main/java">
            <!-- constructorBased:是否爲每一個生成的類創建一個全參構造方法,且構建 SQL 結果映射以使用構造函數,而不是每個字段的“setter”,屬性僅適用於MyBatis3。
                如果“immutable”屬性設置爲 true,則忽略此屬性(並強制爲 true)。默認值爲 false<table>元素中的相應屬性可覆蓋此屬性 -->
            <property name="constructorBased" value="false"/>

            <!-- enableSubPackages:是否在 targetPackage 的基礎上,根據數據庫的 schema 再生成一層 package,最終生成的類放在這個 package 下,默認爲false
                假設 MYSCHMA 中的表爲 MYTABLE,targetPackage 屬性爲“com.mycompany”。如果此屬性爲true,則類放在“com.mycompany.myschema”中。 false,則類放在“com.mycompany” -->
            <property name="enableSubPackages" value="false"/>

            <!-- immutable:是否創建不可變類,默認 false,如果爲true,MBG 會創建一個全參構造方法,類沒有“setter”方法,忽略“constructorBased”屬性
                屬性僅適用於MyBatis3,<table>元素中的相應屬性可以覆蓋此屬性。-->
            <property name="immutable" value="false"/>

            <!-- rootClass:設置一個根對象(全類名),生成的 keyClass 或者 recordClass 會繼承這個類;在Table的rootClass屬性中可以覆蓋該選項
                 注意:如果在key class或者record class中有root class相同的屬性,MBG就不會重新生成這些屬性了 -->
            <!--<property name="rootClass" value=""/>-->

            <!-- trimStrings:設置是否在getter方法中,對String類型字段調用trim()方法,默認false。可以使用<table><columnOverride>元素中的trimStrings屬性覆蓋。 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>


        <!-- sqlMapGenerator:SQL Map的XML文件生成器,如果指定sqlMapGenerator,MBG 生成SQL映射XML文件和模型classess。如果未指定sqlMapGenerator,則僅生成模型類。
            在Mybatis3之後,我們可以使用mapper.xml文件+Mapper接口(或者不用mapper接口),或者使用 Mapper 接口加 Annotation,所以,如果 javaClientGenerator 配置中配置了需要生成 XML 的話,這個元素就必須配置
            targetPackage/targetProject:同 javaModelGenerator -->
        <sqlMapGenerator targetPackage="mapper.hrp.sys" targetProject="src/main/resources">
            <!-- 同 javaModelGenerator 中的 enableSubPackages-->
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>


        <!-- javaClientGenerator:即生成 Mapper 接口,如果沒有配置該元素,那麼默認不會生成 Mapper 接口
            targetPackage/targetProject:同javaModelGenerator
            type:Java客戶端生成器,指定用戶提供的Java客戶端生成器。用戶提供的 DAO 生成器必須擴展 org.mybatis.generator.codegen.AbstractJavaClientGenerator 類,並且必須具有公共默認構造函數。
                如果 <context> targetRuntime 是 MyBatis3
                    1,ANNOTATEDMAPPER:會生成使用Mapper接口+Annotation的方式創建(SQL生成在annotation中),不會生成對應的XML
                    2,MIXEDMAPPER:使用混合配置,會生成Mapper接口,並適當添加合適的Annotation,但是XML會生成在XML中
                    3,XMLMAPPER:會生成Mapper接口,接口完全依賴XML
                如果 <context> targetRuntime 是 MyBatis3Simple
                    ANNOTATEDMAPPER/XMLMAPPER
                如果 <context> targetRuntime 是 Ibatis2Java2 或 Ibatis2Java5
                    IBATIS/GENERIC-CI/GENERIC-SI/SPRING
            implementationPackage:如果指定,實現類將放在此包中 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.hrp.sys.dao" targetProject="src/main/java" >
            <!-- enableSubPackages:控制實際包路徑的計算方式
                    true,則計算的包將是表的目錄和模式的 implementationPackage 加子包(如果存在)
                    false(默認值),則計算的包將與implementationPackage屬性中指定的完全相同。 MBG 將根據生成的包創建文件夾 -->
            <property name="enableSubPackages" value="false"/>

            <!-- exampleMethodVisibility:設置不同“ByExample”方法的可見性 - selectByExample,deleteByExample等。不指定,方法將是公共的,並在界面中聲明
                    public 默認值:實現類中生成的方法將是public,並且將在接口中聲明方法
                    private:實現類中生成的方法將是私有的,並且不會在接口中聲明方法
                    protected:實現類中生成的方法將受到保護,並且不會在接口中聲明方法
                    default:實現類中生成的方法將具有默認(包)可見性,並且不會在接口中聲明方法
                如果目標運行時爲 MyBatis3,則忽略此屬性 -->
            <property name="exampleMethodVisibility" value="public"/>

            <!-- methodNameCalculator:選擇方法名稱計算器。方法名稱計算器可用於爲 DAO 方法提供不同的名稱。可以選擇預定義值,也可以指定實現 org.mybatis.generator.api.DAOMethodNameCalculator 接口類的全類名
                    default 默認值:生成的方法名稱將非常簡單(“insert”,“updateByPrimaryKey”等)
                    extended:生成的方法名稱將包含與方法關聯的域對象的名稱(“insertWidget”,“updateWidgetByPrimaryKey”等)
                如果目標運行時爲MyBatis3,則忽略此屬性。-->
            <property name="methodNameCalculator" value="default"/>

            <!-- rootInterface:爲所有生成的接口對象指定超級接口。 可以通過在Table配置上指定rootInterface屬性來覆蓋此值
                MBG不驗證接口是否存在,或者是否是有效的Java接口。屬性的值爲全類名 -->
            <!--<property name="rootInterface" value=""/>-->

            <!--true,則帶註釋的客戶端將使用 MyBatis 中的 SqlBuilder 生成動態SQL。使用 MyBatis 3.2 及更高版本時,不推薦使用該構建器以支持新的SQL類。
                false,MBG 將生成使用新 SQL 構建器的客戶端。默認 false -->
            <property name="useLegacyBuilder" value="false"/>
        </javaClientGenerator>

        <!-- 指定要逆向分析哪些表,根據表創建 javaBean, 可用 % 匹配所有表 -->
        <table tableName="sys_user_mes" domainObjectName="sysUserMes"/>


    </context>
</generatorConfiguration>

測試類:

@Test
    public void testGenertor() throws IOException {
        SqlSession sqlSession =getSqlSessiong();
        sysUserMesMapper sysUserMesMapper = sqlSession.getMapper(sysUserMesMapper.class);
        List<sysUserMes> sysUserMesList = sysUserMesMapper.selectAll();
        System.out.println(sysUserMesList.get(0).toString());

    }

xxxExample類的使用

Example 這種方式比較便於編碼,不用拼接sql,只需要調用Example類去處理就可以類似於hibernate的DetachedCriteria

example 優缺點:
優點:

  1. 易於上手和掌握。

  2. sql寫在xml裏,便於統一管理和優化。

  3. 解除sql與程序代碼的耦合。

  4. 提供映射標籤,支持對象與數據庫的orm字段關係映射

  5. 提供對象關係映射標籤,支持對象關係組建維護

  6. 提供xml標籤,支持編寫動態sql。

缺點:

  1. sql工作量很大,尤其是字段多、關聯表多時,更是如此。

  2. sql依賴於數據庫,導致數據庫移植性差。

  3. 由於xml裏標籤id必須唯一,導致DAO中方法不支持方法重載。

  4. 字段映射標籤和對象關係映射標籤僅僅是對映射關係的描述,具體實現仍然依賴於sql。(比如配置了一對多Collection標籤,如果sql裏沒有join子表或查詢子表的話,查詢後返回的對象是不具備對象關係的,即Collection的對象爲null)

  5. DAO層過於簡單,對象組裝的工作量較大。

  6. 不支持級聯更新、級聯刪除。

  7. 編寫動態sql時,不方便調試,尤其邏輯複雜時。

8 提供的寫動態sql的xml標籤功能簡單(連struts都比不上),編寫動態sql仍然受限,且可讀性低。

  1. 若不查詢主鍵字段,容易造成查詢出的對象有“覆蓋”現象。

  2. 參數的數據類型支持不完善。(如參數爲Date類型時,容易報沒有get、set方法,需在參數上加@param)

  3. 多參數時,使用不方便,功能不夠強大。(目前支持的方法有map、對象、註解@param以及默認採用012索引位的方式)

  4. 緩存使用不當,容易產生髒數據

我個人認爲最重要的一點就是索引這樣很容易失效,如果數據量大的話很難保證效率,如果是個小項目或者demo使用Example不錯,開發比較快,方便

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