当前位置: 首页 > news >正文

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 ? "删除成功" : "删除失败");}
}

欧了,到这里我应该解释的差不多啦,我是南极,大胆做自己,活出精彩的人生👊👊👊

http://www.xdnf.cn/news/969463.html

相关文章:

  • 如何备考公路水运安全员A证?
  • pytorch-frame开源程序适用于 PyTorch 的表格深度学习库,一个模块化深度学习框架,用于在异构表格数据上构建神经网络模型。
  • dMSA 滥用(BadSuccessor)导致权限提升
  • C++11 花括号等式初始化器(Brace-or-Equal Initializers):从入门到精通
  • 安全大模型智驱网络和数据安全效能跃迁
  • 利用最小二乘法找圆心和半径
  • 【从零学习JVM|第五篇】打破双亲委派机制
  • OceanBase v4.3.5 特性解读:通过OSS WORM特性进行备份归档
  • 【动手学深度学习】3.2. 线性回归的从零开始实现
  • [UnrealCircle武汉]UE5跨平台游戏常见问题及解决方案笔记
  • Java八股文——JVM「垃圾回收篇」
  • 鸿蒙接入微信sdk登录 解决提示BundleID信息校验不通过
  • rasa NLU意图解析基础学习
  • 全国空气质量监测站点数据分析:从原始数据到空间可视化
  • 1. 网络基础
  • 带eachers的html转word
  • 渲染学进阶内容——joml库
  • 深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
  • cell properties修改参数
  • 突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合
  • Vue 指令详解:概念与作用
  • 渲染学进阶内容——模型
  • ssc377d修改flash分区大小
  • 86壳温湿度传感器:高温下工业生产的安全防线
  • Elasticsearch增删改查语句
  • GAMES202-高质量实时渲染(Real-Time Ray-Tracing)
  • Minktec 柔性弯曲传感器应用:3D 脊柱姿势追踪与人体活动识别
  • 半加器和全加器
  • React19源码系列之 事件优先级
  • Netty从入门到进阶(三)