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&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模式,當然也有公司采用這種模式,但絕大多數還是傳統的開發方式。按照我們正常的開發方式就行,這個模式了解就可。