Mybatis-Plus学习总结

重点掌握:

  • 了解 Mybatis-Plus
  • 整合 Mybatis-Plus
  • 通用 CRUD
  • Mybatis-Plus 的配置
  • 条件构造器
  • Mybatis-Plus  的Service封装
  • 代码生成

1、Mybatis-Plus 介绍

1.1、Mybatis-Plus介绍

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发提高效率而生。该框架由baomidou(苞米豆)组织开发并且开源的。

  • 官网:https://mybatis.plus/ 或 https://mp.baomidou.com/
  • github 地址:https://github.com/baomidou/mybatis-plus 
  • 码云地址:https://gitee.com/baomidou/mybatis-plus

我们的愿景是成为 MyBatis 最好的搭档,就像 魂斗罗 中的 1P 2P,基友搭配,效率翻倍。

1.2、支持的数据库

MyBatisPlus支持如下数据库:

  • mysql mariadb oracle db2 h2 hsql sqlite postgresql sqlserver
  • 达梦数据库 虚谷数据库 人大金仓数据库

1.3、特性

  1. 无侵入 :只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  2. 损耗小 :启动即会自动注入基本 CRUD,性能基本无损耗,直接面向对象操作
  3. 强大的 CRUD 操作:内置通用 Mapper 通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  4. 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  5. 支持多种数据库 :支持 MySQL MariaDB Oracle DB2 H2 HSQL SQLite Postgre SQLServer2005 SQLServer等多种数据库
  6. 支持主键自动生成 :支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  7. 支持 XML 热加载:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动
  8. 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD操作
  9. 支持自定义全局通用操作 :支持全局通用方法注入( Write once, use anywhere )
  10. 支持关键词自动转义 :支持数据库关键词(order key......)自动转义,还可自定义关键词
  11. 内置代码生成器 :采用代码或者 Maven 插件可快速生成 Mapper Model Service Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  12. 内置分页插件 :基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List 查询
  13. 内置性能分析插件 :可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  14. 内置全局拦截插件 :提供全表 delete update 操作智能分析阻断,也可自定义拦截规则,预防误操作
  15. 内置 Sql 注入剥离器:支持 Sql 注入剥离,有效预防 Sql 注入攻击

1.4、架构

Mybatis主要包含以下模块:

  • 核心功能(core),基于Mybatis的封装,提供了Mybatis Plus的基础配置类与核心功能,如内置通用 Mapper,Lambda 表达式查询等。
  • 注解(annotation),提供了Mybatis Plus中注解的定义。
  • 扩展功能(extension),提供扩展及插件功能,包括分页插件,通用Service扩展 性能分析插件等。
  • 代码生成器(generator):通过代码生成器可以快速生成 Mapper接口 Entity实体类 Mapper XML ServiceController 等各个模块的代码,极大的提升了开发效率。

执行流程:

  • 1)扫描注解Entity,反射提取注解信息如:表名称,字段名称等信息。
  • 2)分析注解信息并基于com.baomidou.mybatisplus.core.enums的SQL模板生成基本CRUD SQL。
  • 3)最后将这些SQL注入到Mybatis环境中。

因此Mybatis plus无需编写CRUD SQL语句,只需继承BaseMapper,就拥有了CRUD功能(通用CRUD)。

2、快速入门

2.1、准备环境

  • JDK 8+
  • Maven 3.3.9+
  • IDEA 2020.2
  • MySQL5.7+

2.2、创建数据库以及表

1)创建数据库并设置字符集为utf-8:

mysql> CREATE DATABASE `mp` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci';

2)创建表和测试数据:

