Mybatis逆向工程詳解(附源碼文件)動態創建實體類、條件擴展類、Mapper接口、Mapper.xml映射文件

今天呢,博主的學習進度也是步入了Java Mybatis 框架,目前正在逐步楊帆旗航。

那么接下來就給大家出一期有關?Mybatis 逆向工程的教學,希望能對大家有所幫助,也特別歡迎大家指點不足之處,小生很樂意接受正確的建議,那么話不多說直接上教程👏👏👏!!!

目錄

正向工程 與 逆向工程

1、什么是Mybatis逆向工程

MyBatis 逆向工程使用注意事項

2、逆向工程生成代碼

①、首先創建maven項目

②、創建日志文件log4j.properties

③、創建generatorConfig.xml配置文件

④、創建逆向工程核心生成代碼GeneratorSql.java

⑤、運行逆向工程生成代碼

3、逆向工程舉例

(1)、EmpMapper接口生成的方法介紹:

測試不帶條件的方法:

(2)、EmpExample條件擴展類介紹:

說明:

簡單舉例:

源碼地址:


正向工程 與 逆向工程

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

  • 逆向工程:先創建數據庫表,由框架負責根據數據庫表,反向生成Java實體類、Mapper接口、Mapper配置文件

1、什么是Mybatis逆向工程

MyBatis逆向工程是一種自動化生成代碼的工具,它能夠根據數據庫表結構自動創建對應的Java實體類、Mapper接口以及Mapper映射文件。

在MyBatis開發中,我們通常需要手動編寫實體類、Mapper接口和XML映射文件,尤其是當數據庫表較多或字段復雜時,這種重復性工作不僅效率低下,還容易因人為疏忽導致錯誤。例如,字段類型不匹配、遺漏字段或拼寫錯誤等問題,排查起來相當耗時。

為了解決這一問題,MyBatis逆向工程應運而生。它通過掃描數據庫表結構,自動生成標準化的基礎代碼,極大地減少了開發者的手動編碼量,尤其適用于單表CRUD操作。這不僅提升了開發效率,也降低了出錯概率,讓開發者能更專注于業務邏輯的實現。

MyBatis 逆向工程使用注意事項

1. 避免直接在原項目中使用逆向工程

  • 風險:?逆向工程生成的代碼(如?User.javaUserMapper.javaUserMapper.xml)可能會覆蓋原有文件,導致手動編寫的業務邏輯丟失。

  • 解決方案:

    • 新建一個臨時項目,專門用于運行逆向工程生成代碼。

    • 生成后,手動復制所需文件到目標項目,避免直接覆蓋。

2. 生成代碼后需檢查調整

  • 自定義邏輯可能被覆蓋:生成的?Mapper.xml?文件會包含基本的 CRUD 方法,如果原文件已有自定義 SQL(如復雜查詢、關聯查詢),直接覆蓋會導致功能失效。

  • 建議:

    • 僅復制新增的實體類或 Mapper 接口,避免覆蓋已有業務代碼。

    • 使用?@Mapper?掃描 + 自定義 XML?的方式,分離自動生成代碼和手動編寫代碼。

3.版本管理(Git)備份:在運行逆向工程前,確保代碼已提交到 Git,避免意外覆蓋導致不可逆的損失。

2、逆向工程生成代碼

①、首先創建maven項目

項目整體目錄:

導入maven依賴:

<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"><modelVersion>4.0.0</modelVersion>
?<!--組織名稱--><groupId>com.nanji</groupId><!--項目唯一標識--><artifactId>GeneratorSql</artifactId><!--版本號--><version>1.0</version><!--打包方式--><packaging>jar</packaging>
?<!--項目名稱(顯示用)--><name>GeneratorSql</name><!--項目的url地址--><url>https://maven.apache.org</url>
?<!--聲明可在pom文件中可以使用的鍵值對變量(用:${}引用)例如:${poject.build.sourceEncoding},值:UTF-8--><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties>
?<!--以來列表容器,用來存放依賴的jar包--><dependencies><!--dependency:依賴項groupId:依賴項的組IDartifactId:依賴項的IDversion:依賴項的版本-->
?<!--mybatis jar包--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.11</version></dependency>
?<!--mysql驅動 jar包--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency>
?<!--log4j日志 jar包--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency></dependencies>
?<!-- 控制Maven在構建過程中相關配置 --><build><!-- 構建過程中用到的插件 --><plugins><!--plugin:具體插件,逆向工程的操作是以構建過程中插件形式出現的groupId:插件的組IDartifactId:插件的ID--><plugin><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-maven-plugin</artifactId><version>1.4.0</version><!-- 插件的依賴列表容器 --><dependencies><!-- 逆向工程的核心依賴 --><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><version>1.4.0</version></dependency><!-- 數據庫連接池 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.24</version></dependency>
?<!-- MySQL驅動 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency></dependencies></plugin></plugins></build>
</project>

