MyBatis系統學習篇 - MyBatis逆向工程

MyBatis的逆向工程是指根據數據庫表結構自動生成對應的Java實體類、Mapper接口和XML映射文件的過程。逆向工程可以幫助開發人員快速生成與數據庫表對應的代碼,減少手動編寫重復代碼的工作量。

我們在MyBatis中通過逆向工具來幫我簡化繁瑣的搭建框架,減少我們對實體類的創建和mapper接口等,包括生產xml映射文件,不過一般開發中,我們不怎么使用映射文件生成的東西,因為生成的xml文件并不符合我們實際開發中使用的,所以我們一般通過逆向工具幫我們創建相關文件之后,然后我們在根據創建的文件進行處理。

逆向工程的好處

  • 提高開發效率:逆向工程可以自動生成實體類、Mapper接口和XML映射文件,減少了手動編寫這些代碼的時間和工作量。開發人員可以專注于業務邏輯的實現,提高開發效率。

  • 保持代碼一致性:逆向工程生成的代碼與數據庫表結構保持一致,避免了手動編寫代碼時可能出現的拼寫錯誤、字段類型不匹配等問題。這樣可以確保代碼的準確性和一致性。

  • 易于維護和更新:當數據庫表結構發生變化時,可以通過重新運行逆向工程來更新生成的代碼,而不需要手動修改和調整代碼。這樣可以減少維護工作的復雜性和風險。

  • 提供基礎代碼框架:逆向工程生成的代碼提供了基礎的增刪改查操作,開發人員可以在此基礎上進行擴展和定制,快速構建具體業務功能。

  • 避免重復勞動:逆向工程可以自動生成大量的基礎代碼,避免了開發人員重復編寫相似的代碼的勞動,提高了開發效率和代碼質量。

創建逆向工程的步驟

正向工程:先創建Java實體類,由框架負責根據實體類生成數據庫表。 Hibernate是支持正向工程的。

逆向工程:先創建數據庫表,由框架負責根據數據庫表,反向生成如下資源:

  • Java實體類
  • Mapper接口
  • Mapper映射文件

逆向完畢后實現相關功能的完整目錄:
在這里插入圖片描述

添加逆向工程的依賴和插件

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>SSM</artifactId><groupId>com.miaow</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>MyBatis-generator</artifactId><name>MyBatis-generator</name><description>MyBatis</description><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.7</maven.compiler.source><maven.compiler.target>1.7</maven.compiler.target></properties><dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version></dependency><!-- junit測試 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- log4j日志 --><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!-- 逆向工程的核心依賴 --><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.6</version></dependency></dependencies><!-- 控制Maven在構建過程中相關配置 --><build><!-- 構建過程中用到的插件 --><plugins><!-- 具體插件,逆向工程的操作是以構建過程中插件形式出現的 --><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.3.6</version><!-- 插件的依賴 --><dependencies><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><!-- 逆向工程的核心依賴 --><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.3.6</version></dependency></dependencies></plugin></plugins></build>
</project>

