亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MyBatis Generator介紹及使用方法

 更新時(shí)間:2023年06月02日 09:01:36   作者:javgo.cn  
MyBatis Generator 是一款針對(duì) MyBatis 或 iBATIS 設(shè)計(jì)的代碼生成器,由 MyBatis 官方提供,這篇文章主要介紹了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è)目錄路徑。 例如,如果配置中的 targetProjectsrc/main/java,而 targetPackagecn.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),包括帶有 ANDOR 子句的查詢(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • java 方法與數(shù)組基礎(chǔ)使用詳解

    java 方法與數(shù)組基礎(chǔ)使用詳解

    Java語(yǔ)言中的“方法”(Method)在其他語(yǔ)言當(dāng)中也可能被稱(chēng)為“函數(shù)”(Function),數(shù)組對(duì)于每一門(mén)編程語(yǔ)言來(lái)說(shuō)都是重要的數(shù)據(jù)結(jié)構(gòu)之一,當(dāng)然不同語(yǔ)言對(duì)數(shù)組的實(shí)現(xiàn)及處理也不盡相同。Java 語(yǔ)言中提供的數(shù)組是用來(lái)存儲(chǔ)固定大小的同類(lèi)型元素
    2022-04-04
  • springboot整合RabbitMQ 中的 TTL實(shí)例代碼

    springboot整合RabbitMQ 中的 TTL實(shí)例代碼

    TTL 是 RabbitMQ 中一個(gè)消息或者隊(duì)列的屬性,表明一條消息或者該隊(duì)列中的所有消息的最大存活時(shí)間,單位是毫秒,這篇文章主要介紹了springboot整合RabbitMQ 中的 TTL,需要的朋友可以參考下
    2022-09-09
  • Java SPEL表達(dá)式注入漏洞原理解析

    Java SPEL表達(dá)式注入漏洞原理解析

    SpEL簡(jiǎn)稱(chēng)Spring表達(dá)式語(yǔ)言,在Spring 3中引入,SpEL能在運(yùn)行時(shí)構(gòu)建復(fù)雜表達(dá)式、存取對(duì)象圖屬性、對(duì)象方法調(diào)用等等,可以與基于XML和基于注解的Spring配置還有bean定義一起使用,本文給大家介紹Java SPEL表達(dá)式注入漏洞原理研究,感興趣的朋友一起看看吧
    2023-10-10
  • Java如何獲取Date的“昨天”與“明天”示例代碼

    Java如何獲取Date的“昨天”與“明天”示例代碼

    最近在做項(xiàng)目的時(shí)候用到Date和Calendar比較多,而且用到的方式也比較全,突然想到一個(gè)問(wèn)題,Java如何獲取Date的"昨天"與"明天",也就是前一天和后一天呢?思考后寫(xiě)出了方法,想著萬(wàn)一以后用到,就總結(jié)出來(lái),也方便有需要的朋友們參考借鑒,下面來(lái)一起看看吧。
    2016-12-12
  • Java多線程--讓主線程等待所有子線程執(zhí)行完畢在執(zhí)行

    Java多線程--讓主線程等待所有子線程執(zhí)行完畢在執(zhí)行

    Java主線程等待所有子線程執(zhí)行完畢在執(zhí)行,其實(shí)在我們的工作中經(jīng)常的用到,本篇文章就介紹了Java多線程--讓主線程等待所有子線程執(zhí)行完畢在執(zhí)行,有需要的可以了解一下。
    2016-11-11
  • intelliJ IDEA 多行選中相同內(nèi)容的快捷鍵分享

    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é)

    本文主要介紹了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)詳解

    這篇文章主要介紹了MyBatis?Generator生成的$?sql是否存在注入風(fēng)險(xiǎn)詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • 利用Java中Calendar計(jì)算兩個(gè)日期之間的天數(shù)和周數(shù)

    利用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ò)程

    這篇文章主要介紹了基于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

最新評(píng)論