②、創建日志文件log4j.properties

# 配置日志輸出到控制臺(STDOUT)
log4j.appender.STDOUT=org.apache.log4j.ConsoleAppender
log4j.appender.STDOUT.Encoding=UTF-8
log4j.appender.STDOUT.layout=org.apache.log4j.PatternLayout
log4j.appender.STDOUT.layout.ConversionPattern=%-5p %d{MM-dd HH:mm:ss,SSS} %m  (%F:%L) \n
?
# 設置 java.sql 的日志級別為 debug
log4j.logger.java.sql=debug
?
# 設置 org.apache.ibatis 的日志級別為 info
log4j.logger.org.apache.ibatis=info
?
# 配置根日志記錄器,日志級別為 debug,輸出到 STDOUT
log4j.rootLogger=debug, STDOUT

③、創建generatorConfig.xml配置文件

文件名必須是 generatorConfig.xml

<?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><!-- targetRuntime: 執行生成的逆向工程的版本MyBatis3Simple: 生成基本的CRUD(清新簡潔版)MyBatis3: 生成帶條件的CRUD(奢華尊享版) --><context id="DB2Tables" targetRuntime="MyBatis3"><!--TODO 配置自己的數據庫連接信息:驅動類、連接地址、用戶名、密碼連接地址中的 &amp; 實際上就是 & 符號的轉義字符,由于 xml 文件中直接寫 & 時,xml 解析器會認為 & 后面的是實體,從而報錯--><jdbcConnectiondriverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=Asia/Shanghai"userId="nanji"password="123456"></jdbcConnection><!--默認false:把JDBC DECIMAL 和 NUMERIC 類型解析為 Integer,為true時:把JDBC DECIMAL 和 NUMERIC 類型解析為 java.math.BigDecimal--><javaTypeResolver><property name="forceBigDecimals" value="false"/></javaTypeResolver><!--javaBean的生成策略targetProject:POJO類生成的位置--><javaModelGenerator targetPackage="com.nanji.mybatis.pojo" targetProject=".\src\main\java"><!-- enableSubPackages:是否讓schema作為包的后綴 --><property name="enableSubPackages" value="true"/><!-- 從數據庫返回的值被清理前后的空格 --><property name="trimStrings" value="true"/></javaModelGenerator><!--SQL映射文件的生成策略targetProject:mapper映射文件生成的位置--><sqlMapGenerator targetPackage="com.nanji.mybatis.mapper" targetProject=".\src\main\resources"><!-- enableSubPackages:是否讓schema作為包的后綴 --><property name="enableSubPackages" value="true"/></sqlMapGenerator><!--Mapper接口的生成策略targetPackage:mapper接口生成的位置--><javaClientGenerator type="XMLMAPPER" targetPackage="com.nanji.mybatis.mapper"targetProject=".\src\main\java"><!-- enableSubPackages:是否讓schema作為包的后綴 --><property name="enableSubPackages" value="true"/></javaClientGenerator><!-- 逆向分析的表 --><!-- tableName設置為*號,可以對應所有表,此時不寫domainObjectName --><!-- domainObjectName屬性指定生成出來的實體類的類名 --><table tableName="t_emp" domainObjectName="Emp"><!--property:實體類屬性名columnOverride:對數據庫字段的設置column:數據庫字段名javaType:實體類屬性的數據類型--><!--<property column="" javaType=""/>--></table><table tableName="t_dept" domainObjectName="Dept"/></context>
</generatorConfiguration>

注意:數據庫連接地址中的?&amp; 實際上就是 & 符號的轉義字符,由于 xml 文件中直接寫 & 時,xml 解析器會認為 & 后面的是實體,從而報錯

<jdbcConnectiondriverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=Asia/Shanghai"userId="nanji"password="123456">
</jdbcConnection>

還有就是不同的數據庫中不能含有相同的表,例如數據庫A有t_user表,數據庫B也有t_user表,那么到時候代碼不知道生成哪個

④、創建逆向工程核心生成代碼GeneratorSql.java

package com.nanji;
?
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.File;
import java.util.ArrayList;
import java.util.List;
?
/*** @version 1.0* @ClassName GeneratorSql* @Description 逆向工程生成代碼的核心類* @Author NanJi* @Date 2025/6/10 : 16:01*/
public class GeneratorSql {// 執行main方法以生成代碼public static void main(String[] args) {try {GeneratorSql generatorSql = new GeneratorSql();generatorSql.generator();} catch (Exception e) {e.printStackTrace();}}
?public void generator() throws Exception {List<String> warnings = new ArrayList<>();boolean overwrite = true;// 指定逆向工程配置文件String file = GeneratorSql.class.getResource("/generatorConfig.xml").getFile();System.out.println(file);File configFile = new File(file);ConfigurationParser cp = new ConfigurationParser(warnings);Configuration config = cp.parseConfiguration(configFile);DefaultShellCallback callback = new DefaultShellCallback(overwrite);MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);myBatisGenerator.generate(null);}
}

⑤、運行逆向工程生成代碼

運行上面的程序,如果控制臺打印了如下日志,說明生成代碼成功了。

或者

使用maven插件進行代碼生成

如果控制臺打印了如下日志,說明生成代碼成功了。

然后我們的項目結構會發生變化,生成了如下文件:

3、逆向工程舉例

首先我們將上面生成的文件復制到目標項目中。在使用逆向工程舉例之前,先來介紹生成的文件有哪些東西:

(1)、EmpMapper接口生成的方法介紹:

方法說明
long countByExample(EmpExample example);按條件計數
int deleteByExample(EmpExample example);按條件刪除
int deleteByPrimaryKey(Integer empid);按主鍵刪除
int insert(Emp record);插入數據(返回值為ID)
int insertSelective(Emp record);插入數據,只插入值不為null的字段,內部動態sql判斷
List<Emp> selectByExample(EmpExample example);按條件查詢,傳入null表示查詢所有
Emp selectByPrimaryKey(Integer empid);按主鍵查詢
int updateByExampleSelective(@Param("record") Emp record, @Param("example") EmpExample example);按條件更新值不為null的字段
int updateByExample(@Param("record") Emp record, @Param("example") EmpExample example);按條件更新
int updateByPrimaryKeySelective(Emp record);按主鍵更新值不為null的字段
int updateByPrimaryKey(Emp record);按主鍵更新
測試不帶條件的方法:
package com.nanji.mybatis.mapper;
?
?
import com.nanji.mybatis.pojo.Emp;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
?
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
?
public class EmpMapperTest {//定義 SqlSessionprivate SqlSession sqlSession = null;//定義 EmpMapper對象private EmpMapper mapper = null;
?@Before//在測試方法執行之前執行public void getSqlSession() {//1、加載 mybatis 全局配置文件InputStream is = EmpMapperTest.class.getClassLoader().getResourceAsStream("mybatis-config.xml");//2、創建SqlSessionFactory對象SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);//3、根據 sqlSessionFactory 產生sessionsqlSession = sqlSessionFactory.openSession();//4、創建Mapper接口的的代理對象,getMapper方法底層會通過動態代理生成EmpMapper的代理實現類mapper = sqlSession.getMapper(EmpMapper.class);}
?@After//在測試方法執行完成之后執行public void destroy() throws IOException {sqlSession.commit();sqlSession.close();}
?//查詢所有用戶信息@Testpublic void selectAllUser() {List<Emp> Emps = mapper.selectByExample(null);//傳入null表示查詢所有for (Emp Emp : Emps) {System.out.println(Emp);}}
?//根據用戶id查詢用戶@Testpublic void selectByUserId() {Emp Emp = mapper.selectByPrimaryKey(1);System.out.println(Emp);}
?//添加用戶信息@Testpublic void inserEmp() {Emp Emp = new Emp();Emp.setEmpName("凡爾賽");Emp.setAge(18);Emp.setSex("男");Emp.setEmail("piaoliang@gmail.com");Emp.setDeptid(1);int i = mapper.insertSelective(Emp);System.out.println(i > 0 ? "添加成功" : "添加失敗");}
?//更新用戶信息@Testpublic void updateUser() {Emp Emp = new Emp();Emp.setEmpid(15); ? //這里要設置id才能修改成功,否則不知道修改哪一條數據Emp.setEmpName("奧德賽");Emp.setAge(18);Emp.setSex("男");Emp.setEmail("aodesai@gmail.com");Emp.setDeptid(1);int i = mapper.updateByPrimaryKeySelective(Emp);System.out.println(i > 0 ? "修改成功" : "修改失敗");}
?//刪除用戶信息@Testpublic void deleteUser() {int i = mapper.deleteByPrimaryKey(8);System.out.println(i > 0 ? "刪除成功" : "刪除失敗");}
}

(2)、EmpExample條件擴展類介紹:

上面的測試方法是不帶條件的操作,那么接下來學習一下按條件如何進行增刪改查操作,我們在逆向工程中已經生成了這個類EmpExample,這個類就是一個條件擴展類,里面定義了一系列方法用來做條件,比如:排序、去重、大于、小于、等于、模糊查詢、數據在某某之間等等。

我們在EmpExample類中可以看到定義了一個內部類GeneratedCriteria,這個內部類就定義了一系列條件的方法,這些條件最后都會拼接在SQL中,但是我們一般不用它,都用它的子類Criteria來進行操作,Criteria繼承了內部類GeneratedCriteria。

方法說明
isValid()判斷當前查詢條件列表是否非空,即是否有有效的查詢條件
getAllCriteria()獲取所有的查詢條件(Criterion 對象列表)
getCriteria()獲取當前查詢條件列表
addCriterion(String condition)添加一個無參數的查詢條件(如 "empId is null"
addCriterion(String condition, Object value, String property)添加一個帶單個值的查詢條件,并校驗值是否為空
addCriterion(String condition, Object value1, Object value2, String property)添加一個區間類型的查詢條件(如 BETWEEN),并校驗兩個值是否都非空
andEmpidIsNull()添加 empId IS NULL 查詢條件
andEmpidIsNotNull()添加 empId IS NOT NULL 查詢條件
andEmpidEqualTo(Integer value)添加 empId = value 查詢條件
andEmpidNotEqualTo(Integer value)添加 empId <> value 查詢條件
andEmpidGreaterThan(Integer value)添加 empId > value 查詢條件
andEmpidGreaterThanOrEqualTo(Integer value)添加 empId >= value 查詢條件
andEmpidLessThan(Integer value)添加 empId < value 查詢條件
andEmpidLessThanOrEqualTo(Integer value)添加 empId <= value 查詢條件
andEmpidIn(List<Integer> values)添加 empId IN (values) 查詢條件
andEmpidNotIn(List<Integer> values)添加 empId NOT IN (values) 查詢條件
andEmpidBetween(Integer value1, Integer value2)添加 empId BETWEEN value1 AND value2 查詢條件
andEmpidNotBetween(Integer value1, Integer value2)添加 empId NOT BETWEEN value1 AND value2 查詢條件
andEmpNameIsNull()添加 emp_name IS NULL 查詢條件
andEmpNameIsNotNull()添加 emp_name IS NOT NULL 查詢條件
andEmpNameEqualTo(String value)添加 emp_name = value 查詢條件
andEmpNameNotEqualTo(String value)添加 emp_name <> value 查詢條件
andEmpNameGreaterThan(String value)添加 emp_name > value 查詢條件
andEmpNameGreaterThanOrEqualTo(String value)添加 emp_name >= value 查詢條件
andEmpNameLessThan(String value)添加 emp_name < value 查詢條件
andEmpNameLessThanOrEqualTo(String value)添加 emp_name <= value 查詢條件
andEmpNameLike(String value)添加 emp_name LIKE value 查詢條件
andEmpNameNotLike(String value)添加 emp_name NOT LIKE value 查詢條件
andEmpNameIn(List<String> values)添加 emp_name IN (values) 查詢條件
andEmpNameNotIn(List<String> values)添加 emp_name NOT IN (values) 查詢條件
andEmpNameBetween(String value1, String value2)添加 emp_name BETWEEN value1 AND value2 查詢條件
andEmpNameNotBetween(String value1, String value2)添加 emp_name NOT BETWEEN value1 AND value2 查詢條件
andAgeIsNull()添加 age IS NULL 查詢條件
andAgeIsNotNull()添加 age IS NOT NULL 查詢條件
andAgeEqualTo(Integer value)添加 age = value 查詢條件
andAgeNotEqualTo(Integer value)添加 age <> value 查詢條件
andAgeGreaterThan(Integer value)添加 age > value 查詢條件
andAgeGreaterThanOrEqualTo(Integer value)添加 age >= value 查詢條件
andAgeLessThan(Integer value)添加 age < value 查詢條件
andAgeLessThanOrEqualTo(Integer value)添加 age <= value 查詢條件
andAgeIn(List<Integer> values)添加 age IN (values) 查詢條件
andAgeNotIn(List<Integer> values)添加 age NOT IN (values) 查詢條件
andAgeBetween(Integer value1, Integer value2)添加 age BETWEEN value1 AND value2 查詢條件
andAgeNotBetween(Integer value1, Integer value2)添加 age NOT BETWEEN value1 AND value2 查詢條件
andSexIsNull()添加 sex IS NULL 查詢條件
andSexIsNotNull()添加 sex IS NOT NULL 查詢條件
andSexEqualTo(String value)添加 sex = value 查詢條件
andSexNotEqualTo(String value)添加 sex <> value 查詢條件
andSexGreaterThan(String value)添加 sex > value 查詢條件
andSexGreaterThanOrEqualTo(String value)添加 sex >= value 查詢條件
andSexLessThan(String value)添加 sex < value 查詢條件
andSexLessThanOrEqualTo(String value)添加 sex <= value 查詢條件
andSexLike(String value)添加 sex LIKE value 查詢條件
andSexNotLike(String value)添加 sex NOT LIKE value 查詢條件
andSexIn(List<String> values)添加 sex IN (values) 查詢條件
andSexNotIn(List<String> values)添加 sex NOT IN (values) 查詢條件
andSexBetween(String value1, String value2)添加 sex BETWEEN value1 AND value2 查詢條件
andSexNotBetween(String value1, String value2)添加 sex NOT BETWEEN value1 AND value2 查詢條件
andEmailIsNull()添加 email IS NULL 查詢條件
andEmailIsNotNull()添加 email IS NOT NULL 查詢條件
andEmailEqualTo(String value)添加 email = value 查詢條件
andEmailNotEqualTo(String value)添加 email <> value 查詢條件
andEmailGreaterThan(String value)添加 email > value 查詢條件
andEmailGreaterThanOrEqualTo(String value)添加 email >= value 查詢條件
andEmailLessThan(String value)添加 email < value 查詢條件
andEmailLessThanOrEqualTo(String value)添加 email <= value 查詢條件
andEmailLike(String value)添加 email LIKE value 查詢條件
andEmailNotLike(String value)添加 email NOT LIKE value 查詢條件
andEmailIn(List<String> values)添加 email IN (values) 查詢條件
andEmailNotIn(List<String> values)添加 email NOT IN (values) 查詢條件
andEmailBetween(String value1, String value2)添加 email BETWEEN value1 AND value2 查詢條件
andEmailNotBetween(String value1, String value2)添加 email NOT BETWEEN value1 AND value2 查詢條件
andDeptidIsNull()添加 deptId IS NULL 查詢條件
andDeptidIsNotNull()添加 deptId IS NOT NULL 查詢條件
andDeptidEqualTo(Integer value)添加 deptId = value 查詢條件
andDeptidNotEqualTo(Integer value)添加 deptId <> value 查詢條件
andDeptidGreaterThan(Integer value)添加 deptId > value 查詢條件
andDeptidGreaterThanOrEqualTo(Integer value)添加 deptId >= value 查詢條件
andDeptidLessThan(Integer value)添加 deptId < value 查詢條件
andDeptidLessThanOrEqualTo(Integer value)添加 deptId <= value 查詢條件
andDeptidIn(List<Integer> values)添加 deptId IN (values) 查詢條件
andDeptidNotIn(List<Integer> values)添加 deptId NOT IN (values) 查詢條件
andDeptidBetween(Integer value1, Integer value2)添加 deptId BETWEEN value1 AND value2 查詢條件
andDeptidNotBetween(Integer value1, Integer value2)添加 deptId NOT BETWEEN value1 AND value2 查詢條件
說明:
  • 所有 andXXX 方法均用于構建針對 t_emp 表中字段的查詢條件。

  • 這些方法基于 MyBatis Generator 自動生成,常用于動態 SQL 查詢,配合 MyBatis 框架使用。

  • Criteria 繼承自 GeneratedCriteria,提供對外使用的 API。

簡單舉例:
package com.nanji.mybatis.mapper;
?
?
import com.nanji.mybatis.pojo.Emp;
import com.nanji.mybatis.pojo.EmpExample;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
?
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
?
public class EmpMapperExampleTest {
?//定義 SqlSessionprivate SqlSession sqlSession = null;//定義 UserMapper對象private EmpMapper mapper = null;
?@Before//在測試方法執行之前執行public void getSqlSession() {//1、加載 mybatis 全局配置文件InputStream is = EmpMapperExampleTest.class.getClassLoader().getResourceAsStream("mybatis-config.xml");//2、創建SqlSessionFactory對象SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);//3、根據 sqlSessionFactory 產生sessionsqlSession = sqlSessionFactory.openSession();//4、創建Mapper接口的的代理對象,getMapper方法底層會通過動態代理生成UserMapper的代理實現類mapper = sqlSession.getMapper(EmpMapper.class);}
?@After//在測試方法執行完成之后執行public void destroy() throws IOException {sqlSession.commit();sqlSession.close();}
?//模糊查詢用戶信息@Testpublic void selecEmpLike() {EmpExample example = new EmpExample();EmpExample.Criteria criteria = example.createCriteria();//模糊條件criteria.andEmpNameLike("%三%");/*sql語句相當于:select id, username, age, birthday, sex, address from t_user WHERE ( username like ? )*/List<Emp> Emps = mapper.selectByExample(example);for (Emp Emp : Emps) {System.out.println(Emp);}}
?//查詢年齡在18-30歲之間的用戶信息@Testpublic void selecEmpBetween() {EmpExample example = new EmpExample();EmpExample.Criteria criteria = example.createCriteria();//Between條件criteria.andAgeBetween(18, 30);example.or(criteria);example.setDistinct(true);/*sql語句相當于:select distinct id, username, age, birthday, sex, address from t_user WHERE ( age between ? and ? ) or( age between ? and ? )*/List<Emp> Emps = mapper.selectByExample(example);for (Emp Emp : Emps) {System.out.println(Emp);}}
?//查詢用戶名A或B@Testpublic void selecEmpOr() {EmpExample example = new EmpExample();EmpExample.Criteria criteria1 = example.createCriteria();criteria1.andEmpNameEqualTo("黃飛鴻");
?EmpExample.Criteria criteria2 = example.createCriteria();criteria2.andEmpNameEqualTo("馬保國");//將criteria2條件拼接在 or 關鍵字字后面example.or(criteria2);/*sql語句相當于:select id, username, age, birthday, sex, addressfrom t_user WHERE ( username = ? ) or( username = ? )*/List<Emp> Emps = mapper.selectByExample(example);for (Emp Emp : Emps) {System.out.println(Emp);}}
?//根據用戶名刪除用戶@Testpublic void deleteUserExample() {EmpExample example = new EmpExample();EmpExample.Criteria criteria = example.createCriteria();criteria.andEmpNameEqualTo("凡爾賽");//sql語句相當于:delete from t_user WHERE ( username = ? )int i = mapper.deleteByExample(example);System.out.println(i > 0 ? "刪除成功" : "刪除失敗");}
}

源碼地址:

【免費】JavaMybatis框架之Mybatis逆向工程動態生成代碼,POJO類、Mapper接口、Mapper.xml映射文件資源-CSDN文庫https://download.csdn.net/download/ouhexie/90974154?spm=1001.2014.3001.5501

歐了,到這里我應該解釋的差不多啦,我是南極,大膽做自己,活出精彩的人生👊👊👊

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

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

相關文章

android studio中修改java邏輯對應配置的xml文件

在android studio新建一個activity&#xff0c;自動生成一個xml&#xff0c;可以更改到另一個xml嗎&#xff1f; 可以。 新建一個activity&#xff1a; 如下 上圖中的activity_second為xml文件&#xff0c;SecondActivity為java文件。點擊后&#xff0c; AndroidManifest.x…

@SchedulerLock處理Spring Task在分布式環境下的重復執行問題

本文大綱&#x1f4d6; 1、背景&#x1f342;2、SchedulerLock注解3、實現原理 1、背景&#x1f342; Spring生態下&#xff0c;日常開發定時任務&#xff0c;使用Spring Task框架還是很常見的選擇&#xff0c;但Spring Task并不是為分布式環境設計的&#xff0c;分布式環境下…

Prompt工程指南中文版

Prompt-Engineering-Guide-zh Prompt工程指南中文版 github 本文翻譯改編自 Dair-ai/Prompt-Engineering-Guide 中文原帖地址為 大型語言模型Prompt書寫指南 為了方便理解以及補充缺少的知識點&#xff0c;內容有所添改。除非另有說明&#xff0c;本文中所有的例子都是使用te…

「pandas 與 numpy」數據分析與處理全流程【數據分析全棧攻略:爬蟲+處理+可視化+報告】

- 第 106 篇 - Date: 2025 - 06 - 12 Author: 鄭龍浩&#xff08;仟墨&#xff09; 文中使用的所有文件在文章頂部的資源展示 數據分析與處理 「pandas 與 numpy」 文章目錄 數據分析與處理 「pandas 與 numpy」一了解數據處理1 數據處理2 數據分析第三方庫 二 numpy1 基本介紹…

Fastapi + vue3 自動化測試平臺(6):AI + Web UI的完美結合

&#x1f916;? AI Web自動化革命&#xff1a;用自然語言重塑測試體驗&#xff01; 基于FastAPI Vue3的下一代Web自動化測試平臺誕生&#xff01;將大語言模型 與 Web UI自動化深度結合&#xff0c;讓測試腳本維護進入自然語言時代 —— 告別繁瑣代碼&#xff0c;擁抱智能測…

【QT】 QGraphicsItem 獲取點坐標的幾種方法

目錄 1. 獲取圖元在場景中的位置 對于 QGraphicsEllipseItem&#xff08;點圖元&#xff09; 2. 從 QMap 獲取所有點坐標 3. 響應點擊事件獲取坐標 4. 獲取選中點的坐標 5. 坐標轉換說明 注意事項 在 Qt 圖形視圖框架中&#xff0c;從 QGraphicsItem&#xff08;特別是點…

伊吖學C筆記(6、數、求和、排列)

一、數 1.自然數、奇偶數 自然數也就是非負整數&#xff0c;C的循環語句很容易輸出自然數&#xff0c;比如&#xff1a;輸出100以內的自然數。 奇數、偶數也都是自然數&#xff1a; 2. 約數、因數 題目&#xff1a;一個數如果恰好等于它的因子之和&#xff0c;這個數就稱為“…

SpringMVC與Struts2對比教學

SpringMVC 和 Struts2 就像武林中的兩大門派&#xff0c;雖然都是處理 Web 請求的高手&#xff08;MVC 框架&#xff09;&#xff0c;但招式風格和內功心法大不相同。來&#xff0c;咱們用最接地氣的方式掰扯掰扯&#xff0c;保準你笑著記住&#xff01; 核心區別一句話概括&a…

Nginx配置指南與最佳實踐

Nginx 的配置文件通常位于 /etc/nginx/nginx.conf&#xff0c;并通過 include 指令加載其他目錄&#xff08;如 /etc/nginx/conf.d/ 或 /etc/nginx/sites-enabled/&#xff09;中的配置片段。以下是一個結構化指南&#xff1a; 核心配置結構 # 全局配置 (主上下文) user nginx…

Apache 反向代理Unity服務器

Apache 反向代理Unity服務器 前言項目使用PHPStudy開啟服務修改配置文件修改配置負載均衡&#xff08;可選&#xff09;重啟 總結 前言 使用Unity開了個后臺服務器&#xff0c;但是另一個Java服務器進行大量異步請求時會導致服務器回復過慢&#xff0c;所以開一個Apache緩沖一…

【力扣 簡單 C++】94. 二叉樹的中序遍歷

目錄 題目 解法一&#xff1a;遞歸 解法二&#xff1a;迭代 解法三&#xff1a;Morris遍歷 題目 解法一&#xff1a;遞歸 class Solution { private:void traverse(TreeNode* root, vector<int>& inorder){if (!root)return;traverse(root->left, inorder);i…

idea2024版本設置TODO快捷鍵

直接開干&#xff1a; 首先打開File–>Settings…–>Editor–>Live Templates 復制文本&#xff1a;//wk TODO $data$ 定義自定義todo使用范圍&#xff1a; 設置自定義todo的過濾器&#xff1a; 正式開始設置todo的過濾器&#xff1a; 復制文本&#xff1a; \bwk TO…

云原生核心技術 (12/12): 終章:使用 GitLab CI 將應用自動部署到 K8s (保姆級教程)

大家好&#xff0c;歡迎來到《云原生核心技術》系列的最終章&#xff01; 我們一起走過了漫長而充實的旅程。從 Docker 的集裝箱&#xff0c;到 K8s 這座自動化的數字港口&#xff1b;從部署單個 Pod&#xff0c;到構建復雜的有狀態應用。現在&#xff0c;我們站在了實現全自動…

DEVICENET轉MODBUS TCP網關連接ABB機器人配置案例

在工業自動化場景中&#xff0c;DeviceNet和Modbus TCP是兩種常見的通信協議。DeviceNet通常用于連接現場設備&#xff08;如傳感器、執行器等&#xff09;&#xff0c;而Modbus TCP則廣泛應用于以太網環境下的遠程監控和數據采集。當需要將基于DeviceNet協議的ABB機器人集成到…

達夢數據庫單機部署dmhs同步復制(dm8->kafka)

本文討論了達夢數據實時同步軟件DMHS的相關內容&#xff0c;包括概念總結、環境模擬及部署實現從達夢數據庫到Kafka隊列的同步復制。關鍵要點包括&#xff1a; 1.DMHS系統概述&#xff1a; 達夢公司推出的異構環境高性能數據庫實時同步系統&#xff0c;可應用于應急、容災等多…

爬蟲+動態代理助力 AI 訓練數據采集

文章目錄 引言新手之選&#xff1a;網頁抓取API可靠之選&#xff1a;動態住宅代理總結 引言 近年來&#xff0c;AI 技術飛速發展&#xff0c;很多朋友都投身于 AI 模型的訓練。然而&#xff0c;相較于模型的獲取&#xff0c;高質量的數據往往更加難以收集。一方面&#xff0…

OpenEuler服務器警告郵件自動化發送:原理、配置與安全實踐

OpenEuler服務器警告郵件自動化發送&#xff1a;原理、配置與安全實踐 在服務器的運維管理過程中&#xff0c;及時感知系統異常狀態至關重要。當OpenEuler系統運行時&#xff0c;將服務器的警告信息實時推送至郵箱&#xff0c;能幫助運維人員快速響應潛在問題&#xff0c;保障…

使用vite-plugin-html在 HTML 文件中動態注入數據,如元數據、環境變量、標題

vite-plugin-html 是一個用于 Vite 構建工具的插件&#xff0c;它可以幫助你在構建過程中動態注入一些 HTML 內容&#xff0c;比如標題、元數據、環境變量等。通過使用這個插件&#xff0c;你可以根據項目的配置和環境變量自動生成帶有動態內容的 HTML 文件&#xff0c;適用于 …

學習筆記087——Java接口和抽象類的區別和使用

文章目錄 1、主要區別2、使用場景2.1 使用接口的情況&#xff1a;2.1 使用抽象類的情況&#xff1a; 3、Java 8及以后的接口增強4、設計建議 1、主要區別 特性接口(Interface)抽象類(Abstract Class)定義方式使用interface關鍵字使用abstract class關鍵字方法實現Java 8前不能…

Squid 代理服務器實戰:解決動態 IP 訪問第三方接口的生產級方案

前言&#xff1a;動態IP場景下的業務痛點與解決方案 在企業開發場景中&#xff0c;經常會遇到這樣的需求&#xff1a;第三方服務&#xff08;如API接口、云平臺服務&#xff09;要求將訪問源IP加入白名單以保障安全。然而&#xff0c;企業辦公網絡通常采用動態IP分配&#xff0…