当前位置: 首页 > 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 ? "删除成功" : "删除失败");}
}

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

相关文章:

  • XML Group端口详解
  • CANopen转Modbus TCP转换器助生产线智能化升级
  • Numpy7——数学2(矩阵基础,线性方程基础)
  • 图注意力卷积神经网络GAT在无线通信网络拓扑推理中的应用
  • 龙蜥开发者说:我的龙蜥开源之旅 | 第 32 期
  • 【在线五子棋对战】四、MySQL API 使用
  • 代码训练LeetCode(27)接雨水
  • Leetcode 3572. Maximize Y‑Sum by Picking a Triplet of Distinct X‑Values
  • 力扣热题100之二叉树的层序遍历
  • PostgreSQL 数据库技术峰会重庆站回顾|IvorySQL 开源实践与社区生态
  • 商业 |AI超级工厂:“AI+制造”的终极目标?
  • 嵌入式学习之系统编程(十三)数据库
  • Python模拟滑块验证码轨迹的深度实践指南
  • Leetcode 3576. Transform Array to All Equal Elements
  • 从DVD租赁小店到流媒体巨擘:Netflix传奇之路
  • 【面向对象】1. 原型与原型链的概念
  • RNN做中文分词
  • HTML实现的2048游戏
  • 【JVM】- 垃圾回收
  • C++学习-入门到精通【17】自定义的模板化数据结构
  • 哪个网站做任务可以赚钱/百度售后电话人工服务
  • b2b b2c c2c o2o例子/seo企业优化方案
  • 昆明企业网站建设公司/广告公司名字
  • 北京团建网站/seo快速排名站外流量推广
  • 新疆教育集团网站建设/产品线上推广方式都有哪些
  • 成都建设网站首页/seo门户 site