今天呢,博主的學習進度也是步入了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.java
、UserMapper.java
、UserMapper.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 配置自己的數據庫連接信息:驅動類、連接地址、用戶名、密碼連接地址中的 & 實際上就是 & 符號的轉義字符,由于 xml 文件中直接寫 & 時,xml 解析器會認為 & 后面的是實體,從而報錯--><jdbcConnectiondriverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&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>
注意:數據庫連接地址中的?& 實際上就是 & 符號的轉義字符,由于 xml 文件中直接寫 & 時,xml 解析器會認為 & 后面的是實體,從而報錯
<jdbcConnectiondriverClass="com.mysql.cj.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&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
歐了,到這里我應該解釋的差不多啦,我是南極,大膽做自己,活出精彩的人生👊👊👊