1. 程式人生 > >Mybatis學習(七)————— mybatis的逆向工程的配置詳解

Mybatis學習(七)————— mybatis的逆向工程的配置詳解

一、什麼是逆向工程?

      簡單點說,就是通過資料庫中的單表,自動生成java程式碼。

      Mybatis官方提供了逆向工程,可以針對單表自動生成mybatis程式碼(mapper.java\mapper.xml\po類)

      企業中,逆向工程是個很常用的工具,之前我們就學習了hibernate的逆向工程,比我們手動建立對映檔案的配置資訊方便很多,

二、下載逆向工程

      jar包下載 

            

            

 

三、建立java工程

      此步驟截圖略,

 

四、新增jar包

      逆向工程jar包,mybatis-generator-core-1.3.2.jar,每個人版本不一樣,這裡不一定就完全相同

      資料庫驅動包,使用的是mysql

            

 

五、建立核心程式碼

      點選進入jar包的docs目錄下找到index.html來查詢複製核心程式碼。

              

      點選index.html進入

              

      給出核心程式碼方便日後直接複製

  List<String> warnings = new ArrayList<String>();
   boolean overwrite = true;
   File configFile = new File("generatorConfig.xml");
   ConfigurationParser cp = new ConfigurationParser(warnings);
   Configuration config = cp.parseConfiguration(configFile);
   DefaultShellCallback callback = new DefaultShellCallback(overwrite);
   MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
   myBatisGenerator.generate(null);
複製程式碼
   List<String> warnings = new ArrayList<String>();
   boolean overwrite = true;
   File configFile = new File("generatorConfig.xml");
   ConfigurationParser cp = new ConfigurationParser(warnings);
   Configuration config = cp.parseConfiguration(configFile);
   DefaultShellCallback callback = new DefaultShellCallback(overwrite);
   MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
   myBatisGenerator.generate(null);
複製程式碼

 

六、建立generatorConfig.xml配置檔案

      根據上面的核心程式碼,仔細看一下不難發現,其執行需要載入一個generatorConfig.xml配置檔案,在index.html中也有該配置檔案的模版。

                

      這個也比較清楚,下面有什麼不懂的都有做出解釋,但是我們不這樣直接複製,我給出一份好的,有註釋的,日後直接複製改點資料即可

                

                

      在我上面框出來的地方就是需要修改的地方,根據自己的實際情況來進行修改,並且這裡的配置檔案是將資料庫中的user、orders、orderdetail、items這四張表進行逆向,配置檔案中需要指定需要逆向生成的表的名稱


<?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="testTables" targetRuntime="MyBatis3">
        <commentGenerator>
            <!-- 是否去除自動生成的註釋 true:是 : false:否 -->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!--資料庫連線的資訊:驅動類、連線地址、使用者名稱、密碼 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
            connectionURL="jdbc:mysql://localhost:3306/test" userId="root"
            password="root">
        </jdbcConnection>
        
        <!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver" connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg" 
            userId="yycg" password="yycg"> </jdbcConnection> -->

        <!-- 預設false,把JDBC DECIMAL 和 NUMERIC 型別解析為 Integer,為 true時把JDBC DECIMAL 
            和 NUMERIC 型別解析為java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!-- targetProject:生成PO類的位置 -->
        <javaModelGenerator targetPackage="com.wuhao.mt.domain"
            targetProject=".\src">
            <!-- enableSubPackages:是否讓schema作為包的字尾 -->
            <property name="enableSubPackages" value="false" />
            <!-- 從資料庫返回的值被清理前後的空格 -->
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- targetProject:mapper對映檔案生成的位置 -->
        <sqlMapGenerator targetPackage="com.wuhao.mt.mapper"
            targetProject=".\src">
            <!-- enableSubPackages:是否讓schema作為包的字尾 -->
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>
        <!-- targetPackage:mapper介面生成的位置 -->
        <javaClientGenerator type="XMLMAPPER"
            targetPackage="com.wuhao.mt.mapper" targetProject=".\src">
            <!-- enableSubPackages:是否讓schema作為包的字尾 -->
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>
        <!-- 指定資料庫表 -->
        <table tableName="user"></table>
        <table tableName="orders"></table>
        <table tableName="orderdetail"></table>
        <table tableName="items"></table>
    </context>
</generatorConfiguration>

複製程式碼
<?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="testTables" targetRuntime="MyBatis3">
        <commentGenerator>
            <!-- 是否去除自動生成的註釋 true:是 : false:否 -->
            <property name="suppressAllComments" value="true" />
        </commentGenerator>
        <!--資料庫連線的資訊:驅動類、連線地址、使用者名稱、密碼 -->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
            connectionURL="jdbc:mysql://localhost:3306/test" userId="root"
            password="root">
        </jdbcConnection>
        
        <!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver" connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg" 
            userId="yycg" password="yycg"> </jdbcConnection> -->

        <!-- 預設false,把JDBC DECIMAL 和 NUMERIC 型別解析為 Integer,為 true時把JDBC DECIMAL 
            和 NUMERIC 型別解析為java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false" />
        </javaTypeResolver>

        <!-- targetProject:生成PO類的位置 -->
        <javaModelGenerator targetPackage="com.wuhao.mt.domain"
            targetProject=".\src">
            <!-- enableSubPackages:是否讓schema作為包的字尾 -->
            <property name="enableSubPackages" value="false" />
            <!-- 從資料庫返回的值被清理前後的空格 -->
            <property name="trimStrings" value="true" />
        </javaModelGenerator>
        <!-- targetProject:mapper對映檔案生成的位置 -->
        <sqlMapGenerator targetPackage="com.wuhao.mt.mapper"
            targetProject=".\src">
            <!-- enableSubPackages:是否讓schema作為包的字尾 -->
            <property name="enableSubPackages" value="false" />
        </sqlMapGenerator>
        <!-- targetPackage:mapper介面生成的位置 -->
        <javaClientGenerator type="XMLMAPPER"
            targetPackage="com.wuhao.mt.mapper" targetProject=".\src">
            <!-- enableSubPackages:是否讓schema作為包的字尾 -->
            <property name="enableSubPackages" value="false" />
        </javaClientGenerator>
        <!-- 指定資料庫表 -->
        <table tableName="user"></table>
        <table tableName="orders"></table>
        <table tableName="orderdetail"></table>
        <table tableName="items"></table>
    </context>