# 选择数据库
USE `mp`;	
# 创建测试表
CREATE TABLE `tb_user` (
	`id` BIGINT ( 20 ) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
	`user_name` VARCHAR ( 20 ) NOT NULL COMMENT '用户名',
	`password` VARCHAR ( 20 ) NOT NULL COMMENT '密码',
	`name` VARCHAR ( 30 ) DEFAULT NULL COMMENT '姓名',
	`age` INT ( 11 ) DEFAULT NULL COMMENT '年龄',
	`email` VARCHAR ( 50 ) DEFAULT NULL COMMENT '邮箱',
	`birthday` datetime DEFAULT NULL,
PRIMARY KEY ( `id` ) 
) ENGINE = INNODB AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8;
# 插入测试数据
INSERT INTO `tb_user` ( `id`, `user_name`, `password`, `name`, `age`, `email`, `birthday` )
VALUES
	( 1, 'zhangsan', '123456', '张三', 18, 'test1@myron.com', '2020-09-27 13:15:30' ),
	( 2, 'lisi', '123456', '李四', 20, 'test2@myron.com', '2020-09-27 13:15:30' ),
	( 3, 'wangwu', '123456', '王五', 28, 'test3@myron.com', '2020-09-27 13:15:30' ),
	( 4, 'zhaoliu', '123456', '赵六', 21, 'test4@myron.com', '2020-09-27 13:15:30' ),
	( 5, 'sunqi', '123456', '孙七', 24, 'test5@myron.com', '2020-09-27 13:15:30' );

2.3、工程搭建

2.3.1、创建工程

创建maven工程,分别填写GroupId ArtifactId和Version,如下:

<groupId>com.myron.mp</groupId>   
<artifactId>myron‐mp‐springboot</artifactId>
<version>1.0‐SNAPSHOT</version>

2.3.2、导入依赖

导入maven依赖,由于本例采用Spring Boot技术,使用mybatis-plus-boot-starter能与其便捷集成:
版本规划:

  • Spring Boot: 2.1.3.RELEASE
  • mybatis-plus: 3.1.0
<?xml version="1.0" encoding="UTF-8"?>
<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.myrom.mp</groupId>
    <artifactId>myron-mp-springboot</artifactId>
    <version>1.0-SNAPSHOT</version>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--简化代码的工具包-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!--mybatis-plus的springboot支持-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.1.0</version>
        </dependency>
        <!--mysql驱动-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.11</version>
        </dependency>
    </dependencies>

</project>

2.3.3、编写application.properties

# 服务名
spring.application.name=myron-mp-springboot

# 数据源驱动引擎
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 数据源地址
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mp?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&useSSL=false
# 用户名
spring.datasource.username=root
# 用户密码
spring.datasource.password=root

# 日志级别
logging.level.root=debug

2.3.4、编写pojo

package com.myron.mp.pojo;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.time.LocalDateTime;

@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
@TableName("tb_user")
public class User {

    @TableId("ID")
    private Long id;//指定主键的字段名

    @TableField("USER_NAME")//指定对应字段名
    private String userName; //驼峰命名,则无需注解
    @TableField("PASSWORD")
    private String password;
    @TableField("NAME")
    private String name;
    @TableField("AGE")
    private Integer age;
    @TableField("EMAIL")
    private String email;
    @TableField("BIRTHDAY")
    private LocalDateTime birthday;
}
  • @Data:lombok的注解,使用它可以省略getter/setter方法。
  • @NoArgsConstructor: 生成无参构造 方法
  • @AllArgsConstructor:生成所有参数构造 方法,参数顺序与属性定义顺序一致。
  • @TableName:指定表名
  • @TableId:指定主键名
  • @TableField :指定列名

2.3.5、编写mapper

package com.myron.mp.mapper;

import com.myron.mp.pojo.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

public interface UserMapper extends BaseMapper<User> {
}

2.3.6、编写启动类

package com.myron.mp;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.myron.mp.mapper") //设置mapper接口的扫描包
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

2.3.7、编写测试用例

编写UserMapper的测试用例 ,使用UserMapper查询用户列表。
在test下创建测试类,包名为 com.myron.mp。

package com.myron.mp;

import com.myron.mp.mapper.UserMapper;
import com.myron.mp.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import java.util.List;

@RunWith(SpringRunner.class)
@SpringBootTest
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    // 查询所有
    @Test
    public void testSelect() {
        List<User> userList = userMapper.selectList(null);
        for (User user : userList) {
            System.out.println(user);
        }
    }
}

测试:

3、常见配置

在MP中有大量的配置,其中有一部分是Mybatis原生的配置,另一部分是MP的配置,详情:

https://mybatis.plus/config/
下面我们对常用的配置做讲解。

3.1、configLocations

