今天我們來搞搞mybatis的逆向工程客蹋,那么我們先看看啥是mybatis的逆向工程。
簡單點(diǎn)說孽江,就是通過數(shù)據(jù)庫中的單表讶坯,自動(dòng)生成java代碼。
Mybatis官方提供了逆向工程岗屏,可以針對(duì)單表自動(dòng)生成mybatis代碼(mapper.java\mapper.xml\po類)
也就是說辆琅,我們可以通過mybatis逆向工程生成dao,pojo担汤,mapper.xml這些東東涎跨,節(jié)省我們寫這些代碼的時(shí)間,可以把更多的時(shí)間花在業(yè)務(wù)上崭歧。哈哈隅很,盤它。
這里我使用mysql演示率碾,相信其他關(guān)系數(shù)據(jù)庫也類似吧J逵(注意我使用的springboot哦,沒辦法所宰,我已經(jīng)徹底愛上它ˋωˊ)
第一步:
maven的pom文件加入依賴
<!--mybatis 的starter 必須的吧-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!--mybatis的逆向工程生成器-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<!--maven的mybatis逆向工程插件绒尊,有了它雙擊就開始盤 ,簡直不要太方便仔粥,仔細(xì)喲婴谱,這是個(gè)插件,要放在插件里面躯泰,別寫到依賴?yán)锩媪恕?->
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.7</version>
<configuration>
<!--這里注意了喲谭羔,這里是mybatis逆向工程的配置文件的位置,1 這個(gè)文件必須存在麦向,2 這個(gè)路徑要準(zhǔn)確瘟裸,仔細(xì)看,這個(gè)路徑是從項(xiàng)目下src開始诵竭。(其他細(xì)節(jié)遇到再百度吧话告,比如不寫這個(gè)會(huì)怎樣?)-->
<configurationFile>src/main/resources/config/generatorConfig.xml</configurationFile>
<!--允許移動(dòng)生成的文件 -->
<verbose>true</verbose>
<!-- 是否覆蓋 -->
<overwrite>true</overwrite>
</configuration>
</plugin>
上邊寫的generatorConfig.xml這個(gè)文件卵慰,看看怎么寫的吧I彻(我不保證一定準(zhǔn)確哈,復(fù)制需謹(jǐn)慎:茄唷)
<?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>
<!--這個(gè)是你springboot的配置文件棠绘,它會(huì)加載spring的配置-->
<properties resource="application.yml"/>
<!-- 必須要有這個(gè) mysql驅(qū)動(dòng)的位置 這個(gè)是MySQL連接的jar包,你需要指定你自己計(jì)算機(jī)上的jar包的位置,我用的自己本機(jī)的maven倉庫的氧苍,注意別只復(fù)制這個(gè)jar存在的路徑夜矗,在最后邊要加上jar的名字哦。細(xì)節(jié)細(xì)節(jié)-->
<classPathEntry location="/media/chenjunan/D/deepin/apache-maven-3.6.0/repository/mysql/mysql-connector-java/8.0.15/mysql-connector-java-8.0.15.jar"/>
<context id="Tables" targetRuntime="MyBatis3">
<!-- 生成 JavaBean 對(duì)象重寫 toString方法 -->
<plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
<!-- 取消生成注釋 -->
<commentGenerator>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--這是mysql連接的配置信息让虐,DriverClass的路徑是否存在 cj 看自己mysql連接的版本 5.xx沒有cj紊撕。6.xx的有cj-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/xunjian?serverTimezone=GMT" <!--這個(gè)serverTimezone我查了下是返回的時(shí)間問題,等用到了在細(xì)學(xué)吧赡突!-->
userId="root"
password="root">
<!--這個(gè)很重要对扶,沒有的話,會(huì)發(fā)生一些奇怪的問題惭缰,稍后細(xì)講浪南!-->
<property name="nullCatalogMeansCurrent" value="true" />
</jdbcConnection>
<!-- 默認(rèn)false,把JDBC DECIMAL 和 NUMERIC 類型解析為 Integer漱受,為 true時(shí)把JDBC DECIMAL 和NUMERIC 類型解析為java.math.BigDecimal 涉及金額就要注意了喲-->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!--指定javaBean生成的位置 targetProject="./src/main/java" 注意src前面有個(gè) ./-->
<!--targetPackage="com.chenggongyuan.xunjian.pojo",這里是自己項(xiàng)目的名字络凿,下面的都得替換成自己的項(xiàng)目名稱-->
<javaModelGenerator targetPackage="com.chenggongyuan.xunjian.pojo"
targetProject="./src/main/java">
<!--這個(gè)為true 逆向工程可能會(huì)生成子包-->
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 指定sql映射文件生成位置 -->
<sqlMapGenerator targetPackage="mapper" targetProject="./src/main/resources/mappers">
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- 指定dao接口生成的位置,mapper接口 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.chenggongyuan.xunjian.mapper"
targetProject="./src/main/java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 制定每個(gè)表的生成策略 這里可以寫多個(gè)表昂羡,表名和需要生成的pojo名寫正確 -->
<table tableName="staff" domainObjectName="Staff"></table>
</context>
</generatorConfiguration>
接下來開始運(yùn)行絮记。
首先點(diǎn)擊 maven
再雙擊它。
看看控制臺(tái)有沒有error虐先,沒有就成功怨愤!有的話就需要隨著問題繼續(xù)學(xué)習(xí)了。(有問題不要生氣蛹批,你可是勵(lì)志成為百萬年薪的高級(jí)程序員撰洗。)
看看生成的文件吧
到這,演示結(jié)束了腐芍,后邊說說問題了赵,有興趣的繼續(xù)嗨~
1 上邊說道 <property name="nullCatalogMeansCurrent" value="true" />這個(gè)配置不加,會(huì)有問題甸赃,我們看看會(huì)有啥問題!圖片可能看起來太亂冗酿,這里我選擇口述埠对。
我 的mysql數(shù)據(jù)庫我在里面建了兩個(gè)數(shù)據(jù)庫,兩個(gè)數(shù)據(jù)庫都有staff這個(gè)名字的表裁替。雖然我在配置連接數(shù)據(jù)庫時(shí)指定了數(shù)據(jù)庫项玛,相信聰明的你一定看到。
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/xunjian?serverTimezone=GMT" <!--這個(gè)serverTimezone我查了下是返回的時(shí)間問題弱判,等用到了在細(xì)學(xué)吧襟沮!-->
userId="root"
password="root">
在url后邊我指定了xunjian這個(gè)數(shù)據(jù)庫,但對(duì)staff這個(gè)表逆向工程時(shí),卻生成了另外一個(gè)數(shù)據(jù)庫的staff表的pojo开伏。令我很是不解膀跌,但在官方文檔有他的答案。 官方文檔 ,在下才疏學(xué)淺固灵,并未看懂捅伤。遺憾~∥撞#總結(jié)一句話丛忆,MySql不能正確支持SQL目錄和架構(gòu)。哪天遇到高手了仍秤,再細(xì)究熄诡。
2 相信大家看到逆向工程還生成了××Example的類,放在pojo中诗力,它有什么用處呢凰浮?
先打開看看。姜骡。
protected String orderByClause;
protected boolean distinct;
protected List<Criteria> oredCriteria;
public StaffExample() {
oredCriteria = new ArrayList<Criteria>();
}
......
三個(gè)屬性导坟,和一個(gè)構(gòu)造函數(shù),后邊還有很多set,get方法和其他一些方法圈澈,我就省略了惫周,有興趣的自己去看看便是!
第一個(gè)屬性 orderByClause 康栈,從他 的名字看递递,大概是通過什么排序。 String 類型啥么。它 的demo樣子如下
userExample.setOrderByClause("username asc"); //asc升序,desc降序排列
這下懂了登舞,對(duì)某個(gè)表查詢的時(shí)候根據(jù)某屬性排序。
第二個(gè)屬性distinct boolean值悬荣,翻譯過來意思是 確切的菠秒,在mysql中一般使用它對(duì)查詢的結(jié)果根據(jù)某個(gè)屬性去重,就是查詢出某個(gè)字段不重復(fù)的記錄氯迂,一般用來查詢不重復(fù)記錄的條數(shù)践叠。。
用法例如
select distinct name from user
如果在user表有兩個(gè)name為張三的嚼蚀,那么結(jié)果只會(huì)顯示一個(gè)禁灼。這里我想到一個(gè)場景,一張考勤表轿曙,上面有學(xué)生這堂課簽到和簽退記錄弄捕,甚至有學(xué)生惡意反復(fù)刷僻孝,統(tǒng)計(jì)上課學(xué)生人數(shù)時(shí)就可以使用它來通過名字去重,當(dāng)然如果班上有重名的考慮其他方案守谓。這里我們再說這個(gè)場景穿铆,班上有兩個(gè)叫張三的,我通過name和id去重分飞。對(duì)應(yīng)sql語句如下:
select distinct name,distinct id from user
這種寫法至少在我的機(jī)器上報(bào)了錯(cuò)悴务,并且提示error發(fā)生在distinct id附近。原因是distinct必須放在要查詢字段的開頭譬猫。多個(gè)字段可能需要考慮group by了,分組去重讯檐,對(duì)應(yīng)sql如下
select distinct id,name from user group by name
第三個(gè)叫oredCriteria,是個(gè)Criteria 的list染服,看看這個(gè)類是啥别洪!
public static class Criteria extends GeneratedCriteria {
protected Criteria() {
super();
}
}
static class,繼續(xù)--->
protected abstract static class GeneratedCriteria {
protected List<Criterion> criteria;
protected GeneratedCriteria() {
super();
criteria = new ArrayList<Criterion>();
}
它的父類抽象了柳刮,又多個(gè)一個(gè)list挖垛,Criteria 變成了Criterion,查了意思是標(biāo)準(zhǔn)秉颗,規(guī)范痢毒。繼續(xù)深入-->
public static class Criterion {
private String condition; //where 后面的條件
private Object value;
private Object secondValue;
private boolean noValue;
private boolean singleValue;
private boolean betweenValue;
private boolean listValue;
private String typeHandler;
Criteria類—-可以把它想成where條件的集合
Criteria包含一個(gè)Criterion的集合,每一個(gè)Criteria對(duì)象內(nèi)包含的Criterion之間是由AND連接的,是邏輯與的關(guān)系。
好了蚕甥,不繼續(xù)深入了哪替,用到了在深入吧,免得學(xué)了又忘菇怀! 總之啊凭舶,這個(gè)××Example的類是專門用來對(duì)這個(gè)單表來查詢的類。目前我還沒怎么用到它爱沟。