關于Mybatis Generator
MyBatis Generator (MBG) 是一個Mybatis的代碼生成器 MyBatis 和 iBATIS. 他可以生成Mybatis各個版本的代碼,和iBATIS 2.2.0版本以后的代碼。 他可以內省數(shù)據(jù)庫的表(或多個表)然后生成可以用來訪問(多個)表的基礎對象。 這樣和數(shù)據(jù)庫表進行交互時不需要創(chuàng)建對象和配置文件。 MBG的解決了對數(shù)據(jù)庫操作有最大影響的一些簡單的CRUD(插入,查詢,更新,刪除)操作。 您仍然需要對聯(lián)合查詢和存儲過程手寫SQL和對象。
MyBatis Generator 會生成:
匹配表結構的Java POJO,可能包括:
- 一個和表主鍵匹配的類(如果存在主鍵[注:只有聯(lián)合主鍵會有])
- 一個包含了非主鍵字段的類(BLOB字段除外[注:單字段做主鍵時這里會包含])
- 一個包含了BLOB字段的類 (如果表包含了BLOB字段)
- 一個允許動態(tài)查詢、更新和刪除的類[注:指的是Example查詢]
這些類之間會有適當?shù)睦^承關系。 請注意可以配置生成器來生成不同類型的 POJO 的層次結構。 例如,如果您愿意您可能會選擇針對每個表生成一個單獨的實體對象。
MyBatis/iBATIS 兼容 SQL 映射 XML 文件。MBG 在配置中為每個表簡單的 CRUD 操作生成 SQL。 生成的 SQL 語句包括:
- insert (插入)
- update by primary key (根據(jù)主鍵更新記錄)
- update by example (根據(jù)條件更新記錄)
- delete by primary key (根據(jù)主鍵刪除記錄)
- delete by example (根據(jù)條件刪除記錄)
- select by primary key (根據(jù)主鍵查詢記錄)
- select by example (根據(jù)條件查詢記錄集)
- count by example (根據(jù)條件查詢記錄總數(shù))
根據(jù)表的結構,生成的這些語句會有不同的變化(例如,如果表中沒有主鍵,那么 MBG 將不會生成update by primary key方法)。
Java客戶端類會適當?shù)氖褂蒙厦娴膶ο螅蒍ava客戶端類時可選的。 MBG會為MyBatis 3.x生成如下客戶端類:
一個可以和MyBatis 3.x一起使用的mapper接口類
MBG會為iBATIS 2.x生成如下的客戶端類:
符合 Spring 框架的DAO類。
只使用iBATIS SQL映射API的DAO。 這種DAO可以通過下面兩種方式生成:提供SqlMapClient通過構造方法或者setter注入。
符合iBATIS DAO 框架的DAO (iBATIS可選的一部分,這一框架已經(jīng)過時,我們建議您使用Spring框架替代)。
MyBatis generator 可以在迭代開發(fā)環(huán)境中良好的運行, 在持續(xù)的構建環(huán)境中作為一個ant任務或maven插件。 運行MBG時要記住以下重要的事:
MBG 會自動合并已經(jīng)存在并且和新生成的文件重名的 XML。MBG 不會覆蓋您對已經(jīng)生成xml所做的修改。 您可以反復的運行而不必擔心失去您自定義的更改。 MBG 將取代所有以前運行中生成的 XML 元素。
MBG 不會 合并 Java 文件,他可以覆蓋已經(jīng)存在的文件或者保存新生成的文件為一個不同的唯一的名字。 您可以手動合并這些更改。 當您使用Eclipse 插件時, MBG 可以自動合并 Java 文件.
基本用法
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的配置文件,詳情如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
<? 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 > <!-- 控制數(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類型轉化為integer類型 --> < property name = "forceBigDecimals" value = "false" /> </ javaTypeResolver > <!-- 數(shù)據(jù)庫表對應的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對應你的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 > |
大家可以注意到其實主要是這幾個節(jié)點
<classPathEntry>=> 存放jdbc驅動包的位置,可以采用相對路徑,也可以采用絕對路徑,此處示例中采用了相對路徑
<context>=>對應一個數(shù)據(jù)庫下所有表的配置,可以有多個context,一個配置mysql,一個配置oracle。
<context>節(jié)點下主要有:
<commentGenerator> => 注釋生成節(jié)點,此示例中下的2個子節(jié)點分表代表
suppressAllComments => 是否去除所有自動生成的注釋文件
suppressDate => 是否去除所有自動生成的文件的時間戳,默認為false
<jdbcConnection> => 數(shù)據(jù)庫連接配置信息
<javaTypeResolver> => 把jdbc中的decimal與numberic類型轉化為java.math.BigDeciaml形式表示
<javaModelGenerator> => 配置你的POJO實體類,targetPackage="david.model",對應你的報名,可以自己根據(jù)實際業(yè)務取名,targetProject="src",在Eclipse環(huán)境下,指代的是項目和源文件夾的路徑一般是指src目錄,你的包都會新建在這個目錄下,如果不是Eclipse環(huán)境,此處的值應該是個實際存在的文件系統(tǒng)路徑,如果指定的路徑不存在會報錯,因為MBG不會自己創(chuàng)建相應的文件夾
<sqlMapGenerator> => 配置生成相應的實體Mapper.xml,對于Mapper3.X我們需要把type="XMLMAPPER"
<javaClientGenerator> => 配置生成相應的接口類,對應與Mapper.xml中的一系列CRUD方法SQL語句
<table> => 配置相應的數(shù)據(jù)庫,對應的表明與想要生成領域類名(也就是實體類名字),此示例中我關閉了所有不必要的Example生成信息
上述所有的信息都可以去官網(wǎng)查閱相應文檔,或者到我的文件中去下載,里面相應的配置說明與相關應用示例。下載文檔
配置完上面的信息,最后一步是什么呢,我們就是要運行這個腳本文件了,官方說明中有4種方式,第一通過命令行方式,第二,三都是通過Ant或者Maven之類的工具生成,最后一種就是通過Java代碼生成,我們這里就采用通過Java大麥生成的方式。在DemoRun類中添加一個生成腳本的方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
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下項目你會發(fā)現(xiàn)下面神奇的幫你生成了主要配置,下圖紅框部分:
最后我們來使用下自動生成的成果吧,我們可以參照前六章的方式,在DemoRun中添加相應的CRUD測試方法如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
/* * 查詢訪問者信息 */ public static void testGenerateAdd() { SqlSession session = MybatisUtils.getSqlSession(); VisitorMapper vOperation = session.getMapper(VisitorMapper.class); Visitor visitor = new Visitor(); visitor.setVisitor_name("hello2"); visitor.setEmail("[email protected]"); 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^,當然在實際的使用中我們可能需要在生成后修改相應的類信息與接口信息名字,當然這些工作量已經(jīng)不是太多了。希望今天這些內容對需要配置的同學有所幫助。