configLocations即MyBatis 配置文件位置,如果您有单独的 MyBatis 配置,请将其路径配置到 configLocation中。 MyBatis Configuration 的具体内容请参考MyBatis 官方文档。
示例:
1)在resources下创建mybatis-config.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <!--mapUnderscoreToCamelCase=true-->
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>
    
    <!--<plugins>-->
    <!--<plugin interceptor="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"></plugin>-->
    <!--</plugins>-->

</configuration>

2)在application.properties下配置configLocations,如下:

# 指定mybatis-config.xml的位置
mybatis-plus.config-location=classpath:mybatis/mybatis-config.xml

3.2、mapperLocations

mapperLocations即MyBatis Mapper 所对应的 mapper配置 文件位置,如果您在 Mapper 中有自定义方法(XML 中有自定义实现),需要进行该配置,告诉 Mapper 所对应的 XML 文件位置。

如果不配置mapperLocations时,mapper的xml文件存放路径需要和mapper class文件保持一致,文件名保持 一致,如下:

测试:

新建UserMapper.xml

将此文件放在resources/com/myron/mp/mapper下

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.myron.mp.mapper.UserMapper">

    <select id="findById" resultType="com.myron.mp.pojo.User" parameterType="java.lang.Long">
        select * from tb_user where id = #{id}
    </select>

</mapper>
package com.myron.mp.mapper;

import cn.itcast.mp.pojo.User;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

public interface UserMapper extends BaseMapper<User> {

    //在UserMapper接口类中新增findById方法
    public User findById(Long id);
}

测试用例:

    // 根据id查询
    @Test
    public void testFindById() {
        User user = userMapper.findById(2L);
        System.out.println(user);
    }

运行结果:

2020-09-27 16:52:11.408 DEBUG 1428 --- [main] o.m.s.t.SpringManagedTransaction         : JDBC Connection [HikariProxyConnection@2053349061 wrapping com.mysql.cj.jdbc.ConnectionImpl@67af833b] will not be managed by Spring
2020-09-27 16:52:11.410 DEBUG 1428 --- [main] com.myron.mp.mapper.UserMapper.findById  : ==>  Preparing: select * from tb_user where id = ? 
2020-09-27 16:52:11.438 DEBUG 1428 --- [main] com.myron.mp.mapper.UserMapper.findById  : ==> Parameters: 2(Long)
2020-09-27 16:52:11.739 DEBUG 1428 --- [main] com.myron.mp.mapper.UserMapper.findById  : <==      Total: 1
2020-09-27 16:52:11.740 DEBUG 1428 --- [main] org.mybatis.spring.SqlSessionUtils       : Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7cedfa63]
User(id=2, userName=lisi, password=123456, name=李四, age=20, email=test2@myron.com, birthday=2020-09-27T13:15:30)

也可以给mapper XML文件定义一个和mapper接口不同的存放路径 ,如下:

#指定mapper文件位置
mybatis-plus.mapper-locations = classpath*:mybatis/mapper/*.xml

注意:Maven 多模块项目的扫描路径需以 classpath*: 开头 (即加载多个 jar 包下的 XML 文件)

3.3、typeAliasesPackage

设置MyBaits 别名包扫描路径,通过该属性可以给包中的类注册别名,注册后在 Mapper 对应的 XML 文件中可以直接使用类名,而不用使用全限定的类名(即 XML 中调用的时候不用包含包名)。
示例:

#别名配置
mybatis-plus.type-aliases-package=com.myron.mp.pojo

3.4、mapUnderscoreToCamelCase

  • 类型: boolean
  • 默认值: true

是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java属性名 aColumn(驼峰命名) 的类似映射。

注意:

  • 在 MyBatis-Plus 中此属性默认值为true,用于生成最终的 SQL 语句
  • 如果您的数据库命名符合规则无需使用  @TableField 注解指定数据库字段名

测试:

#开启自动驼峰映射,注意:配置configuration.map-underscore-to-camel-case则不能配置config-location
mybatis-plus.configuration.map-underscore-to-camel-case=true

1)屏蔽@TableField

package com.myron.mp.pojo;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.time.LocalDateTime;

@Data
@ToString
@NoArgsConstructor
@AllArgsConstructor
@TableName("tb_user")
public class User {

    @TableId("ID")
    private Long id;//指定主键的字段名

    //@TableField("USER_NAME")//指定对应字段名
    private String userName; //驼峰命名,则无需注解
    //@TableField("PASSWORD")
    private String password;
    //@TableField("NAME")
    private String name;
    //@TableField("AGE")
    private Integer age;
    //@TableField("EMAIL")
    private String email;
    //@TableField("BIRTHDAY")
    private LocalDateTime birthday;
}

2)测试userMapper.findById方法,跟踪发现userName可以映射成功。

如果项目中有符合驼峰规则的定义也有不符合的,此时建议统一使用@TableField。
3)如果使用mybatis-config.xml的同时在application.properties配置mybatis-plus.configuration则报错 Property 'configuration' and 'configLocation' can not specified with together
解决方法:
只使用一种配置方法。
本案例屏蔽mybatis-plus.configuration.map-underscore-to-camel-case=true,在mybatis-config.xml中配置settings。

<settings>
    <!--mapUnderscoreToCamelCase=true-->
    <setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

4、通用CRUD

通过前面的学习,我们了解到通过继承BaseMapper就可以获取到各种各样的单表操作,接下来我们将详细讲解这些操作,下图是BaseMapper的各各方法:

4.1、插入操作

4.1.1、方法定义

/**
* 插入一条记录
* @param entity 实体对象
*/
int insert(User entity);

