Mybatis逆向工程筆記小結(jié)
1.前言
我們在開發(fā)傳統(tǒng)的Maven項目或者SpringBoot項目過程中,最終處理的就是對于數(shù)據(jù)的讀與存,這時就免不了寫對象關(guān)系映射代碼,實體類、mapper、mapper.xml等代碼,若存在大量的增刪改查功能的話,我們開發(fā)時就會不斷重復(fù)相同的操作,大大降低了工作效率。
為此便但成了Mybatis “逆向工程” ,所謂逆向工程,就是從數(shù)據(jù)庫表結(jié)構(gòu)出發(fā),反向去生成對應(yīng)的實體和映射代碼,今天我們在這里提供2種方案進(jìn)行實現(xiàn)。
2.實現(xiàn)方案
2.1. mybatis-generator生成
2.1.1. 環(huán)境說明
1)springboot 項目(JDK1.8) 2)apache-maven-3.6.1 3)MySQL 8.0.30
2.1.2. 數(shù)據(jù)庫表
逆向工程的第一步,需要先有數(shù)據(jù)庫表結(jié)構(gòu)!我們在這里先創(chuàng)建一個表,作為示例使用,sql腳本如下:
--若已存在,先刪除 drop table user -- 創(chuàng)建數(shù)據(jù)庫用戶表 create table user ( id int NOT NULL AUTO_INCREMENT COMMENT '主鍵', name varchar(100) DEFAULT NULL COMMENT '員工姓名', phone_num varchar(20) DEFAULT NULL COMMENT '聯(lián)系方式', address varchar(200) DEFAULT NULL COMMENT '住址', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
2.1.3 添加Maven依賴
逆向工程的實現(xiàn),需要先引入mybatis相關(guān)依賴,如果項目中已經(jīng)引入過,可自動忽略這一步。我們主要需要mybatis,mysql基礎(chǔ)依賴,以及mybatis提供的生成器依賴
<dependencies> <!-- mybatis-generator --> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>1.3.7</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.2</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
2.1.4 數(shù)據(jù)庫連接配置
依賴與數(shù)據(jù)庫表創(chuàng)建好之后,我們就正式進(jìn)入了springboot項目中進(jìn)行逆向工程開發(fā)啦,首先在resources目錄下創(chuàng)建一個數(shù)據(jù)庫連接的配置文件:generator.properties
jdbc.driverClass=com.mysql.cj.jdbc.Driver jdbc.connectionURL=jdbc:mysql://localhost:3306/vhr?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai jdbc.userId=root jdbc.password=123456
2.1.5 配置生成規(guī)則
數(shù)據(jù)庫配置完成后,我們緊接著來設(shè)置一個生成規(guī)則,包括編碼,生成文件路徑、是否設(shè)置自定義注釋等等,這個配置可以從網(wǎng)上搜,有很多generatorConfiguration的配置。直接CV稍作修改即可
<?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> <!--根據(jù)配置文件讀取數(shù)據(jù)庫表信息--> <properties resource="generator.properties"/> <context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat"> <!--前置分隔符--> <property name="beginningDelimiter" value="`"/> <!--后置分隔符--> <property name="endingDelimiter" value="`"/> <!--設(shè)置編碼--> <property name="javaFileEncoding" value="UTF-8"/> <!-- 為模型生成序列化方法--> <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/> <!-- 為生成的Java模型創(chuàng)建一個toString方法 --> <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/> <!--生成mapper.xml時覆蓋原文件--> <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" /> <!--可以自定義生成model的代碼注釋--> <commentGenerator type="org.javaboy.vhr.utils.CommentGenerator"> <!-- 是否去除自動生成的注釋 true:是 : false:否 --> <property name="suppressAllComments" value="true"/> <property name="suppressDate" value="true"/> <property name="addRemarkComments" value="true"/> </commentGenerator> <!--配置數(shù)據(jù)庫連接--> <jdbcConnection driverClass="${jdbc.driverClass}" connectionURL="${jdbc.connectionURL}" userId="${jdbc.userId}" password="${jdbc.password}"> <!--解決mysql驅(qū)動升級到8.0后不生成指定數(shù)據(jù)庫代碼的問題--> <property name="nullCatalogMeansCurrent" value="true" /> </jdbcConnection> <!--指定生成model的路徑--> <javaModelGenerator targetPackage="org.javaboy.vhr.pojo" targetProject="vhr-web\src\main\java"/> <!--指定生成mapper.xml的路徑--> <sqlMapGenerator targetPackage="mybatis.mapper" targetProject="vhr-web\src\main\resources"/> <!--指定生成mapper接口的的路徑--> <javaClientGenerator type="XMLMAPPER" targetPackage="org.javaboy.vhr.mapper" targetProject="vhr-web\src\main\java"/> <!--單獨生成某個表,寫具體表名,否則生成全部表tableName設(shè)為%--> <table tableName="user" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"> <property name="useActualColumnNames" value="false"/> <property name="constructorBased" value="false"/> <generatedKey column="id" sqlStatement="JDBC" identity="true"/> </table> </context> </generatorConfiguration>
2.1.6 自定義實體類注釋配置
由于在上一步我們配置了注釋生成器,因此,我們要在相應(yīng)的路徑下,創(chuàng)建一個類,來自定義注釋的生成規(guī)則。路徑:org.javaboy.vhr.utils.CommentGenerator
<commentGenerator type="org.javaboy.vhr.utils.CommentGenerator"> <!-- 是否去除自動生成的注釋 true:是 : false:否 --> <property name="suppressAllComments" value="true"/> <property name="suppressDate" value="true"/> <property name="addRemarkComments" value="true"/> </commentGenerator>
CommentGenerator代碼
** * @author 86138 * @date 2024-05-01 13:27:15 * @description 添加自定義注釋 */ public class CommentGenerator extends DefaultCommentGenerator { private boolean addRemarkComments = false; /** * 設(shè)置用戶配置的參數(shù) */ @Override public void addConfigurationProperties(Properties properties) { super.addConfigurationProperties(properties); this.addRemarkComments = StringUtility.isTrue(properties.getProperty("addRemarkComments")); } /** * 給字段添加注釋 */ @Override public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { String remarks = introspectedColumn.getRemarks(); //根據(jù)參數(shù)和備注信息判斷是否添加備注信息 if (addRemarkComments && StringUtility.stringHasValue(remarks)) { addFieldJavaDoc(field, remarks); } } /** * 給model的字段添加注釋 */ private void addFieldJavaDoc(Field field, String remarks) { //文檔注釋開始 field.addJavaDocLine("/**"); //獲取數(shù)據(jù)庫字段的備注信息 String[] remarkLines = remarks.split(System.getProperty("line.separator")); for (String remarkLine : remarkLines) { field.addJavaDocLine(" * " + remarkLine); } addJavadocTag(field, false); field.addJavaDocLine(" */"); } }
2.1.7 使用生成器
以上步驟做完后,我們就要寫我們的逆向工程生成器啦,調(diào)用org.mybatis.generator.api中的MyBatisGenerator生成器進(jìn)行實現(xiàn)。注意:當(dāng)生成的代碼重復(fù)時,覆蓋原代碼!直接執(zhí)行下述Generator類的main方法,就會自動讀取數(shù)據(jù)庫中的表,并生成對應(yīng)的實體類與映射
public class Generator { public static void main(String[] args) throws Exception { //MBG 執(zhí)行過程中的警告信息 List<String> warnings = new ArrayList<String>(); //當(dāng)生成的代碼重復(fù)時,覆蓋原代碼 boolean overwrite = true; //讀取我們的 MBG 配置文件 InputStream is = Generator.class.getResourceAsStream("/generatorConfig.xml"); ConfigurationParser cp = new ConfigurationParser(warnings); Configuration config = cp.parseConfiguration(is); is.close(); DefaultShellCallback callback = new DefaultShellCallback(overwrite); //創(chuàng)建 MBG MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); //執(zhí)行生成代碼 myBatisGenerator.generate(null); //輸出警告信息 for (String warning : warnings) { System.out.println(warning); } } }
2.2. MybatisX插件生成(推薦)
基于方案一,我們可以快速的根據(jù)數(shù)據(jù)庫中的表進(jìn)行逆向工程的創(chuàng)建,大量的減少了我們的重復(fù)性工作,但是!它的實現(xiàn)還是比較復(fù)雜的,generatorConfiguration配置中的內(nèi)容豐富且復(fù)雜,比較難記,而且在原有代碼中需要寫一定的代碼量才能實現(xiàn)。
接下來我們要說的這種方案二,幾乎不用寫任何代碼,只需要點點點就可以實現(xiàn)逆向工程啦,如果你使用idea的話,這種方案尤其方便。
2.2.1 下載IDEA插件
在插件管理中下載MybatisX插件
2.2.2 配置數(shù)據(jù)源
在idea的database中配置數(shù)據(jù)源,這里以MySQL為例,需要注意時區(qū)的配置。
2.2.3 配置maven依賴
<!--lombok依賴--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <!--MyBatis Plus依賴--> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.1.0</version> </dependency>
2.2.4 配置生成規(guī)則
打開剛剛配置好的本地數(shù)據(jù)庫,選擇你想構(gòu)建的數(shù)據(jù)表,右鍵 -> MybatisX-Generator。
選擇項目包路徑、實體包名、表名;
next后繼續(xù)配置mapper、xml、service的生成路徑以及需要的注釋功能,hashCode/equals、Lombk注解等等。這個要根據(jù)你項目的實際情況來選擇
在上一步的最后配置完成,點擊Finish按鈕,查看結(jié)果,在對應(yīng)的路徑下成功的生成了我們需要的文件。
3.總結(jié)
這次我們簡單介紹了Mybatis逆向工程的兩種實現(xiàn)方案,方案一實現(xiàn)復(fù)雜,但可以滿足基本的增刪改查的實現(xiàn),博主還是更偏向于第二種哈哈,可視化操作起來比較簡單,大家可以根據(jù)自己的日常開發(fā)場景,進(jìn)行合理選擇。
到此這篇關(guān)于Mybatis逆向工程筆記小結(jié)的文章就介紹到這了,更多相關(guān)Mybatis逆向工程內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java與Python之間使用jython工具類實現(xiàn)數(shù)據(jù)交互
今天小編就為大家分享一篇關(guān)于Java與Python之間使用jython工具類實現(xiàn)數(shù)據(jù)交互,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2019-03-03Java 處理圖片與base64 編碼的相互轉(zhuǎn)換的示例
本篇文章主要介紹了Java 處理圖片與base64 編碼的相互轉(zhuǎn)換的示例,具有一定的參考價值,有興趣的可以了解一下2017-08-08Java如何使用spire進(jìn)行word文檔的替換詳解
創(chuàng)作一份文案經(jīng)常會高頻率地使用某些詞匯,如地名、人名、人物職位等,若表述有誤,就需要整體撤換,下面這篇文章主要給大家介紹了關(guān)于Java如何使用spire進(jìn)行word文檔的替換的相關(guān)資料,需要的朋友可以參考下2023-01-01spring?boot配置dubbo方式(properties)
這篇文章主要介紹了spring?boot配置dubbo方式(properties),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01