MyBatis Generator介紹及使用方法
手動(dòng)編寫(xiě) SQL 語(yǔ)句和映射實(shí)體類(lèi)的過(guò)程常常是繁瑣且易出錯(cuò)的。這時(shí),我們就可以借助 MyBatis Generator (MBG) 這個(gè)強(qiáng)大的工具來(lái)自動(dòng)化生成這部分代碼。
1.什么是 MyBatis Generator
MyBatis Generator 是一款針對(duì) MyBatis 或 iBATIS 設(shè)計(jì)的代碼生成器,由 MyBatis 官方提供。它可以生成 MyBatis 的 Java 實(shí)體類(lèi)、mapper.xml 文件以及對(duì)應(yīng)的 Mapper 接口,極大地減少了開(kāi)發(fā)人員手寫(xiě) SQL 語(yǔ)句和映射實(shí)體類(lèi)的工作量,提高了開(kāi)發(fā)效率。
2.使用 MyBatis Generator
2.1 導(dǎo)入依賴(lài)
首先,我們需要在項(xiàng)目中添加 MyBatis Generator 的依賴(lài):
<!-- MyBatis 生成器 --> <dependency> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-core</artifactId> <version>${mybatis-generator.version}</version> </dependency>
當(dāng)然,為了完成的完成整套流程,我們還需要一些相關(guān)的其他依賴(lài),如 MyBatis、PageHelper、Druid 和 MySQL 驅(qū)動(dòng):
<!-- SpringBoot整合MyBatis --> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>${mybatis-starter.version}</version> </dependency> <!-- MyBatis分頁(yè)插件 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper-spring-boot-starter</artifactId> <version>${pagehelper-starter.version}</version> </dependency> <!-- 集成druid連接池 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>${druid.version}</version> </dependency> <!-- Mysql數(shù)據(jù)庫(kù)驅(qū)動(dòng) --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>${mysql-connector.version}</version> </dependency>
注意:上面的
${}
部分的版本號(hào)需要根據(jù)具體項(xiàng)目的實(shí)際情況進(jìn)行調(diào)整。
2.2 application 配置
在 Spring Boot 的 application.yml
配置文件中進(jìn)行一些基本的配置,主要包括數(shù)據(jù)源的配置、MyBatis 的相關(guān)配置:
# 配置數(shù)據(jù)源 spring: datasource: url: jdbc:mysql://localhost:3306/<database>?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC username: <username> password: <password> # Mybatis 相關(guān)配置 mybatis: # 配置映射文件路徑 mapper-locations: - classpath:mapper/*.xml - classpath:mbg/mapper/*/*.xml
下面是對(duì)上面基本配置的簡(jiǎn)單說(shuō)明:
- 將上述數(shù)據(jù)源配置中的
<database>
、<username>
和<password>
換為你具體的連接信息; - 為了便于區(qū)分 MyBatis Generator 自動(dòng)生成的 mapper.xml 和我們自己手寫(xiě)的 mapper.xml,我們約定自己寫(xiě)的映射文件放在
resources/mapper
目錄下,而 MyBatis Generator 自動(dòng)生成的映射文件放在resources/mbg/mapper
目錄下。
2.3 添加 Java 配置
為了讓 Spring Boot 能夠自動(dòng)掃描到生成的 Mapper 接口,我們需要準(zhǔn)備一個(gè)配置類(lèi)通過(guò)在 Java 配置類(lèi)上添加 @MapperScan
注解來(lái)指定掃描路徑。
/** * MyBatis 配置類(lèi)(掃描 Mapper 接口) */ @MapperScan({"cn.javgo.learningmybatis.mapper","cn.javgo.learningmybatis.mbg.mapper"}) @SpringBootConfiguration public class MyBatisConfig { }
注意,上面我們同樣約定自己寫(xiě)的 Mapper 接口放在 cn.javgo.learningmybatis.mapper
包下,而 MyBatis Generator 自動(dòng)生成的 Mapper 接口放在 cn.javgo.learningmybatis.mbg.mapper
包下。
2.4 MBG 配置
在 resources
目錄下準(zhǔn)備一個(gè) generator.properties
配置文件,用于配置數(shù)據(jù)庫(kù)連接的基本信息:
jdbc.driverClass=com.mysql.cj.jdbc.Driver jdbc.connectionURL=jdbc:mysql://localhost:3306/<database>?useSSL=false&serverTimezone=UTC jdbc.username=<username> jdbc.password=<password>
注意:你需要將上述數(shù)據(jù)源配置中的
<database>
、<username>
和<password>
換為你具體的連接信息。
然后,需要在 resources
目錄下創(chuàng)建一個(gè) MBG 的配置文件 generatorConfig.xml
,配置好需要連接的數(shù)據(jù)庫(kù),以及指定生成的實(shí)體類(lèi)、Mapper 接口和 XML 映射文件的位置。
配置文件的具體內(nèi)容根據(jù)實(shí)際情況設(shè)置,以下是一個(gè)簡(jiǎ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> <!-- 導(dǎo)入屬性配置 --> <properties resource="generator.properties"/> <!-- MBG 上下文環(huán)境 id:上下文環(huán)境唯一標(biāo)識(shí),必須唯一 targetRuntime:生成的目標(biāo)運(yùn)行環(huán)境 MyBatis3:代表生成MyBatis3.x版本的代碼 MyBatis3Simple:新版本的生成器 MyBatis3DynamicSql:新版本的生成器 defaultModelType:生成的默認(rèn)Model類(lèi)型 flat:代表生成的Model都是一個(gè)個(gè)的獨(dú)立的類(lèi),例如生成Dept類(lèi)(推薦) hierarchical:代表生成的Model類(lèi)會(huì)按照層級(jí)進(jìn)行組織,例如生成Dept、DeptMapper、DeptExample三個(gè)類(lèi) --> <context id="MySqlContext" targetRuntime="MyBatis3" defaultModelType="flat"> <!-- 配置SQL語(yǔ)句中的前置分隔符 --> <property name="beginningDelimiter" value="`"/> <!-- 配置SQL語(yǔ)句中的后置分隔符 --> <property name="endingDelimiter" value="`"/> <!-- 配置生成Java文件的編碼 --> <property name="javaFileEncoding" value="UTF-8"/> <!--生成mapper.xml時(shí)覆蓋原文件--> <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin"/> <!-- 為模型生成序列化方法--> <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/> <!-- 為生成的Java模型創(chuàng)建一個(gè)toString方法 --> <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/> <!--可以自定義生成model的代碼注釋 type:自定義注釋生成器的類(lèi)全限定名 --> <commentGenerator type="cn.javgo.learningmybatis.mbg.CommentGenerator"> <!-- 是否阻止生成的注釋 --> <property name="suppressAllComments" value="true"/> <!-- 是否阻止生成的注釋包含時(shí)間戳 --> <property name="suppressDate" value="true"/> <!-- 是否添加數(shù)據(jù)庫(kù)表的備注信息 --> <property name="addRemarkComments" value="true"/> </commentGenerator> <!-- 配置數(shù)據(jù)庫(kù)連接 --> <jdbcConnection driverClass="${jdbc.driverClass}" connectionURL="${jdbc.connectionURL}" userId="${jdbc.username}" password="${jdbc.password}"> <!-- 配置數(shù)據(jù)庫(kù)連接的屬性信息 autoReconnect:是否自動(dòng)重連 allowMultiQueries:是否允許執(zhí)行多條SQL語(yǔ)句 useUnicode:是否使用Unicode字符集 characterEncoding:設(shè)置字符集編碼 useSSL:是否使用SSL nullCatalogMeansCurrent:是否將null catalog看作當(dāng)前catalog(解決 MySql 8.0 以上版本不生成指定數(shù)據(jù)庫(kù)代碼的問(wèn)題) --> <property name="nullCatalogMeansCurrent" value="true"/> </jdbcConnection> <!-- 配置實(shí)體類(lèi)的包名和位置 targetPackage:生成的實(shí)體類(lèi)存放的包名 targetProject:生成的實(shí)體類(lèi)存放的位置 --> <javaModelGenerator targetPackage="cn.javgo.learningmybatis.mbg.model" targetProject="src/main/java"> <!-- 是否允許子包,即targetPackage.schemaName.tableName --> <property name="enableSubPackages" value="true"/> <!-- 是否對(duì)model添加構(gòu)造函數(shù) --> <property name="constructorBased" value="true"/> <!-- 是否對(duì)類(lèi)CHAR類(lèi)型的列的數(shù)據(jù)進(jìn)行trim操作 --> <property name="trimStrings" value="true"/> </javaModelGenerator> <!-- 配置SQL映射文件的包名和位置 targetPackage:生成的SQL映射文件存放的包名 targetProject:生成的SQL映射文件存放的位置 --> <sqlMapGenerator targetPackage="cn.javgo.learningmybatis.mbg.mapper" targetProject="src/main/resources"> <!-- 是否允許子包,即targetPackage.schemaName.tableName --> <property name="enableSubPackages" value="true"/> </sqlMapGenerator> <!-- 配置Mapper接口的包名和位置 type:選擇怎么生成mapper接口(推薦使用XMLMAPPER) XMLMAPPER:生成XML對(duì)應(yīng)的Mapper接口 ANNOTATEDMAPPER:生成基于注解的Mapper接口 MIXEDMAPPER:生成XML對(duì)應(yīng)的Mapper接口,同時(shí)也生成基于注解的Mapper接口 targetPackage:生成的Mapper接口存放的包名 targetProject:生成的Mapper接口存放的位置 --> <javaClientGenerator type="XMLMAPPER" targetPackage="cn.javgo.learningmybatis.mbg.mapper" targetProject="src/main/java"> <!-- 是否允許子包,即targetPackage.schemaName.tableName --> <property name="enableSubPackages" value="true"/> </javaClientGenerator> <!-- 指定數(shù)據(jù)庫(kù)表 tableName:數(shù)據(jù)庫(kù)表名 domainObjectName:生成的實(shí)體類(lèi)名(默認(rèn)去掉下劃線,駝峰命名) --> <table tableName="student"> <!-- 配置自增主鍵 column:指定獲取自增主鍵的列 sqlStatement:指定獲取自增主鍵的SQL語(yǔ)句 identity:指定是否為自增主鍵 --> <generatedKey column="id" sqlStatement="MySql" identity="true"/> </table> </context> </generatorConfiguration>
上述示例中注釋已經(jīng)很完善了,不再過(guò)多解釋?zhuān)鶕?jù)實(shí)際需要進(jìn)行調(diào)整即可。
注意:
MyBatis Generator 在運(yùn)行時(shí)會(huì)根據(jù)配置文件中指定的路徑生成所需的文件。如果路徑中的目錄已經(jīng)存在,MBG 會(huì)直接在其中創(chuàng)建文件。如果路徑中的某個(gè)目錄不存在,MBG 會(huì)嘗試創(chuàng)建這個(gè)目錄。
然而,有一點(diǎn)需要注意:MBG 只會(huì)嘗試創(chuàng)建最后一級(jí)的目錄,而不會(huì)創(chuàng)建整個(gè)目錄路徑。 例如,如果配置中的
targetProject
是src/main/java
,而targetPackage
是cn.javgo.learningmybatis.mbg.model
,則 MBG 會(huì)在src/main/java
目錄下創(chuàng)建cn/javgo/learningmybatis/mbg/model
目錄。前提是src/main/java
這個(gè)目錄已經(jīng)存在。如果src/main/java
不存在,MBG 將無(wú)法創(chuàng)建文件。因此,通常我們需要提前創(chuàng)建好 MBG 配置中指定的項(xiàng)目路徑(
targetProject
),這樣 MBG 才能正確生成文件。而對(duì)于包路徑(targetPackage
),MBG 會(huì)自動(dòng)創(chuàng)建,我們無(wú)需手動(dòng)創(chuàng)建。
如果你想自定義 MBG 生成的代碼,可以自定義一個(gè) CommentGenerator
來(lái)繼承 DefaultCommentGenerator
進(jìn)行個(gè)性化的定制,這對(duì)應(yīng)了上面配置文件中的 commentGenerator
標(biāo)簽部分。
比如我們可以自定義實(shí)體類(lèi)代碼的生成,在實(shí)體類(lèi)代碼上添加 Swagger 注解的支持:
package cn.javgo.learningmybatis.mbg; import org.mybatis.generator.api.IntrospectedColumn; import org.mybatis.generator.api.IntrospectedTable; import org.mybatis.generator.api.dom.java.CompilationUnit; import org.mybatis.generator.api.dom.java.Field; import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType; import org.mybatis.generator.internal.DefaultCommentGenerator; import org.mybatis.generator.internal.util.StringUtility; import java.util.Properties; /** * 自定義注釋生成器 */ public class CommentGenerator extends DefaultCommentGenerator { // 是否添加數(shù)據(jù)庫(kù)表的注釋 private boolean addRemarkComments = false; // Example 類(lèi)名后綴 private static final String EXAMPLE_SUFFIX = "Example"; // Mapper 類(lèi)名后綴 private static final String MAPPER_SUFFIX = "Mapper"; // ApiModelProperty 注解類(lèi)的全限定名(Swagger) private static final String API_MODEL_PROPERTY_FULL_CLASS_NAME = "io.swagger.annotations.ApiModelProperty"; /** * 設(shè)置用戶(hù)配置的參數(shù) * @param properties 用戶(hù)配置的參數(shù) */ @Override public void addConfigurationProperties(Properties properties) { // 調(diào)用父類(lèi)方法保證父類(lèi)方法可以正常使用 super.addConfigurationProperties(properties); // 從 properties 中獲取 addRemarkComments 參數(shù)值來(lái)判斷是否添加數(shù)據(jù)庫(kù)表的注釋 this.addRemarkComments = Boolean.parseBoolean(properties.getProperty("addRemarkComments")); } /** * 給字段添加注釋 * @param field 字段 * @param introspectedTable 數(shù)據(jù)庫(kù)表 * @param introspectedColumn 數(shù)據(jù)庫(kù)表字段 */ @Override public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) { // 獲取數(shù)據(jù)庫(kù)表字段的注釋 String remarks = introspectedColumn.getRemarks(); // 根據(jù)參數(shù)和備注信息判斷是否添加備注信息 if (addRemarkComments && StringUtility.stringHasValue(remarks)) { // 如果存在特殊字符,需要轉(zhuǎn)義 if (remarks.contains("\"")) { remarks = remarks.replace("\"", "'"); } // 給 model 的字段添加 Swagger 注解 field.addJavaDocLine("@ApiModelProperty(value = \"" + remarks + "\")"); } } /** * 給 Java 文件添加注釋 * @param compilationUnit Java 文件 */ @Override public void addJavaFileComment(CompilationUnit compilationUnit) { // 調(diào)用父類(lèi)方法保證父類(lèi)方法可以正常使用 super.addJavaFileComment(compilationUnit); // 獲取 Java 文件的全限定名 String fullyQualifiedName = compilationUnit.getType().getFullyQualifiedName(); // 如果不是 Mapper 類(lèi)或者 Example 類(lèi),就添加 Swagger 注解類(lèi)的導(dǎo)入(因?yàn)橹挥?model 類(lèi)需要添加 Swagger 注解) if (!fullyQualifiedName.contains(MAPPER_SUFFIX) && !fullyQualifiedName.contains(EXAMPLE_SUFFIX)) { // 添加 Swagger 注解類(lèi)的導(dǎo)入 compilationUnit.addImportedType(new FullyQualifiedJavaType(API_MODEL_PROPERTY_FULL_CLASS_NAME)); } } }
使用 Swagger 需要在項(xiàng)目的 pom 文件中添加對(duì)應(yīng)的依賴(lài):
<!-- Swagger --> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>${springfox-swagger.version}</version> </dependency>
注意,上述 ${springfox-swagger.version}
版本號(hào)需要根據(jù)實(shí)際情況進(jìn)行選擇。
TIP:
關(guān)于 Swagger API 文檔生成工具的使用請(qǐng)自行閱讀官方文檔或主頁(yè)也有對(duì)應(yīng)教程,此處不再詳細(xì)展開(kāi)。
2.5 生成代碼
配置完成后,你可以通過(guò)命令行、Maven 插件或者直接使用 Java API 來(lái)運(yùn)行 MBG。
如果是使用 Java API 的方式,我們需編寫(xiě)一個(gè) Generator
類(lèi),完成如下代碼編寫(xiě)后直接運(yùn)行 main
方法即可:
package cn.javgo.learningmybatis.mbg; import org.mybatis.generator.api.MyBatisGenerator; import org.mybatis.generator.config.Configuration; import org.mybatis.generator.config.xml.ConfigurationParser; import org.mybatis.generator.internal.DefaultShellCallback; import java.io.InputStream; import java.util.ArrayList; import java.util.List; /** * 通過(guò) Java API 的方式運(yùn)行 MyBatis Generator */ public class Generator { public static void main(String[] args) throws Exception { // 存儲(chǔ)運(yùn)行 MBG 時(shí)的警告信息 List<String> warnings = new ArrayList<>(); // 生成的代碼重復(fù)時(shí),覆蓋原代碼 boolean overwrite = true; // 讀取 MBG 配置文件 generatorConfig.xml InputStream inputStream = Generator.class.getResourceAsStream("/generatorConfig.xml"); // 傳入警告信息創(chuàng)建配置解析器(用于解析 generatorConfig.xml 配置文件) ConfigurationParser cp = new ConfigurationParser(warnings); // 解析配置文件 Configuration config = cp.parseConfiguration(inputStream); // 關(guān)閉輸入流 assert inputStream != null; inputStream.close(); // 創(chuàng)建 DefaultShellCallback 對(duì)象,用于解決重復(fù)文件覆蓋問(wèn)題 DefaultShellCallback callback = new DefaultShellCallback(overwrite); // 創(chuàng)建 MyBatisGenerator 對(duì)象,執(zhí)行生成代碼 MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings); // 執(zhí)行生成代碼 myBatisGenerator.generate(null); // 輸出警告信息 for (String warning : warnings) { System.out.println(warning); } } }
如果使用 Maven 插件,只需要在 pom.xml 中添加以下插件即可:
<!-- MyBatis 生成器 --> <plugin> <groupId>org.mybatis.generator</groupId> <artifactId>mybatis-generator-maven-plugin</artifactId> <version>1.4.0</version> <!-- 基本信息配置 --> <configuration> <!-- MyBatis Generator 配置文件 --> <configurationFile>${basedir}/src/main/resources/generatorConfig.xml</configurationFile> <!-- 允許移動(dòng)生成的文件 --> <overwrite>true</overwrite> <!-- 是否自動(dòng)覆蓋 --> <verbose>true</verbose> </configuration> </plugin>
然后運(yùn)行以下 Maven 命令即可:
$ mvn mybatis-generator:generate
如果是通過(guò)命令行的方式,可以運(yùn)行如下命令,JAR 包需要為具體版本的包,同時(shí)提供配置文件:
$ java -jar mybatis-generator-core-x.x.x.jar -configfile generatorConfig.xml
運(yùn)行成功后,你會(huì)在指定的包中看到生成的代碼結(jié)構(gòu)信息:
可以查看 MBG 生成的 StudentMapper
接口,發(fā)現(xiàn)已經(jīng)包含了基本的 CRUD 方法,具體 SQL 實(shí)現(xiàn)也已經(jīng)在 mapper.xml 中生成了,單表 CRUD 直接調(diào)用對(duì)應(yīng)方法即可滿(mǎn)足日常需求。同時(shí),生成的代碼中你還會(huì)發(fā)現(xiàn)有一個(gè)對(duì)應(yīng)的 StudentExample
類(lèi),可以將其理解為一個(gè)條件構(gòu)造器,用于構(gòu)建 SQL 語(yǔ)句中的各種條件。
2.6 基本 CRUD 操作
基于上述生成的代碼,我們的持久層任務(wù)也就完成了,接下來(lái)只需要編寫(xiě)對(duì)應(yīng)的控制層和業(yè)務(wù)邏輯層進(jìn)行合理的調(diào)用即可。例如下面是一個(gè)對(duì)應(yīng)的 StudentServiceImpl
業(yè)務(wù)邏輯層實(shí)現(xiàn)類(lèi):
/** * 學(xué)生業(yè)務(wù)實(shí)現(xiàn)類(lèi) */ @Service public class StudentServiceImpl implements StudentService { @Autowired private StudentMapper studentMapper; @Override public void save(Student student) { studentMapper.insert(student); } @Override public void update(Student student) { studentMapper.updateByPrimaryKeySelective(student); } @Override public void delete(Long id) { studentMapper.deleteByPrimaryKey(id); } @Override public Student select(Long id) { return studentMapper.selectByPrimaryKey(id); } @Override public List<Student> selectAll(int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); return studentMapper.selectByExample(new StudentExample()); } }
3.進(jìn)階使用 MyBatis Generator
除了上述的基本單表 CRDU 外,我們還可以通過(guò)諸如構(gòu)造條件、子查詢(xún)、分組、連接和使用高級(jí)映射等方式來(lái)利用好 MyBatis Generator。
在開(kāi)始之前,我們先介紹一下 Example
類(lèi)。MyBatis Generator (MBG) 為每個(gè)數(shù)據(jù)庫(kù)表生成了一個(gè)對(duì)應(yīng)的 Example
類(lèi)。Example
類(lèi)是一個(gè)很強(qiáng)大的工具,它主要用于生成動(dòng)態(tài) SQL 語(yǔ)句。
Example
類(lèi)允許你構(gòu)建復(fù)雜的 WHERE
子句,而無(wú)需直接在 mapper 文件中硬編碼 SQL,它包含了很多用于構(gòu)建 WHERE
子句的方法。每個(gè)方法都對(duì)應(yīng)一個(gè) SQL 比較運(yùn)算符,比如 “=
”, “<>
”, “>
”, “<
”, “LIKE
” 等。你可以動(dòng)態(tài)地添加、修改或刪除查詢(xún)條件。使用 Example
類(lèi),你可以構(gòu)建幾乎任何類(lèi)型的查詢(xún),包括帶有 AND
和 OR
子句的查詢(xún),帶有子查詢(xún)的查詢(xún)等。
在使用 Example
類(lèi)時(shí),你需要?jiǎng)?chuàng)建一個(gè) Example
對(duì)象,然后通過(guò)調(diào)用該對(duì)象的 createCriteria()
方法創(chuàng)建一個(gè) Criteria
對(duì)象。然后你可以在 Criteria
對(duì)象上調(diào)用各種方法來(lái)添加查詢(xún)條件。
3.1 基于條件的 CRUD
條件查詢(xún)、條件修改和條件刪除都可以通過(guò) Example
類(lèi)來(lái)實(shí)現(xiàn),每個(gè)生成的映射器都有一個(gè)相應(yīng)的 Example
類(lèi)。例如,對(duì)于我們上面測(cè)試的 Student
表,MBG 會(huì)生成一個(gè) StudentExample
類(lèi)。
我們可以通過(guò)創(chuàng)建一個(gè) StudentExample
對(duì)象,并添加條件來(lái)進(jìn)行查詢(xún),修改或刪除。
例如,要查詢(xún) ID 大于 10 的用戶(hù),你可以這樣做:
@Override public List<Student> selectByCondition() { // 構(gòu)建一個(gè) Example 對(duì)象 StudentExample example = new StudentExample(); // 添加條件 example.createCriteria().andIdGreaterThan(10L); // 執(zhí)行查詢(xún) return studentMapper.selectByExample(example); }
你也可以創(chuàng)建多個(gè) Criteria
對(duì)象,并通過(guò) OR
連接它們,來(lái)實(shí)現(xiàn)更復(fù)雜的查詢(xún)。例如,要查詢(xún) ID 大于 10 或?qū)W生姓名為 “john” 的用戶(hù),你可以這樣做:
@Override public List<Student> selectByCondition() { // 構(gòu)建一個(gè) Example 對(duì)象 StudentExample example = new StudentExample(); // 添加條件 example.or().andIdGreaterThan(10L); example.or().andNameEqualTo("john"); // 執(zhí)行查詢(xún) return studentMapper.selectByExample(example); }
此外,Example
類(lèi)也支持排序,你可以通過(guò)調(diào)用 Example
對(duì)象的 setOrderByClause
方法來(lái)添加排序條件。例如,要按照 ID 升序查詢(xún)用戶(hù),你可以這樣做:
@Override public List<Student> selectByCondition() { // 構(gòu)建一個(gè) Example 對(duì)象 StudentExample example = new StudentExample(); // 添加條件(desc 降序, asc 升序) example.setOrderByClause("id asc"); // 執(zhí)行查詢(xún) return studentMapper.selectByExample(example); }
對(duì)于條件修改和刪除,你也可以使用 Example
類(lèi)。例如,刪除 ID 大于 10 的用戶(hù):
@Override public void deleteByCondition() { // 構(gòu)建一個(gè) Example 對(duì)象 StudentExample example = new StudentExample(); // 添加條件 example.createCriteria().andIdGreaterThan(10L); // 執(zhí)行刪除 studentMapper.deleteByExample(example); }
可見(jiàn),Example
類(lèi)是一個(gè)非常有用的工具,它可以讓你的 SQL 查詢(xún)更加動(dòng)態(tài)和靈活。
TIP:
但是也需要注意,過(guò)度使用
Example
類(lèi)可能會(huì)導(dǎo)致你的代碼變得復(fù)雜和難以理解。因此,對(duì)于復(fù)雜的查詢(xún),有時(shí)直接編寫(xiě) SQL 可能是一個(gè)更好的選擇。
3.2 子查詢(xún)、Group 與 Join 查詢(xún)
MBG 主要用來(lái)生成簡(jiǎn)單的基于單表的 CRUD 操作的代碼。對(duì)于更復(fù)雜的 SQL 操作,比如子查詢(xún)、Group 查詢(xún)和 Join 查詢(xún),MBG 并不直接支持。這些復(fù)雜查詢(xún)需要你自己在 Mapper 的 xml 文件或基于注解編寫(xiě)相應(yīng)的 SQL。
3.3 一對(duì)一查詢(xún)、一對(duì)多查詢(xún)
一對(duì)一和一對(duì)多查詢(xún)?cè)?MBG 中也并不直接支持。一般來(lái)說(shuō),這兩種查詢(xún)都需要你在 Mapper 的 xml 文件中自定義 SQL 來(lái)實(shí)現(xiàn)。當(dāng)然,你也可以選擇使用基于注解的方式。這在高級(jí)查詢(xún)一文中我們已經(jīng)進(jìn)行過(guò)講解,忘記的回去復(fù)習(xí)以下即可。
到此這篇關(guān)于MyBatis Generator介紹及使用方法的文章就介紹到這了,更多相關(guān)MyBatis Generator內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Mybatis generator修改Mapper.java文件實(shí)現(xiàn)詳解
- MyBatis?Generator?ORM層面的代碼自動(dòng)生成器(推薦)
- 更簡(jiǎn)單更高效的Mybatis?Plus最新代碼生成器AutoGenerator
- MybatisX-Generator自動(dòng)代碼生成插件教程
- Mybatis代碼生成器Mybatis Generator(MBG)實(shí)戰(zhàn)詳解
- MyBatis-Plus中AutoGenerator的使用案例
- Mybatis-plus?代碼生成器?AutoGenerator?的簡(jiǎn)介和使用詳解
- Mybatis-Plus開(kāi)發(fā)提速器generator的使用
- MyBatis Generator配置入門(mén)
- mybatis-generator-gui根據(jù)需求改動(dòng)示例
- MyBatis?Generator使用小結(jié)
相關(guān)文章
springboot整合RabbitMQ 中的 TTL實(shí)例代碼
TTL 是 RabbitMQ 中一個(gè)消息或者隊(duì)列的屬性,表明一條消息或者該隊(duì)列中的所有消息的最大存活時(shí)間,單位是毫秒,這篇文章主要介紹了springboot整合RabbitMQ 中的 TTL,需要的朋友可以參考下2022-09-09Java多線程--讓主線程等待所有子線程執(zhí)行完畢在執(zhí)行
Java主線程等待所有子線程執(zhí)行完畢在執(zhí)行,其實(shí)在我們的工作中經(jīng)常的用到,本篇文章就介紹了Java多線程--讓主線程等待所有子線程執(zhí)行完畢在執(zhí)行,有需要的可以了解一下。2016-11-11intelliJ IDEA 多行選中相同內(nèi)容的快捷鍵分享
這篇文章主要介紹了intelliJ IDEA 多行選中相同內(nèi)容的快捷鍵分享,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02java實(shí)現(xiàn)pgsql自動(dòng)更新創(chuàng)建時(shí)間與更新時(shí)間的兩種方式小結(jié)
本文主要介紹了java實(shí)現(xiàn)pgsql自動(dòng)更新創(chuàng)建時(shí)間與更新時(shí)間的兩種方式小結(jié),主要包括通過(guò)數(shù)據(jù)庫(kù)自身實(shí)現(xiàn)以及通過(guò)mybatisplus的TableField注解添加,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01MyBatis?Generator生成的$?sql是否存在注入風(fēng)險(xiǎn)詳解
這篇文章主要介紹了MyBatis?Generator生成的$?sql是否存在注入風(fēng)險(xiǎn)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12利用Java中Calendar計(jì)算兩個(gè)日期之間的天數(shù)和周數(shù)
Java 語(yǔ)言的Calendar(日歷),Date(日期),和DateFormat(日期格式)組成了Java標(biāo)準(zhǔn)的一個(gè)基本但是非常重要的部分。日期是商業(yè)邏輯計(jì)算一個(gè)關(guān)鍵的部分。下面這篇文章就給大家介紹了如何利用Java中Calendar計(jì)算兩個(gè)日期之間的天數(shù)和周數(shù),下面來(lái)一起看看吧。2016-12-12基于Springboot+Vue實(shí)現(xiàn)的在線答題闖關(guān)系統(tǒng)全過(guò)程
這篇文章主要介紹了基于Springboot+Vue實(shí)現(xiàn)的在線答題闖關(guān)系統(tǒng)的相關(guān)資料,文中包括前端Vue.js、后端SpringBoot及MySQL數(shù)據(jù)庫(kù)的使用,系統(tǒng)功能涵蓋順序出題、體型練習(xí)、隨機(jī)出題、錯(cuò)題本、收藏題和答題統(tǒng)計(jì)等,需要的朋友可以參考下2024-12-12