今年是2013年的殺青之日,前幾天由于比較忙,沒有及時更新本篇的最后一篇東西,前六篇中我們主要都是采用手動配置相關(guān)的Mybatis映射文件與相 應(yīng)的接口類與實(shí)體類。當(dāng)然如果在真正的使用過程中,由于業(yè)務(wù)的復(fù)雜度,表少點(diǎn)的話還好如果相關(guān)業(yè)務(wù)表很多,難道我們都要一個個這樣去配置嘛,這顯然不可 能,今天就要講述怎么通過官方提供的MyBatisGenerator生成相應(yīng)的配置文件。還記得第一章中我們要求準(zhǔn)備的2個核心jar包嘛,一個是用于 Mybatis的核心業(yè)務(wù),另一個mybatis-generator-core-1.3.1.jar就是這邊用到的,閑話不多少了,我們看看怎么樣用這 個工具自動生成相應(yīng)的配置。
對于使用這個MybatisGenerator(下面簡稱MBG)配置工具我們必須了解和知道的信息:
MBG工具主要能夠生成
1. Java POJO(對應(yīng)于表結(jié)構(gòu)的生成),主要可以生成滿足如下條件的實(shí)體類
1.1 表的主鍵字段(如果有的話)
1.2 表的非主鍵字段(不包含BLOB類型的字段)
1.3 一個包含BLOB字段的表
1.4 該類允許動態(tài)的select,update,delete操作
2. 對應(yīng)MBG配置里面配置表的那些簡單CRUD操作,如果需要的選擇語句是多表聯(lián)合查詢的還是需要自己在那個基礎(chǔ)上手動修改。
2.1 新增記錄
2.2 根據(jù)主鍵更新記錄
2.3 根據(jù)動態(tài)條件更新記錄
2.4 根據(jù)主鍵刪除記錄
2.5 根據(jù)非主鍵的條件刪除記錄
2.6 根據(jù)主鍵查詢記錄
2.7 根據(jù)相應(yīng)條件查詢記錄
2.8 統(tǒng)計(jì)相應(yīng)記錄數(shù)
上述的那些語句是表結(jié)構(gòu)情況來定(例如如果這個表沒有主鍵,那MBG就不會生成相應(yīng)的與主鍵相關(guān)的Mapper信息節(jié)點(diǎn))
3. 如果過多次運(yùn)行生成操作,如果發(fā)現(xiàn)有同名的Mapper文件,MBG將自動合并相應(yīng)的Mapper.xml并把他合并后的文件當(dāng)成新的配置文件,
當(dāng)然它不會合并掉你已經(jīng)添加的那些自定義的配置文件變化信息,你可以多次運(yùn)行而不必?fù)?dān)心定制的內(nèi)容被覆蓋。
4. Mapper配置會相應(yīng)的合并,但是MBG是不會去合并相應(yīng)的Java文件,包括POJO的實(shí)體類,與相應(yīng)的接口類,它會采取覆蓋或者重新成
成另外個名字的新文件,如果你多次生成了配置文件,你只有手動去合并那些已經(jīng)有的改動,當(dāng)然如果你運(yùn)行Eclipse的插件那么MBG就可
以自動合并相應(yīng)的Java信息文件了
5. 依賴性,該MBG工具除了要求是JRE5.0以上的環(huán)境與一個JDBC驅(qū)動包,沒有其他特別需要的依賴。
說了那么多注意事項(xiàng),我們可以動手開始弄了。
MBG的運(yùn)行主要依靠一份XML配置文件,首先我們可以重新新建一個項(xiàng)目名為MybatisGenerator,新建3個包分別名叫 config,david.test,與david.mbg,config包主要存放真正的Mybatis里面需要用到的配置文件,可以把前幾章中項(xiàng)目中 的mybatis_demo_config.xml拷貝過來放在這個目錄下,等等用作測試程序之用,david.test顧名思義就是存放以下常用的方法 和測試程序大家也可以吧前幾章中用到MybatisUtils工具類拿過來,新建好相應(yīng)的MainFunction以備測試之用。而最后的david.mbg中就是我們今天要配置的XML,MBG生成配置文件。

如圖所示,我們在下面新建好一個名為mbg_configuration.xml的配置文件,詳情如下:

MBG配置文件
<?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" />
<!-- 是否去除所有自動生成的文件的時間戳,默認(rèn)為false -->
<property name="suppressDate" value="true" />
</commentGenerator>
<!-- 控制數(shù)據(jù)庫 -->
<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類型轉(zhuǎn)化為integer類型 -->
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- 數(shù)據(jù)庫表對應(yīng)的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你的數(shù)據(jù)庫,tableName表明,domainObjectName對應(yīng)你的javabean類名,是否生成相應(yīng)的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> 大家可以注意到其實(shí)主要是這幾個節(jié)點(diǎn)
<classPathEntry>=> 存放jdbc驅(qū)動包的位置,可以采用相對路徑,也可以采用絕對路徑,此處示例中采用了相對路徑
<context>=>對應(yīng)一個數(shù)據(jù)庫下所有表的配置,可以有多個context,一個配置mysql,一個配置oracle。
<context>節(jié)點(diǎn)下主要有:
<commentGenerator> => 注釋生成節(jié)點(diǎn),此示例中下的2個子節(jié)點(diǎn)分表代表
suppressAllComments => 是否去除所有自動生成的注釋文件
suppressDate => 是否去除所有自動生成的文件的時間戳,默認(rèn)為false
<jdbcConnection> => 數(shù)據(jù)庫連接配置信息
<javaTypeResolver> => 把jdbc中的decimal與numberic類型轉(zhuǎn)化為java.math.BigDeciaml形式表示
<javaModelGenerator> => 配置你的POJO實(shí)體類,targetPackage="david.model",對應(yīng)你的報(bào)名,可以自己根據(jù)實(shí)際業(yè)務(wù)取 名,targetProject="src",在Eclipse環(huán)境下,指代的是項(xiàng)目和源文件夾的路徑一般是指src目錄,你的包都會新建在這個目錄下, 如果不是Eclipse環(huán)境,此處的值應(yīng)該是個實(shí)際存在的文件系統(tǒng)路徑,如果指定的路徑不存在會報(bào)錯,因?yàn)镸BG不會自己創(chuàng)建相應(yīng)的文件夾
<sqlMapGenerator> => 配置生成相應(yīng)的實(shí)體Mapper.xml,對于Mapper3.X我們需要把type="XMLMAPPER"
<javaClientGenerator> => 配置生成相應(yīng)的接口類,對應(yīng)與Mapper.xml中的一系列CRUD方法SQL語句
<table> => 配置相應(yīng)的數(shù)據(jù)庫,對應(yīng)的表明與想要生成領(lǐng)域類名(也就是實(shí)體類名字),此示例中我關(guān)閉了所有不必要的Example生成信息
上述所有的信息都可以去官網(wǎng)查閱相應(yīng)文檔,或者到我的文件中去下載,里面相應(yīng)的配置說明與相關(guān)應(yīng)用示例。下載文檔
配 置完上面的信息,最后一步是什么呢,我們就是要運(yùn)行這個腳本文件了,官方說明中有4種方式,第一通過命令行方式,第二,三都是通過Ant或者M(jìn)aven之 類的工具生成,最后一種就是通過Java代碼生成,我們這里就采用通過Java大麥生成的方式。在DemoRun類中添加一個生成腳本的方法如下:

腳本生成方法
private static void generateMbgConfiguration() {
/*
* Mybatis自帶Generator工具生成相應(yīng)東西
*/
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配置成功!");
} 運(yùn)行后再Refresh下項(xiàng)目你會發(fā)現(xiàn)下面神奇的幫你生成了主要配置,下圖紅框部分:

最后我們來使用下自動生成的成果吧,我們可以參照前六章的方式,在DemoRun中添加相應(yīng)的CRUD測試方法如下:

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);
}運(yùn)行下測試程序,結(jié)果就出來了

有 沒有感覺使用這個幫你提高了不少效率,不必在為繁瑣的配置而頭痛了,至少不用做重復(fù)的無謂的步驟了,讓這些都交給工具去做吧^0^,當(dāng)然在實(shí)際的使用中我 們可能需要在生成后修改相應(yīng)的類信息與接口信息名字,當(dāng)然這些工作量已經(jīng)不是太多了。希望今天這些內(nèi)容對需要配置的同學(xué)有所幫助。
Mybatis系列用例源碼下載
MybatisGenerator用例源碼下載