創建MyBatis核心配置文件

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--MyBatis核心配置文件中,標簽的順序:properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?--><!--引入properties文件--><properties resource="jdbc.properties" /><!--設置類型別名--><typeAliases><!--typeAlias:設置某個類型的別名屬性:type:設置需要設置別名的類型alias:設置某個類型的別名,若不設置該屬性,那么該類型擁有默認的別名,即類名且不區分大小寫--><!--<typeAlias type="com.atguigu.mybatis.pojo.User"></typeAlias>--><!--以包為單位,將包下所有的類型設置默認的類型別名,即類名且不區分大小寫--><package name="com.miaow.mybatis.bean"/></typeAliases><!--    該死的Mybatis 分頁插件還有順序  導入配置還要按照順序進行--><plugins><plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin></plugins><!--environments:配置多個連接數據庫的環境屬性:default:設置默認使用的環境的id--><environments default="development"><!--environment:配置某個具體的環境屬性:id:表示連接數據庫的環境的唯一標識,不能重復--><environment id="development"><!--transactionManager:設置事務管理方式屬性:type="JDBC|MANAGED"JDBC:表示當前環境中,執行SQL時,使用的是JDBC中原生的事務管理方式,事務的提交或回滾需要手動處理MANAGED:被管理,例如Spring--><transactionManager type="JDBC"/><!--dataSource:配置數據源屬性:type:設置數據源的類型type="POOLED|UNPOOLED|JNDI"POOLED:表示使用數據庫連接池緩存數據庫連接UNPOOLED:表示不使用數據庫連接池JNDI:表示使用上下文中的數據源--><dataSource type="POOLED"><!--設置連接數據庫的驅動--><property name="driver" value="${jdbc.driver}"/><!--設置連接數據庫的連接地址--><property name="url" value="${jdbc.url}"/><!--設置連接數據庫的用戶名--><property name="username" value="${jdbc.username}"/><!--設置連接數據庫的密碼--><property name="password" value="${jdbc.password}"/></dataSource></environment><!-- 配置多個數據源 --><environment id="test"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/test?serverTimezone=UTC"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!--引入映射文件--><mappers><!--xml引入配置文件  --><!--<mapper resource="mappers/UserMapper.xml"/>--><!--以包為單位引入映射文件要求:1、mapper接口所在的包要和映射文件所在的包一致2、mapper接口要和映射文件的名字一致--><package name="com.miaow.mybatis.mapper"/></mappers>
</configuration>

創建逆向工程配置文件

文件名必須是:generatorConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN""http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration><!--targetRuntime: 執行生成的逆向工程的版本MyBatis3Simple: 生成基本的CRUD(清新簡潔版)MyBatis3: 生成帶條件的CRUD(奢華尊享版)--><context id="mybatisGenerator" targetRuntime="MyBatis3"><commentGenerator><!-- 是否去除自動生成的注釋 true:是 : false:否 --><property name="suppressAllComments" value="true" /></commentGenerator><!-- 數據庫的連接信息 --><jdbcConnection driverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/test?serverTimezone=UTC&amp;useSSL=false"userId="root"password="123456"></jdbcConnection><!-- 默認false,把JDBC DECIMAL 和 NUMERIC 類型解析為 Integer,為 true時把JDBC DECIMAL 和NUMERIC 類型解析為java.math.BigDecimal --><javaTypeResolver><property name="forceBigDecimals" value="false" /></javaTypeResolver><!-- javaBean的生成策略--><javaModelGenerator targetPackage="com.miaow.mybatis.pojo" targetProject=".\src\main\java"><property name="enableSubPackages" value="true" /><property name="trimStrings" value="true" /></javaModelGenerator><!-- SQL映射文件的生成策略 --><sqlMapGenerator targetPackage="com.miaow.mybatis.mapper" targetProject=".\src\main\resources"><property name="enableSubPackages" value="true" /></sqlMapGenerator><!-- Mapper接口的生成策略 --><javaClientGenerator type="XMLMAPPER" targetPackage="com.miaow.mybatis.mapper" targetProject=".\src\main\java"><property name="enableSubPackages" value="true" /></javaClientGenerator><!-- 逆向分析的表 --><!-- tableName設置為*號,可以對應所有表,此時不寫domainObjectName --><!-- domainObjectName屬性指定生成出來的實體類的類名 -->
<!--        <table tableName="user" domainObjectName="User"/>--><table tableName="book" domainObjectName="BookVO"><!-- 用于指定生成實體類時是否使用實際的列名作為實體類的屬性名 --><property  name="useActualColumnNames"  value="false" /></table></context>
</generatorConfiguration>

創建你的MySQL數據庫表,我的數據庫表很簡單