4.1.2、测试用例

// 插入
@Test
public void testInsert() {
	User user = new User();
	//user.setId(100L);
	user.setName("曹操");
	user.setPassword("111111");
	user.setEmail("test@myron.com");
	user.setAge(20);
	user.setUserName("caocao");
	DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-DD HH:mm:ss");
	LocalDateTime localDateTime = LocalDateTime.parse("1990-01-01 00:00:00", dateTimeFormatter);
	user.setBirthday(localDateTime);
	int i = this.userMapper.insert(user);//返回的result是受影响的行数,并不是自增后的id
	System.out.println(i + "====>> " + user.getId());//自增后的id会回填到对象中
}

4.1.3、MP主键生成策略

上例中Mybatis-plus自动生成ID,如何设置id的生成策略呢?
MP支持的id策略如下:

package com.baomidou.mybatisplus.annotation;
import lombok.Getter;
/**
* 生成ID类型枚举类
*
*/
@Getter
public enum IdType {
	/**
	* 数据库ID自增
	*/
	AUTO(0),
	/**
	* 该类型为未设置主键类型
	*/
	NONE(1),
	/**
	* 用户输入ID
	* <p>该类型可以通过自己注册自动填充插件进行填充</p>
	*/
	INPUT(2),
	/**
	* 全局唯一ID (idWorker)
	*/
	ID_WORKER(3),
	/**
	* 全局唯一ID (UUID)
	*/
	UUID(4),
	/**
	* 字符串全局唯一ID (idWorker 的字符串表示)
	*/
	ID_WORKER_STR(5);
	
	private final int key;
	
	IdType(int key) {
		this.key = key;
	}
}

1、自增主键:

完全采用数据库自增主键方式。

1)设置mysql数据库主键为自增

2)修改User对象:

@TableId(value = "ID", type = IdType.AUTO)
private Long id;
或:
@TableId(value = "ID")
private Long id;

3)程序中不用设置主键

2、输入主键:

手动设置主键值。

1)mysql数据库主键为自增或不是自增都可以

2)修改User对象:

@TableId(value = "ID",type = IdType.INPUT)
private Long id;

3)程序中需要设置主键

3、UUID:

生成全局唯一ID。

1)mysql数据库主键为字符串类型,不是自增类型。

2)修改User对象。

@TableId(value = "ID",type = IdType.UUID)
private String id;

3)程序中不用设置主键

4 ID_WORKER_STR:

采用雪花片算法(雪花算法生成的ID是纯数字且具有时间顺序,适合分布式场景)生成全局唯一ID,字符串类型。

1)mysql数据库主键为字符串类型,不是自增类型。

2)修改User对象。

@TableId(value = "ID",type = IdType.ID_WORKER_STR)
private String id;

3)程序中不用设置主键

5 ID_WORKER:

采用雪花片算法生成全局唯一ID,数值类型。

1)mysql数据库主键为数值类型,不是自增类型。

