Java的MyBatis框架中MyBatis Generator代碼生成器的用法
關(guān)于Mybatis Generator
MyBatis Generator (MBG) 是一個(gè)Mybatis的代碼生成器 MyBatis 和 iBATIS. 他可以生成Mybatis各個(gè)版本的代碼,和iBATIS 2.2.0版本以后的代碼。 他可以內(nèi)省數(shù)據(jù)庫的表(或多個(gè)表)然后生成可以用來訪問(多個(gè))表的基礎(chǔ)對(duì)象。 這樣和數(shù)據(jù)庫表進(jìn)行交互時(shí)不需要?jiǎng)?chuàng)建對(duì)象和配置文件。 MBG的解決了對(duì)數(shù)據(jù)庫操作有最大影響的一些簡(jiǎn)單的CRUD(插入,查詢,更新,刪除)操作。 您仍然需要對(duì)聯(lián)合查詢和存儲(chǔ)過程手寫SQL和對(duì)象。
MyBatis Generator 會(huì)生成:
匹配表結(jié)構(gòu)的Java POJO,可能包括:
- 一個(gè)和表主鍵匹配的類(如果存在主鍵[注:只有聯(lián)合主鍵會(huì)有])
- 一個(gè)包含了非主鍵字段的類(BLOB字段除外[注:單字段做主鍵時(shí)這里會(huì)包含])
- 一個(gè)包含了BLOB字段的類 (如果表包含了BLOB字段)
- 一個(gè)允許動(dòng)態(tài)查詢、更新和刪除的類[注:指的是Example查詢]
這些類之間會(huì)有適當(dāng)?shù)睦^承關(guān)系。 請(qǐng)注意可以配置生成器來生成不同類型的 POJO 的層次結(jié)構(gòu)。 例如,如果您愿意您可能會(huì)選擇針對(duì)每個(gè)表生成一個(gè)單獨(dú)的實(shí)體對(duì)象。
MyBatis/iBATIS 兼容 SQL 映射 XML 文件。MBG 在配置中為每個(gè)表簡(jiǎn)單的 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ù)表的結(jié)構(gòu),生成的這些語句會(huì)有不同的變化(例如,如果表中沒有主鍵,那么 MBG 將不會(huì)生成update by primary key方法)。
Java客戶端類會(huì)適當(dāng)?shù)氖褂蒙厦娴膶?duì)象,生成Java客戶端類時(shí)可選的。 MBG會(huì)為MyBatis 3.x生成如下客戶端類:
一個(gè)可以和MyBatis 3.x一起使用的mapper接口類
MBG會(huì)為iBATIS 2.x生成如下的客戶端類:
符合 Spring 框架的DAO類。
只使用iBATIS SQL映射API的DAO。 這種DAO可以通過下面兩種方式生成:提供SqlMapClient通過構(gòu)造方法或者setter注入。
符合iBATIS DAO 框架的DAO (iBATIS可選的一部分,這一框架已經(jīng)過時(shí),我們建議您使用Spring框架替代)。
MyBatis generator 可以在迭代開發(fā)環(huán)境中良好的運(yùn)行, 在持續(xù)的構(gòu)建環(huán)境中作為一個(gè)ant任務(wù)或maven插件。 運(yùn)行MBG時(shí)要記住以下重要的事:
MBG 會(huì)自動(dòng)合并已經(jīng)存在并且和新生成的文件重名的 XML。MBG 不會(huì)覆蓋您對(duì)已經(jīng)生成xml所做的修改。 您可以反復(fù)的運(yùn)行而不必?fù)?dān)心失去您自定義的更改。 MBG 將取代所有以前運(yùn)行中生成的 XML 元素。
MBG 不會(huì) 合并 Java 文件,他可以覆蓋已經(jīng)存在的文件或者保存新生成的文件為一個(gè)不同的唯一的名字。 您可以手動(dòng)合并這些更改。 當(dāng)您使用Eclipse 插件時(shí), MBG 可以自動(dòng)合并 Java 文件.
基本用法
MBG的運(yùn)行主要依靠一份XML配置文件,首先我們可以重新新建一個(gè)項(xiàng)目名為MybatisGenerator,新建3個(gè)包分別名叫config,david.test,與david.mbg,config包主要存放真正的Mybatis里面需要用到的配置文件,可以把前幾章中項(xiàng)目中的mybatis_demo_config.xml拷貝過來放在這個(gè)目錄下,等等用作測(cè)試程序之用,david.test顧名思義就是存放以下常用的方法和測(cè)試程序大家也可以吧前幾章中用到MybatisUtils工具類拿過來,新建好相應(yīng)的MainFunction以備測(cè)試之用。而最后的david.mbg中就是我們今天要配置的XML,MBG生成配置文件。
如圖所示,我們?cè)谙旅嫘陆ê靡粋€(gè)名為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> <!-- 是否去除所有自動(dòng)生成的注釋文件 --> <property name="suppressAllComments" value="true" /> <!-- 是否去除所有自動(dòng)生成的文件的時(shí)間戳,默認(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ù)庫表對(duì)應(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對(duì)應(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í)主要是這幾個(gè)節(jié)點(diǎn)
<classPathEntry>=> 存放jdbc驅(qū)動(dòng)包的位置,可以采用相對(duì)路徑,也可以采用絕對(duì)路徑,此處示例中采用了相對(duì)路徑
<context>=>對(duì)應(yīng)一個(gè)數(shù)據(jù)庫下所有表的配置,可以有多個(gè)context,一個(gè)配置mysql,一個(gè)配置oracle。
<context>節(jié)點(diǎn)下主要有:
<commentGenerator> => 注釋生成節(jié)點(diǎn),此示例中下的2個(gè)子節(jié)點(diǎn)分表代表
suppressAllComments => 是否去除所有自動(dòng)生成的注釋文件
suppressDate => 是否去除所有自動(dòng)生成的文件的時(shí)間戳,默認(rèn)為false
<jdbcConnection> => 數(shù)據(jù)庫連接配置信息
<javaTypeResolver> => 把jdbc中的decimal與numberic類型轉(zhuǎn)化為java.math.BigDeciaml形式表示
<javaModelGenerator> => 配置你的POJO實(shí)體類,targetPackage="david.model",對(duì)應(yīng)你的報(bào)名,可以自己根據(jù)實(shí)際業(yè)務(wù)取名,targetProject="src",在Eclipse環(huán)境下,指代的是項(xiàng)目和源文件夾的路徑一般是指src目錄,你的包都會(huì)新建在這個(gè)目錄下,如果不是Eclipse環(huán)境,此處的值應(yīng)該是個(gè)實(shí)際存在的文件系統(tǒng)路徑,如果指定的路徑不存在會(huì)報(bào)錯(cuò),因?yàn)镸BG不會(huì)自己創(chuàng)建相應(yīng)的文件夾
<sqlMapGenerator> => 配置生成相應(yīng)的實(shí)體Mapper.xml,對(duì)于Mapper3.X我們需要把type="XMLMAPPER"
<javaClientGenerator> => 配置生成相應(yīng)的接口類,對(duì)應(yīng)與Mapper.xml中的一系列CRUD方法SQL語句
<table> => 配置相應(yīng)的數(shù)據(jù)庫,對(duì)應(yīng)的表明與想要生成領(lǐng)域類名(也就是實(shí)體類名字),此示例中我關(guān)閉了所有不必要的Example生成信息
上述所有的信息都可以去官網(wǎng)查閱相應(yīng)文檔,或者到我的文件中去下載,里面相應(yīng)的配置說明與相關(guān)應(yīng)用示例。下載文檔
配置完上面的信息,最后一步是什么呢,我們就是要運(yùn)行這個(gè)腳本文件了,官方說明中有4種方式,第一通過命令行方式,第二,三都是通過Ant或者M(jìn)aven之類的工具生成,最后一種就是通過Java代碼生成,我們這里就采用通過Java大麥生成的方式。在DemoRun類中添加一個(gè)生成腳本的方法如下:
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)目你會(huì)發(fā)現(xiàn)下面神奇的幫你生成了主要配置,下圖紅框部分:
最后我們來使用下自動(dòng)生成的成果吧,我們可以參照前六章的方式,在DemoRun中添加相應(yīng)的CRUD測(cè)試方法如下:
/* * 查詢?cè)L問者信息 */ 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); } /* * 查詢?cè)L問者信息 */ 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)行下測(cè)試程序,結(jié)果就出來了
有沒有感覺使用這個(gè)幫你提高了不少效率,不必在為繁瑣的配置而頭痛了,至少不用做重復(fù)的無謂的步驟了,讓這些都交給工具去做吧^0^,當(dāng)然在實(shí)際的使用中我們可能需要在生成后修改相應(yīng)的類信息與接口信息名字,當(dāng)然這些工作量已經(jīng)不是太多了。希望今天這些內(nèi)容對(duì)需要配置的同學(xué)有所幫助。
相關(guān)文章
SpringBoot使用Sa-Token實(shí)現(xiàn)賬號(hào)封禁、分類封禁、階梯封禁的示例代碼
本文主要介紹了SpringBoot使用Sa-Token實(shí)現(xiàn)賬號(hào)封禁、分類封禁、階梯封禁的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07Java Chassis3過載狀態(tài)下的快速失敗解決分析
本文解密了Java Chassis 3快速失敗相關(guān)的機(jī)制和背后故事,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2024-01-01java中ThreadPoolExecutor常識(shí)匯總
這篇文章主要介紹了java中ThreadPoolExecutor常識(shí)匯總,線程池技術(shù)在并發(fā)時(shí)經(jīng)常會(huì)使用到,java中的線程池的使用是通過調(diào)用ThreadPoolExecutor來實(shí)現(xiàn)的,需要的朋友可以參考下2019-06-06親身體驗(yàn)Intellij?Idea從卡頓到順暢全過程
這篇文章主要介紹了親身體驗(yàn)Intellij?Idea從卡頓到順暢全過程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09詳談java編碼互轉(zhuǎn)(application/x-www-form-urlencoded)
下面小編就為大家?guī)硪黄斦刯ava編碼互轉(zhuǎn)(application/x-www-form-urlencoded)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07springboot 如何設(shè)置端口號(hào)和添加項(xiàng)目名
這篇文章主要介紹了springboot設(shè)置端口號(hào)和添加項(xiàng)目名的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08Hadoop運(yùn)行時(shí)遇到j(luò)ava.io.FileNotFoundException錯(cuò)誤的解決方法
今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著Hadoop運(yùn)行時(shí)遇到j(luò)ava.io.FileNotFoundException錯(cuò)誤展開,文中有非常詳細(xì)的解決方法,需要的朋友可以參考下2021-06-06java語言自行實(shí)現(xiàn)ULID過程底層原理詳解
這篇文章主要為大家介紹了java語言自行實(shí)現(xiàn)ULID過程底層原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10