</generatorConfiguration>
複製程式碼

      注意核心程式碼中載入generatorConfig.xml的配置檔案的位置需要寫正確,根據你自己的存放位置進行相應的修改,並不是固定的。

 

七、目錄結構

      完成核心程式碼和其配置檔案之後的工程就成這樣了,然後直接執行核心程式碼就會自動幫我們從資料庫中指定的表生成mybatis的mapper類。

                

      執行Generator.java  

                

      

      這裡需要注意一個問題,點選執行之後,就已經幫我們生成好了對應的類,但是我們需要手動重新整理專案才看得見,有些人就會覺得看不見,以為沒有生效,然後又第二次執行核心程式碼,這裡就會出現一個很嚴重的問題,[Mapper.xml檔案已經存在時,如果進行重新生成則mapper.xml檔案時,內容不被覆蓋而是進行內容追加,結果導致mybatis解析失敗]

      解決辦法:刪除生成的所有類和mapper.xml,重新在執行一遍即可。

    

      生成之後的目錄

                

      其他都不用說,說兩個地方

        第一:mapper介面報錯了,這裡不用管,報的錯的原因是缺少mybatis核心的jar包,和mapper介面中卻用到了這些類,所以就會報錯,

          解決:加入所需要jar包錯誤消失,但是我們不會這樣做,因為這個專案就是用來生成mapper相關類的,加入jar包沒什麼用,多此一舉,我們需要用的時候將其加入我們開發時的專案中,就不會在報錯了。

        第二:生成的持久化物件中,多了一個xxxExample.java類,這個類是用來[構造複雜的篩選條件],通俗點講就是[專門用來封裝自定義查詢條件],等會會介紹他的使用方法。

 

八、測試

      將我們逆向工程所生成的mapper相關的類和介面等東西都加入到我們開發的專案中來,進來實驗,這裡就不過多陳述了,不會的話,就看前幾章節的mybatis的構建和使用

      目錄

                

      這裡我們將Items相關的類,都加入到與spring整合的專案中去,框起來的就是我們從逆向工程中獲取到的。注意,逆向工程就是使用mapper方式進行開發,而不是dao方式

      測試,OrderMapperTest.java    

                


 //問題描述:查詢出Items中name中有"記"字的記錄,模糊查詢,使用查詢條件(xxxExample)
        //獲取applicationContext.xml配置並載入
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        //獲取ItemsMapper程式碼物件
        ItemsMapper im = (ItemsMapper) ac.getBean("itemsMapper");    
        //封裝查詢條件的物件在該類(ItemsExample)中,所以先構造該物件
        ItemsExample ie = new ItemsExample();
        //通過ItemsExample的物件獲取封裝查詢條件的物件Criteria
        Criteria c = ie.createCriteria();
        //構建查詢條件,這裡使用方法將其內部實現封裝了,其實做的事情就是在
        //sql語句的where後面加入: and name like "%記%"
        c.andNameLike("%記%");
        //通過im將查詢條件傳送進去。
        List<Items> list = im.selectByExample(ie);    
        //查詢出name為筆記本這條記錄
        System.out.println(list.get(0).getName());

複製程式碼
        //問題描述:查詢出Items中name中有"記"字的記錄,模糊查詢,使用查詢條件(xxxExample)
        //獲取applicationContext.xml配置並載入
        ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
        //獲取ItemsMapper程式碼物件
        ItemsMapper im = (ItemsMapper) ac.getBean("itemsMapper");    
        //封裝查詢條件的物件在該類(ItemsExample)中,所以先構造該物件
        ItemsExample ie = new ItemsExample();
        //通過ItemsExample的物件獲取封裝查詢條件的物件Criteria
        Criteria c = ie.createCriteria();
        //構建查詢條件,這裡使用方法將其內部實現封裝了,其實做的事情就是在
        //sql語句的where後面加入: and name like "%記%"
        c.andNameLike("%記%");
        //通過im將查詢條件傳送進去。
        List<Items> list = im.selectByExample(ie);    
        //查詢出name為筆記本這條記錄
        System.out.println(list.get(0).getName());
複製程式碼

 

                                  

 

九、總結

      這裡就將mybatis的逆向工程給講完了,一點都不難,一步步實現下去即可,關鍵是後的多的那個xxxExample類可能大家有一點不理解,下一篇文章會將其講解清楚,詳細介紹一下這個類。這一節就學會如何建立逆向工程即可。