CREATE TABLE `book`  (`uid` int(11) NOT NULL COMMENT '用戶id',`book` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT '用戶借的書的名稱',`cool` varchar(255) CHARACTER SET utf8 COLLATE utf8_bin NULL DEFAULT NULL COMMENT 'cool星級',PRIMARY KEY (`uid`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_bin ROW_FORMAT = Dynamic;

接下來我們就通過MBG插件的generate構建我們的相關文件

在這里插入圖片描述
雙擊運行,然后我們就可以等待看到我們的目錄下,出現了相關生成的文件了。

在這里插入圖片描述

其他文件

log4j.properties
log4j.rootLogger=WARN, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"><appender name="STDOUT" class="org.apache.log4j.ConsoleAppender"><param name="Encoding" value="UTF-8" /><layout class="org.apache.log4j.PatternLayout"><param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS}%m (%F:%L) \n" /></layout></appender><logger name="java.sql"><level value="debug" /></logger><logger name="org.apache.ibatis"><level value="info" /></logger><root><level value="debug" /><appender-ref ref="STDOUT" /></root>
</log4j:configuration>

測試我們的QBC查詢

public class AppTest
{/*** Rigorous Test :-) QBC查詢*/@Testpublic void shouldAnswerWithTrue() throws IOException {
//        assertTrue( true );InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);SqlSession  sqlSession = sqlSessionFactory.openSession();BookVOMapper  bookVOMapper = sqlSession.getMapper(BookVOMapper.class);//查詢所所有數據
//        List<BookVO> list =  bookVOMapper.selectByExample(null);
//        list.forEach(book -> System.out.println(book));//根據條件查詢BookVOExample example = new BookVOExample();// 查詢條件或者更新條件example.createCriteria().andBookEqualTo("張珊").andCoolEqualTo("我很酷");//example.or().andUidIsNotNull();List<BookVO> list1 =  bookVOMapper.selectByExample(example); //select uid, book, cool from book WHERE ( book = 'JWkQo3pTqV' and cool = 'hMzeUlRCrJ(String) ' ) (BaseJdbcLogger.java:137)list1.forEach(book -> System.out.println(book));//        bookVOMapper.updateByExampleSelective(new BookVO(214,"張珊","我很酷"),example);   //update book SET uid = 214, book = '張珊', cool = '我很酷' WHERE ( book = 'JWkQo3pTqV' and cool = 'hMzeUlRCrJ(String) ' ) (BaseJdbcLogger.java:137)}
}

在這里插入圖片描述

其他拓展

關于QBC查詢是提供基于XML映射文件和注解的方式來對SQL進行查詢。

什么是QBC

QBC(Query By Criteria)是一種查詢方式,用于根據一組條件來構建查詢語句,而不是直接編寫SQL語句。它是一種面向對象的查詢方式,通過使用條件對象來描述查詢條件,從而實現動態和靈活的查詢。

在QBC中,查詢條件通常由一組條件對象(Criteria)組成,每個條件對象表示一個查詢條件。條件對象包含屬性名、操作符和值等信息,用于描述查詢的約束條件。通過組合和連接多個條件對象,可以構建復雜的查詢語句。

QBC的優點包括:

  • 靈活性:QBC允許根據不同的查詢需求動態構建查詢語句,可以根據條件的組合和連接來靈活地生成不同的查詢條件。
  • 可讀性:使用條件對象來描述查詢條件,使查詢語句更加直觀和易于理解,減少了直接編寫SQL語句的復雜性。
  • 可維護性:由于查詢條件是通過條件對象來描述的,當查詢需求變化時,只需修改條件對象的屬性,而不需要修改底層的SQL語句,提高了查詢的可維護性。

QBC查詢的步驟:

  • 創建一個查詢條件對象(Criteria): 創建一個Java類,用于封裝查詢條件。這個類可以包含各種屬性,用于表示查詢的條件,例如字段名、操作符和值等。

  • 在Mapper接口中定義查詢方法: 在Mapper接口中定義一個方法,該方法接受Criteria對象作為參數,并返回查詢結果。方法的實現可以通過XML映射文件或注解來編寫SQL語句,根據Criteria對象的屬性動態生成查詢條件。

  • 編寫XML映射文件或注解: 在XML映射文件或注解中,根據Criteria對象的屬性動態生成查詢條件。可以使用MyBatis提供的動態SQL標簽(如if、choose、when、otherwise等)來根據條件生成不同的查詢語句。

  • 調用查詢方法: 在業務代碼中,創建一個Criteria對象,設置查詢條件,然后調用Mapper接口中定義的查詢方法進行查詢。查詢結果將根據條件動態生成的SQL語句進行查詢,并返回符合條件的結果。

QBC在許多ORM(對象關系映射)框架中得到廣泛應用,例如Hibernate和MyBatis。這些框架提供了API和工具,用于構建和執行QBC查詢,簡化了查詢的編寫和執行過程。

ps:國內一般開發很少采用QBC模式,當然也有公司采用這種模式,但絕大多數還是傳統的開發方式。按照我們正常的開發方式就行,這個模式了解就可。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/17963.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/17963.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/17963.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

iOS推送證書過期處理

蘋果推送證書的有效期都是一年&#xff0c;將要過期的時候&#xff0c;蘋果官方會發郵件提醒。 一、過期 在電腦上找到并打開其它->鑰匙串訪問&#xff1b; 我的證書可以看到各個App的推送證書&#xff0c;如果過期了&#xff0c;顯示紅色X 二、重新創建 1、登陸apple開…

如何解決三層單點故障

我給他整成下面這樣行不行呀 一個pc的默認網關只有一個&#xff0c;pc1配置的是1.1&#xff0c;那么路由壞了&#xff0c;他還是給1.1發送數據&#xff0c;冗余的那個也沒用上呀 用VRRP&#xff08;虛擬路由冗余協議&#xff09;解決以上問題 那光把這個R1和R2虛擬成一個R3&…

android usb轉串口

Android USB通信&#xff08;host轉串口&#xff09;_android usb 實現串口通信-CSDN博客

Windows內核函數 - 文件的讀操作

DDK提供了文件讀操作的內核函數&#xff0c;其函數聲明如下&#xff1a; NTSTATUS ZwWriteFile(IN HANDLE FileHandle,IN HANDLE Event,IN PIO_APC_ROUTINE ApcRoutine,IN PVOID ApcContext,out PIO_STATUS_BLOCK IoStatusBlock,IN PVOID Buffer,IN ULONG Length,IN PLARGE_IN…

windows 執行node報錯 800A1391

在項目下執行node -v的時候&#xff0c;拋了這個錯誤&#xff0c;一開始沒發現有啥問題 現在一看&#xff0c;這個報錯里的node怎么是個文件... 出現這個問題&#xff0c;是因為項目下&#xff0c;有個同名的文件叫node.js&#xff0c;搞得windows一時不知道是想打開node.js文…

代碼隨想錄算法訓練營Day51 | 300.最長遞增子序列 674. 最長連續遞增序列 718. 最長重復子數組

代碼隨想錄算法訓練營Day51 | 300.最長遞增子序列 674. 最長連續遞增序列 718. 最長重復子數組 LeetCode 300.最長遞增子序列 題目鏈接&#xff1a;LeetCode 300.最長遞增子序列 思路&#xff1a; 選取最長子序列&#xff0c;并收集 class Solution { public:int lengthOfL…

通過提示工程將化學知識整合到大型語言模型中

在當今快速發展的人工智能領域&#xff0c;大型語言模型&#xff08;LLMs&#xff09;正成為科學研究的新興工具。這些模型以其卓越的語言處理能力和零樣本推理而聞名&#xff0c;為解決傳統科學問題提供了全新的途徑。然而&#xff0c;LLMs在特定科學領域的應用面臨挑戰&#…

第四十六天 | 279.完全平方數 139.單詞拆分

題目&#xff1a;279.完全平方數 本題比較簡單&#xff0c;幾天沒做背包但是這道題很快ac了 嘗試解答&#xff1a; 題目類型&#xff1a;給定一個背包容量&#xff0c;求裝滿背包的最少物品數&#xff0c;且每個物品可以放多次&#xff0c;完全背包 1.dp[j]數組含義&#xff…

如何選擇適合自己需求的揚州獨立服務器方案?

在互聯網時代&#xff0c;獨立服務器是網絡建設的重要組成部分。選擇適合自己需求的揚州獨立服務器方案至關重要。下面&#xff0c;我們將介紹如何選擇合適的揚州獨立服務器&#xff0c;并推薦萊卡云&#xff08;Lcayun&#xff09;服務器商。 明確需求 要明確自己的需求是什…

大型央企國企信創化與數字化轉型規劃實施方案(71頁PPT)

方案介紹&#xff1a; 隨著全球信息技術的迅猛發展&#xff0c;數字化轉型已成為企業提升競爭力、實現可持續發展的必經之路。作為國家經濟的重要支柱&#xff0c;大型央企國企在信創化與數字化轉型方面承載著重要的責任和使命。本方案旨在通過系統性的規劃和實施&#xff0c;…

rpc理解

rpc 遠程過程調用 rpc與http的區別 1.性能高 2.使用復雜 3.可擴展性高 4 跨語言支持 5.可以使用服務發現&#xff0c;負載均衡&#xff0c;熔斷降級 rpc遠程調用&#xff0c;必須傳輸數據&#xff0c;需要序列化。 序列化有多種方式&#xff1a; jdk原生序列化&#xff0c…

Discourse 使用 DiscourseConnect 來進行用戶數據同步

我們都知道 Discourse 的用戶管理和設置都高度依賴電子郵件。 如果 Discourse 沒有設置電子郵件 SMTP 的話&#xff0c;作為管理員是沒有辦法對用戶郵箱進行修改并且通過驗證的。 可以采取的辦法是通過 Discourse 的 DiscourseConnect 來進行用戶同步。 根據官方的說法&…

C++語法|虛函數與多態詳細講解(四)|哪些函數不能實現成虛函數和虛析構函數的理解

系列匯總講解&#xff0c;請移步&#xff1a; C語法&#xff5c;虛函數與多態詳細講解系列&#xff08;包含多重繼承內容&#xff09; 文章目錄 哪些函數不能成為虛函數虛析構函數什么時候把基類的析構函數必須是線程虛函數 哪些函數不能成為虛函數 要回答這個問題&#xff0c…

如何取消公眾號的在線客服綁定授權

1&#xff0c;功能設置 2&#xff0c;公眾號設置 3&#xff0c;查看詳情&#xff0c;取消

開發遠程遙控情趣玩具軟件,提供現成程序源碼應具備哪些基礎功能

以“東莞夢情智能”為參考&#xff0c;其提供的現成情趣玩具遙控軟件程序源碼&#xff0c;所具備哪些基礎功能&#xff0c;看看它們如何讓情趣玩具變得更加豐富多彩。 一、設備連接 設備連接是情趣玩具遙控軟件的基礎功能之一。“東莞夢情智能”的現成源碼支持多種連接方式&am…

leetcode題目42

接雨水 困難 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖&#xff0c;計算按此排列的柱子&#xff0c;下雨之后能接多少雨水 示例 1&#xff1a; 輸入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 輸出&#xff1a;6 解釋&#xff1a;上面是由數組 [0,1,0,2,1,0,1…

mysql中text,longtext,mediumtext區別

文章目錄 一.概覽二、字節限制不同三、I/O 不同四、行遷移不同 一.概覽 在 MySQL 中&#xff0c;text、mediumtext 和 longtext 都是用來存儲大量文本數據的數據類型。 TEXT&#xff1a;TEXT 數據類型可以用來存儲最大長度為 65,535(2^16-1)個字符的文本數據。如果存儲的數據…

開源VS閉源:誰更能推動AI技術的普及與發展?

一、引言 在人工智能&#xff08;AI&#xff09;技術的浪潮中&#xff0c;開源與閉源兩種模式一直并存&#xff0c;并各自在推動AI技術普及與發展上發揮著重要作用。然而&#xff0c;關于哪種模式更能有效地推動AI技術的普及與發展&#xff0c;一直存在著激烈的討論。本文將深…

Bitmap 的基本原理

Bitmap 是一種用于表示數據的高效方法&#xff0c;特別適合在需要表示大量布爾值&#xff08;true 或 false&#xff09;的情況下使用。它的原理是使用二進制位來表示每一個布爾值&#xff0c;節省了存儲空間和操作時間。 Bitmap 的基本原理 想象一下&#xff0c;你有一個很長…

樹莓派指令

1.常用指令 2.在終端窗口編輯文本文件 2.1nano編輯器 在文本里ctrlG就可以查看更多的快捷按鍵 2.2vi編輯器 進入默認為命令模式