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)入依賴
首先,我們需要在項(xiàng)目中添加 MyBatis Generator 的依賴:
<!-- MyBatis 生成器 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>${mybatis-generator.version}</version>
</dependency>當(dāng)然,為了完成的完成整套流程,我們還需要一些相關(guān)的其他依賴,如 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è)置用戶配置的參數(shù)
* @param properties 用戶配置的參數(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)的依賴:
<!-- 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)方法即可滿足日常需求。同時(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)造條件、子查詢、分組、連接和使用高級(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)地添加、修改或刪除查詢條件。使用 Example 類(lèi),你可以構(gòu)建幾乎任何類(lèi)型的查詢,包括帶有 AND 和 OR 子句的查詢,帶有子查詢的查詢等。
在使用 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)添加查詢條件。
3.1 基于條件的 CRUD
條件查詢、條件修改和條件刪除都可以通過(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)行查詢,修改或刪除。
例如,要查詢 ID 大于 10 的用戶,你可以這樣做:
@Override
public List<Student> selectByCondition() {
// 構(gòu)建一個(gè) Example 對(duì)象
StudentExample example = new StudentExample();
// 添加條件
example.createCriteria().andIdGreaterThan(10L);
// 執(zhí)行查詢
return studentMapper.selectByExample(example);
} 你也可以創(chuàng)建多個(gè) Criteria 對(duì)象,并通過(guò) OR 連接它們,來(lái)實(shí)現(xiàn)更復(fù)雜的查詢。例如,要查詢 ID 大于 10 或?qū)W生姓名為 “john” 的用戶,你可以這樣做:
@Override
public List<Student> selectByCondition() {
// 構(gòu)建一個(gè) Example 對(duì)象
StudentExample example = new StudentExample();
// 添加條件
example.or().andIdGreaterThan(10L);
example.or().andNameEqualTo("john");
// 執(zhí)行查詢
return studentMapper.selectByExample(example);
}此外,Example 類(lèi)也支持排序,你可以通過(guò)調(diào)用 Example 對(duì)象的 setOrderByClause 方法來(lái)添加排序條件。例如,要按照 ID 升序查詢用戶,你可以這樣做:
@Override
public List<Student> selectByCondition() {
// 構(gòu)建一個(gè) Example 對(duì)象
StudentExample example = new StudentExample();
// 添加條件(desc 降序, asc 升序)
example.setOrderByClause("id asc");
// 執(zhí)行查詢
return studentMapper.selectByExample(example);
}對(duì)于條件修改和刪除,你也可以使用 Example 類(lèi)。例如,刪除 ID 大于 10 的用戶:
@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 查詢更加動(dòng)態(tài)和靈活。
TIP:
但是也需要注意,過(guò)度使用
Example類(lèi)可能會(huì)導(dǎo)致你的代碼變得復(fù)雜和難以理解。因此,對(duì)于復(fù)雜的查詢,有時(shí)直接編寫(xiě) SQL 可能是一個(gè)更好的選擇。
3.2 子查詢、Group 與 Join 查詢
MBG 主要用來(lái)生成簡(jiǎn)單的基于單表的 CRUD 操作的代碼。對(duì)于更復(fù)雜的 SQL 操作,比如子查詢、Group 查詢和 Join 查詢,MBG 并不直接支持。這些復(fù)雜查詢需要你自己在 Mapper 的 xml 文件或基于注解編寫(xiě)相應(yīng)的 SQL。
3.3 一對(duì)一查詢、一對(duì)多查詢
一對(duì)一和一對(duì)多查詢?cè)?MBG 中也并不直接支持。一般來(lái)說(shuō),這兩種查詢都需要你在 Mapper 的 xml 文件中自定義 SQL 來(lái)實(shí)現(xiàn)。當(dāng)然,你也可以選擇使用基于注解的方式。這在高級(jí)查詢一文中我們已經(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-09
Java多線程--讓主線程等待所有子線程執(zhí)行完畢在執(zhí)行
Java主線程等待所有子線程執(zhí)行完畢在執(zhí)行,其實(shí)在我們的工作中經(jīng)常的用到,本篇文章就介紹了Java多線程--讓主線程等待所有子線程執(zhí)行完畢在執(zhí)行,有需要的可以了解一下。2016-11-11
intelliJ IDEA 多行選中相同內(nèi)容的快捷鍵分享
這篇文章主要介紹了intelliJ IDEA 多行選中相同內(nèi)容的快捷鍵分享,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
java實(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-01
MyBatis?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

