今年是2013年的殺青之日,前幾天因爲比較忙,沒有及時更新本篇的最後一篇東西,前六篇中咱們主要都是採用手動配置相關的Mybatis映射文件與相應的接口類與實體類。固然若是在真正的使用過程當中,因爲業務的複雜度,表少點的話還好若是相關業務表不少,難道咱們都要一個個這樣去配置嘛,這顯然不可能,今天就要講述怎麼經過官方提供的MyBatisGenerator生成相應的配置文件。還記得第一章中咱們要求準備的2個核心jar包嘛,一個是用於Mybatis的核心業務,另外一個mybatis-generator-core-1.3.1.jar就是這邊用到的,閒話很少少了,咱們看看怎麼樣用這個工具自動生成相應的配置。java
對於使用這個MybatisGenerator(下面簡稱MBG)配置工具咱們必須瞭解和知道的信息:mysql
MBG工具主要可以生成
sql
1. Java POJO(對應於表結構的生成),主要能夠生成知足以下條件的實體類數據庫
1.1 表的主鍵字段(若是有的話)
session
1.2 表的非主鍵字段(不包含BLOB類型的字段)mybatis
1.3 一個包含BLOB字段的表oracle
1.4 該類容許動態的select,update,delete操做app
2. 對應MBG配置裏面配置表的那些簡單CRUD操做,若是須要的選擇語句是多表聯合查詢的仍是須要本身在那個基礎上手動修改。
dom
2.1 新增記錄ide
2.2 根據主鍵更新記錄
2.3 根據動態條件更新記錄
2.4 根據主鍵刪除記錄
2.5 根據非主鍵的條件刪除記錄
2.6 根據主鍵查詢記錄
2.7 根據相應條件查詢記錄
2.8 統計相應記錄數
上述的那些語句是表結構狀況來定(例如若是這個表沒有主鍵,那MBG就不會生成相應的與主鍵相關的Mapper信息節點)
3. 若是過屢次運行生成操做,若是發現有同名的Mapper文件,MBG將自動合併相應的Mapper.xml並把他合併後的文件當成新的配置文件,
固然它不會合並掉你已經添加的那些自定義的配置文件變化信息,你能夠屢次運行而沒必要擔憂定製的內容被覆蓋。
4. Mapper配置會相應的合併,可是MBG是不會去合併相應的Java文件,包括POJO的實體類,與相應的接口類,它會採起覆蓋或者從新成
成另外個名字的新文件,若是你屢次生成了配置文件,你只有手動去合併那些已經有的改動,固然若是你運行Eclipse的插件那麼MBG就可
以自動合併相應的Java信息文件了
5. 依賴性,該MBG工具除了要求是JRE5.0以上的環境與一個JDBC驅動包,沒有其餘特別須要的依賴。
說了那麼多注意事項,咱們能夠動手開始弄了。
MBG的運行主要依靠一份XML配置文件,首先咱們能夠從新新建一個項目名爲MybatisGenerator,新建3個包分別名叫config,david.test,與david.mbg,config包主要存放真正的Mybatis裏面須要用到的配置文件,能夠把前幾章中項目中的mybatis_demo_config.xml拷貝過來放在這個目錄下,等等用做測試程序之用,david.test顧名思義就是存放如下經常使用的方法和測試程序你們也能夠吧前幾章中用到MybatisUtils工具類拿過來,新建好相應的MainFunction以備測試之用。而最後的david.mbg中就是咱們今天要配置的XML,MBG生成配置文件。
如圖所示,咱們在下面新建好一個名爲mbg_configuration.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>
<classPathEntry location="./lib/mysql-connector-java-5.1.26-bin.jar" />
<context id="mybatisDemoForMysql" targetRuntime="MyBatis3">
<!-- 控制註釋 -->
<commentGenerator>
<!-- 是否去除全部自動生成的註釋文件 -->
<property name="suppressAllComments" value="true" />
<!-- 是否去除全部自動生成的文件的時間戳,默認爲false -->
<property name="suppressDate" value="true" />
</commentGenerator>
<!-- 控制數據庫 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/mybatis_db?characterEncoding=utf8" userId="root" password="david0110" />
<javaTypeResolver>
<!-- 把jdbc中的decimal與numberic類型轉化爲integer類型 -->
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 數據庫表對應的model -->
<javaModelGenerator targetPackage="david.model" targetProject="src">
<property name="enableSubPackages" value="true" />
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- 控制Model的xmlMapper文件 -->
<sqlMapGenerator targetPackage="david.mappers" targetProject="src">
<property name="enableSubPackages" value="true" />
</sqlMapGenerator>
<!-- 控制mapper接口 -->
<javaClientGenerator targetPackage="david.inter" type="XMLMAPPER" targetProject="src">
<property name="enableSubPackages" value="true" />
<property name="methodNameCalculator" value="extended" />
</javaClientGenerator>
<!-- schema你的數據庫,tableName代表,domainObjectName對應你的javabean類名,是否生成相應的example -->
<table schema="mybatis_db" tableName="visitor" domainObjectName="Visitor" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false">
<generatedKey column="id" sqlStatement="MySql" />
<columnOverride column="name" property="visitor_name" />
<ignoreColumn column="status" delimitedColumnName="false" />
</table>
</context>
</generatorConfiguration>
你們能夠注意到其實主要是這幾個節點
<classPathEntry>=> 存放jdbc驅動包的位置,能夠採用相對路徑,也能夠採用絕對路徑,此處示例中採用了相對路徑
<context>=>對應一個數據庫下全部表的配置,能夠有多個context,一個配置mysql,一個配置oracle。
<context>節點下主要有:
<commentGenerator> => 註釋生成節點,此示例中下的2個子節點分表表明
suppressAllComments => 是否去除全部自動生成的註釋文件
suppressDate => 是否去除全部自動生成的文件的時間戳,默認爲false
<jdbcConnection> => 數據庫鏈接配置信息
<javaTypeResolver> => 把jdbc中的decimal與numberic類型轉化爲java.math.BigDeciaml形式表示
<javaModelGenerator> => 配置你的POJO實體類,targetPackage="david.model",對應你的報名,能夠本身根據實際業務取名,targetProject="src",在Eclipse環境下,指代的是項目和源文件夾的路徑通常是指src目錄,你的包都會新建在這個目錄下,若是不是Eclipse環境,此處的值應該是個實際存在的文件系統路徑,若是指定的路徑不存在會報錯,由於MBG不會本身建立相應的文件夾
<sqlMapGenerator> => 配置生成相應的實體Mapper.xml,對於Mapper3.X咱們須要把type="XMLMAPPER"
<javaClientGenerator> => 配置生成相應的接口類,對應與Mapper.xml中的一系列CRUD方法SQL語句
<table> => 配置相應的數據庫,對應的代表與想要生成領域類名(也就是實體類名字),此示例中我關閉了全部沒必要要的Example生成信息
上述全部的信息均可以去官網查閱相應文檔,或者到個人文件中去下載,裏面相應的配置說明與相關應用示例。下載文檔
配置完上面的信息,最後一步是什麼呢,咱們就是要運行這個腳本文件了,官方說明中有4種方式,第一經過命令行方式,第二,三都是經過Ant或者Maven之類的工具生成,最後一種就是經過Java代碼生成,咱們這裏就採用經過Java大麥生成的方式。在DemoRun類中添加一個生成腳本的方法以下:
private static void generateMbgConfiguration() { /* * Mybatis自帶Generator工具生成相應東西 */ List<String> warnings = new ArrayList<String>(); boolean overwrite = true; File configFile = new File("./src/david/mbg/mbg_configuration.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = null; try { config = cp.parseConfiguration(configFile); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (XMLParserException e) { // TODO Auto-generated catch block e.printStackTrace(); } DefaultShellCallback callback = new DefaultShellCallback(overwrite); try { MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); myBatisGenerator.generate(null); } catch (InvalidConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("生成Mybatis配置成功!"); }
運行後再Refresh下項目你會發現下面神奇的幫你生成了主要配置,下圖紅框部分:
最後咱們來使用下自動生成的成果吧,咱們能夠參照前六章的方式,在DemoRun中添加相應的CRUD測試方法以下:
/* * 查詢訪問者信息 */ public static void testGenerateAdd() { SqlSession session = MybatisUtils.getSqlSession(); VisitorMapper vOperation = session.getMapper(VisitorMapper.class); Visitor visitor = new Visitor(); visitor.setVisitor_name("hello2"); visitor.setEmail("helloworld2@qq.com"); visitor.setCreatetime(new Date()); int count = vOperation.insert(visitor); session.commit(); MybatisUtils.closeSession(session); MybatisUtils.showMessages(CRUD_Enum.Add, count); } /* * 查詢訪問者信息 */ public static void testGenerateQuery(int id) { SqlSession session = MybatisUtils.getSqlSession(); VisitorMapper vOperation = session.getMapper(VisitorMapper.class); Visitor visitor = vOperation.selectByPrimaryKey(id); MybatisUtils.closeSession(session); MybatisUtils.showMessages(CRUD_Enum.Query, 1); System.out.println(visitor); } public static void testGenerateDelete(int id) { SqlSession session = MybatisUtils.getSqlSession(); VisitorMapper vOperation = session.getMapper(VisitorMapper.class); int count = vOperation.deleteByPrimaryKey(id); session.commit(); MybatisUtils.closeSession(session); MybatisUtils.showMessages(CRUD_Enum.Delete, count); } public static void testGenerateUpdate(int id) { SqlSession session = MybatisUtils.getSqlSession(); VisitorMapper vOperation = session.getMapper(VisitorMapper.class); Visitor visitor = vOperation.selectByPrimaryKey(id); System.out.println(visitor); String name = visitor.getVisitor_name(); if (name.contains("update")) { visitor.setVisitor_name(name.substring(0, name.indexOf("update"))); } else { visitor.setVisitor_name(name + "update"); } int count = vOperation.updateByPrimaryKey(visitor); session.commit(); MybatisUtils.closeSession(session); MybatisUtils.showMessages(CRUD_Enum.Update, count); System.out.println(visitor); }
運行下測試程序,結果就出來了
有沒有感受使用這個幫你提升了很多效率,沒必要在爲繁瑣的配置而頭痛了,至少不用作重複的無謂的步驟了,讓這些都交給工具去作吧^0^,固然在實際的使用中咱們可能須要在生成後修改相應的類信息與接口信息名字,固然這些工做量已經不是太多了。但願今天這些內容對須要配置的同窗有所幫助。