2)修改User对象。

@TableId(value = "ID",type = IdType.ID_WORKER)
private Long id;

3)程序中不用设置主键

4.2、更新操作

4.2.1、根据id更新

方法定义:

/**
*	 根据 ID 修改
* @param entity 实体对象
*/
int updateById(@Param(Constants.ENTITY) User entity);

根据id更新操作步骤:

  1. 首先需要设置对象的主键属性值。
  2. 再设置要更新的属性值。
  3. 根据主键找到对象,更新设置属性值。
  4. 返回影响的记录数。

注意:只能将对象中不为NULL的属性更新到表中。

测试:

// 更新
@Test
public void testUpdate() {
	User user = new User();
	//更新记录的主键值
	user.setId(1L);
	user.setAge(100);//要更新的值
	user.setPassword("12222");//要更新的值
	//只将对象中不为NULL的值更新到数据库中,根据id更新
	int i = userMapper.updateById(user);
	System.out.println(i);
}

结果:

4.2.2、根据条件更新

方法定义:

/**
     * 根据 whereEntity 条件,更新记录
     *
     * @param entity        实体对象 (set 条件值,可以为 null)
     * @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
     */
int update(@Param(Constants.ENTITY) User entity, @Param(Constants.WRAPPER) Wrapper<User> updateWrapper);	

根据ID更新一次只能更新一条记录,根据条件更新可实现批量更新。

根据条件更新步骤:

  1. 在对象中设置要更新的属性值。
  2. 设置 QueryWrapper ,设置更新条件,可以设置多个。
  3. 返回影响的记录数。

注意:只能将对象中不为NULL的属性更新到表中。

测试用例:

这次将name等于“曹操”的记录全部更新。

//根据条件进行更新
@Test
public void testUpdate2() {
    User user = new User();
    user.setAge(100);//要更新的值
    user.setPassword("12222");//要更新的值
    //设置条件,可以设置多个条件...
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("name", "曹操");
    //只将对象中不为NULL的值更新到数据库中,执行更新操作
    int i = userMapper.update(user, queryWrapper);
    System.out.println(i);
}

结果:

上边根据id更新 根据条件更新的方法只能将对象中不为NULL的属性更新到表中,下边通过 UpdateWrapper 进行更新,将birthday字段更新为NULL。

//根据条件进行更新,可以将为NULl的值更新到数据库
@Test
public void testUpdate3() {
	UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
	updateWrapper.eq("name", "曹操").set("birthday", null);
	//只将对象中不为NULL的值更新到数据库中
	int i = userMapper.update(null, updateWrapper);
	System.out.println(i);
}

结果:

4.3、删除操作

4.3.1、deleteById

方法定义:

/**
* 根据 ID 删除
* @param id 主键ID
*/
int deleteById(Serializable id);

操作步骤:

  1. 指定要删除记录的主键值。
  2. 调用deleteById方法执行删除。

测试用例:

// 根据id删除
@Test
public void testDeleteById() {
    //执行删除操作
    int result = this.userMapper.deleteById(6L);
    System.out.println("result = " + result);
}

结果:

4.3.2、delete

方法定义:

/**
* 根据 entity 条件,删除记录
* @param wrapper 实体对象封装操作类(可以为 null)
*/
int delete(@Param(Constants.WRAPPER) Wrapper<User> wrapper);

根据条件删除步骤:

  1. 定义对象,设置属性值,指定删除条件 ,可指定多个删除条件。注意:删除条件只匹配对象中不为NULL的属性值
  2. 设置QueryWrapper
  3. 执行删除

测试用例:

@Test
public void testDelete2() {
    User user = new User();
    user.setAge(12);
    user.setName("曹操");
    //将实体对象进行包装,包装为操作条件
    QueryWrapper<User> wrapper = new QueryWrapper<>(user);
    int result = this.userMapper.delete(wrapper);
    System.out.println("result = " + result);
}

结果:

注意:

定义QueryWrapper可以不包装模型对象,手动设置条件,如下:

QueryWrapper<User> queryWrapper  =new QueryWrapper<>();
queryWrapper.eq("age",100);
queryWrapper.eq("name","曹操");

4.3.3、deleteBatchIds

方法定义:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值