飞道的博客

Mybatis-plus基础以及SpringBoot整合Mybatis-plus

365人阅读  评论(0)

目录

(一)环境搭建

1.快速引入spring boot项目相关依赖

2.引入mybatis-plus相关maven依赖

3.创建数据表

4. 创建java bean

5. 配置application.proprties

(二)基于mybatis-plus的入门helloworld---CRUD实验

1.mybatis与mybatis-plus实现方式对比

2.BaseMapper接口介绍

(1)如何理解核心接口BaseMapper?

(2)BaseMapper接口为我们定义了哪些方法?

(3) mybatis-plus中常用的注解

3.增删查改操作

(1)插入

(2)修改

(3)查询

(4)删除

(三)不得不提的条件构造器---Wrapper

1.wrapper及其子类介绍 

2.带条件的crud实验

(1)带条件的查询

(2)带条件的更新

(3)带条件的删除


(一)环境搭建

1.快速引入spring boot项目相关依赖

将STS与eclipse集成,快速新建SpringBoot项目,勾选如下选项

 一路next,pom.xml文件会帮我们配置好.

ps:由于我们使用的数据源使阿里巴巴的druid,在springboot项目构建模板并没有这一选项,我们还需要手动引入(同理,后面的mybatis-plus相关依赖也需要手动引入)

进入mvnrepository官网搜索相关依赖,添加到pom.xml文件中

https://mvnrepository.com/

  
  1. <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
  2. <dependency>
  3. <groupId>com.alibaba </groupId>
  4. <artifactId>druid </artifactId>
  5. <version>1.1.21 </version>
  6. </dependency>

2.引入mybatis-plus相关maven依赖

同理,进入mvnrepository官网搜索相关依赖,添加到pom.xml文件中


  
  1. <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus -->
  2. <dependency>
  3. <groupId>com.baomidou </groupId>
  4. <artifactId>mybatis-plus </artifactId>
  5. <version>3.3.1 </version>
  6. </dependency>

引入mybatis-plus在spring boot中的场景启动器 


  
  1. <!-- https://mvnrepository.com/artifact/com.baomidou/mybatis-plus-boot-starter -->
  2. <dependency>
  3. <groupId>com.baomidou </groupId>
  4. <artifactId>mybatis-plus-boot-starter </artifactId>
  5. <version>3.3.1 </version>
  6. </dependency>

ps:切记不可再在pom.xml文件中引入mybatis与mybatis-spring的maven依赖,这一点,mybatis-plus的官方文档中已经说明的很清楚了.

3.创建数据表

(1)SQL语句


  
  1. -- 创建表
  2. CREATE TABLE tbl_employee(
  3. id INT( 11) PRIMARY KEY AUTO_INCREMENT,
  4. last_name VARCHAR( 50),
  5. email VARCHAR( 50),
  6. gender CHAR( 1),
  7. age INT
  8. );
  9. INSERT INTO tbl_employee(last_name,email,gender,age) VALUES( 'Tom', 'tom@atguigu.com', 1, 22);
  10. INSERT INTO tbl_employee(last_name,email,gender,age) VALUES( 'Jerry', 'jerry@atguigu.com', 0, 25);
  11. INSERT INTO tbl_employee(last_name,email,gender,age) VALUES( 'Black', 'black@atguigu.com', 1, 30);
  12. INSERT INTO tbl_employee(last_name,email,gender,age) VALUES( 'White', 'white@atguigu.com', 0, 35);

(2) 数据表结构

4. 创建java bean

根据数据表新建相关实体类


  
  1. package com.example.demo.pojo;
  2. public class Employee {
  3. private Integer id;
  4. private String lastName;
  5. private String email;
  6. private Integer gender;
  7. private Integer age;
  8. public Employee() {
  9. super();
  10. // TODO Auto-generated constructor stub
  11. }
  12. public Employee(Integer id, String lastName, String email, Integer gender, Integer age) {
  13. super();
  14. this.id = id;
  15. this.lastName = lastName;
  16. this.email = email;
  17. this.gender = gender;
  18. this.age = age;
  19. }
  20. public Integer getId() {
  21. return id;
  22. }
  23. public void setId(Integer id) {
  24. this.id = id;
  25. }
  26. public String getLastName() {
  27. return lastName;
  28. }
  29. public void setLastName(String lastName) {
  30. this.lastName = lastName;
  31. }
  32. public String getEmail() {
  33. return email;
  34. }
  35. public void setEmail(String email) {
  36. this.email = email;
  37. }
  38. public Integer getGender() {
  39. return gender;
  40. }
  41. public void setGender(Integer gender) {
  42. this.gender = gender;
  43. }
  44. public Integer getAge() {
  45. return age;
  46. }
  47. public void setAge(Integer age) {
  48. this.age = age;
  49. }
  50. @Override
  51. public String toString() {
  52. return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender + ", age="
  53. + age + "]";
  54. }
  55. }

5. 配置application.proprties


  
  1. spring.datasource.username=root
  2. spring.datasource.password=20182022
  3. spring.datasource.url=jdbc:mysql://127.0.0.1:3306/my?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
  4. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
  5. spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

 

(二)基于mybatis-plus的入门helloworld---CRUD实验

ps:在进行crud实验之前,简单对mybatis与mybatis-plus做一个简单的对比

1.mybatis与mybatis-plus实现方式对比

(1)提出问题: 假设我们已存在一张 tbl_employee 表,且已有对应的实体类 Employee,实现 tbl_employee 表的 CRUD 操作我们需要做什么呢?

(2)实现方式: 基于 Mybatis 需要编写 EmployeeMapper 接口,并手动编写 CRUD 方法 提供 EmployeeMapper.xml 映射文件,并手动编写每个方法对应的 SQL 语句. 基于 Mybatis-plus 只需要创建 EmployeeMapper 接口, 并继承 BaseMapper 接口.这就是使用 mybatis-plus 需要完成的所有操作,甚至不需要创建 SQL 映射文件。

2.BaseMapper接口介绍

(1)如何理解核心接口BaseMapper?

 在使用Mybatis-Plus是,核心操作类是BaseMapper接口,其最终也是利用的Mybatis接口编程的实现机制,其默认提供了一系列的增删改查的基础方法,并且开发人员对于这些基础操作不需要写SQL进行处理操作(Mybatis提供的机制就是需要开发人员在mapper.xml中提供sql语句),那样我们可以猜测肯定是Mybatis-Plus完成了BaseMapper接口提供的方法的SQL语句的生成操作。

(2)BaseMapper接口为我们定义了哪些方法?

BaseMapper接口源码:


  
  1. /*
  2. * Copyright (c) 2011-2020, baomidou (jobob@qq.com).
  3. * <p>
  4. * Licensed under the Apache License, Version 2.0 (the "License"); you may not
  5. * use this file except in compliance with the License. You may obtain a copy of
  6. * the License at
  7. * <p>
  8. * https://www.apache.org/licenses/LICENSE-2.0
  9. * <p>
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
  12. * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
  13. * License for the specific language governing permissions and limitations under
  14. * the License.
  15. */
  16. package com.baomidou.mybatisplus.core.mapper;
  17. import com.baomidou.mybatisplus.core.conditions.Wrapper;
  18. import com.baomidou.mybatisplus.core.metadata.IPage;
  19. import com.baomidou.mybatisplus.core.toolkit.Constants;
  20. import org.apache.ibatis.annotations.Param;
  21. import java.io.Serializable;
  22. import java.util.Collection;
  23. import java.util.List;
  24. import java.util.Map;
  25. /**
  26. * Mapper 继承该接口后,无需编写 mapper.xml 文件,即可获得CRUD功能
  27. * <p>这个 Mapper 支持 id 泛型</p>
  28. *
  29. * @author hubin
  30. * @since 2016-01-23
  31. */
  32. public interface BaseMapper<T> extends Mapper<T> {
  33. /**
  34. * 插入一条记录
  35. *
  36. * @param entity 实体对象
  37. */
  38. int insert(T entity);
  39. /**
  40. * 根据 ID 删除
  41. *
  42. * @param id 主键ID
  43. */
  44. int deleteById(Serializable id);
  45. /**
  46. * 根据 columnMap 条件,删除记录
  47. *
  48. * @param columnMap 表字段 map 对象
  49. */
  50. int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
  51. /**
  52. * 根据 entity 条件,删除记录
  53. *
  54. * @param wrapper 实体对象封装操作类(可以为 null)
  55. */
  56. int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
  57. /**
  58. * 删除(根据ID 批量删除)
  59. *
  60. * @param idList 主键ID列表(不能为 null 以及 empty)
  61. */
  62. int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
  63. /**
  64. * 根据 ID 修改
  65. *
  66. * @param entity 实体对象
  67. */
  68. int updateById(@Param(Constants.ENTITY) T entity);
  69. /**
  70. * 根据 whereEntity 条件,更新记录
  71. *
  72. * @param entity 实体对象 (set 条件值,可以为 null)
  73. * @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)
  74. */
  75. int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
  76. /**
  77. * 根据 ID 查询
  78. *
  79. * @param id 主键ID
  80. */
  81. T selectById(Serializable id);
  82. /**
  83. * 查询(根据ID 批量查询)
  84. *
  85. * @param idList 主键ID列表(不能为 null 以及 empty)
  86. */
  87. List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
  88. /**
  89. * 查询(根据 columnMap 条件)
  90. *
  91. * @param columnMap 表字段 map 对象
  92. */
  93. List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
  94. /**
  95. * 根据 entity 条件,查询一条记录
  96. *
  97. * @param queryWrapper 实体对象封装操作类(可以为 null)
  98. */
  99. T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  100. /**
  101. * 根据 Wrapper 条件,查询总记录数
  102. *
  103. * @param queryWrapper 实体对象封装操作类(可以为 null)
  104. */
  105. Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  106. /**
  107. * 根据 entity 条件,查询全部记录
  108. *
  109. * @param queryWrapper 实体对象封装操作类(可以为 null)
  110. */
  111. List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  112. /**
  113. * 根据 Wrapper 条件,查询全部记录
  114. *
  115. * @param queryWrapper 实体对象封装操作类(可以为 null)
  116. */
  117. List<Map<String, Object>> selectMaps( @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  118. /**
  119. * 根据 Wrapper 条件,查询全部记录
  120. * <p>注意: 只返回第一个字段的值</p>
  121. *
  122. * @param queryWrapper 实体对象封装操作类(可以为 null)
  123. */
  124. List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  125. /**
  126. * 根据 entity 条件,查询全部记录(并翻页)
  127. *
  128. * @param page 分页查询条件(可以为 RowBounds.DEFAULT)
  129. * @param queryWrapper 实体对象封装操作类(可以为 null)
  130. */
  131. <E extends IPage<T>> E selectPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  132. /**
  133. * 根据 Wrapper 条件,查询全部记录(并翻页)
  134. *
  135. * @param page 分页查询条件
  136. * @param queryWrapper 实体对象封装操作类
  137. */
  138. <E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  139. }

(3) mybatis-plus中常用的注解


  
  1. @ TableName:对数据表名注解
  2. @TableId:表主键标识
  3. @TableId(value = "id", type = IdType.AUTO):自增
  4. @TableId(value = "id", type = IdType.ID_WORKER_STR):分布式全局唯一ID字符串类型
  5. @TableId(value = "id", type = IdType.INPUT):自行输入
  6. @TableId(value = "id", type = IdType.ID_WORKER):分布式全局唯一ID 长整型类型
  7. @TableId(value = "id", type = IdType.UUID): 32位UUID字符串
  8. @TableId(value = "id", type = IdType.NONE):无状态
  9. @TableField:表字段标识
  10. @TableField(exist = false):表示该属性不为数据库表字段,但又是必须使用的。
  11. @TableField(exist = true):表示该属性为数据库表字段。
  12. @TableField(condition = SqlCondition.LIKE):表示该属性可以模糊搜索。
  13. @TableField(fill = FieldFill.INSERT):注解填充字段 ,生成器策略部分也可以配置!
  14. @FieldStrategy:
  15. @FieldFill
  16. @Version:乐观锁注解、标记
  17. @EnumValue:通枚举类注解
  18. @TableLogic:表字段逻辑处理注解(逻辑删除)
  19. @SqlParser:租户注解
  20. @KeySequence:序列主键策略 

常用的就三个:@TableName  @TableId  @TableField

查看更多注解以及详解,请移步至官网:

https://mybatis.plus/guide/annotation.html#tablename

由于我们的数据表名于实体类的类名不一致,并且实体类于数据表还存在字段名不对应的情况,因此我们需要引入mybatis-plus的注解.


  
  1. import com.baomidou.mybatisplus.annotation.IdType;
  2. import com.baomidou.mybatisplus.annotation.TableField;
  3. import com.baomidou.mybatisplus.annotation.TableId;
  4. import com.baomidou.mybatisplus.annotation.TableName;
  5. /*
  6. * MybatisPlus会默认使用实体类的类名到数据中找对应的表.
  7. *
  8. */
  9. @Component
  10. @TableName(value = "tbl_employee")
  11. public class Employee {
  12. /*
  13. * @TableId:
  14. * value: 指定表中的主键列的列名, 如果实体属性名与列名一致,可以省略不指定.
  15. * type: 指定主键策略.
  16. */
  17. @TableId(value= "id" , type =IdType.AUTO)
  18. private Integer id;
  19. @TableField(value = "last_name")
  20. private String lastName;
  21. private String email;
  22. private Integer gender;
  23. private Integer age;
  24. public Employee() {
  25. super();
  26. // TODO Auto-generated constructor stub
  27. }
  28. public Employee(Integer id, String lastName, String email, Integer gender, Integer age) {
  29. super();
  30. this.id = id;
  31. this.lastName = lastName;
  32. this.email = email;
  33. this.gender = gender;
  34. this.age = age;
  35. }
  36. public Integer getId() {
  37. return id;
  38. }
  39. public void setId(Integer id) {
  40. this.id = id;
  41. }
  42. public String getLastName() {
  43. return lastName;
  44. }
  45. public void setLastName(String lastName) {
  46. this.lastName = lastName;
  47. }
  48. public String getEmail() {
  49. return email;
  50. }
  51. public void setEmail(String email) {
  52. this.email = email;
  53. }
  54. public Integer getGender() {
  55. return gender;
  56. }
  57. public void setGender(Integer gender) {
  58. this.gender = gender;
  59. }
  60. public Integer getAge() {
  61. return age;
  62. }
  63. public void setAge(Integer age) {
  64. this.age = age;
  65. }
  66. @Override
  67. public String toString() {
  68. return "Employee [id=" + id + ", lastName=" + lastName + ", email=" + email + ", gender=" + gender + ", age="
  69. + age + "]";
  70. }
  71. }

3.增删查改操作

编写EmployeeMapper接口继承BaseMapper接口


  
  1. package com.example.demo.mapper;
  2. import org.apache.ibatis.annotations.Mapper;
  3. import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  4. import com.example.demo.pojo.Employee;
  5. /**
  6. *
  7. * @author zhou'en'xian
  8. *基于Mybatis-plus实现: 让XxxMapper接口继承 BaseMapper接口即可.
  9. *BaseMapper<T> : 泛型指定的就是当前Mapper接口所操作的实体类类型
  10. */
  11. @Mapper
  12. public interface EmpolyeeMapper extends BaseMapper<Employee> {
  13. }

准备测试环境:


  
  1. package com.example.demo;
  2. import org.junit.jupiter.api.Test;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.boot.test.context.SpringBootTest;
  5. import com.example.demo.mapper.EmpolyeeMapper;
  6. import com.example.demo.pojo.Employee;
  7. @SpringBootTest
  8. class MybatisplusApplicationTests {
  9. @Autowired
  10. private Employee employee;
  11. @Autowired
  12. private EmpolyeeMapper empolyeeMapper;
  13. }

(1)插入


  
  1. // 插入一条记录
  2. int insert(T entity);

  
  1. @Test
  2. void insert() {
  3. employee.setAge( 20);
  4. employee.setEmail( "123@qq.com");
  5. employee.setGender( 1);
  6. employee.setLastName( "张三");
  7. empolyeeMapper.insert(employee);
  8. //int id=employee.getId();此方法可以获取插入当前记录在数据库中的id
  9. //在mybatis中如果立马获取插入数据的主键id,是不是需要配置呢?感受到mybatis-plus的强大了吗?
  10. }

(2)修改


  
  1. // 根据 ID 修改
  2. int updateById(@Param(Constants.ENTITY) T entity);
  3. //T entity 实体对象 (set 条件值,可为 null)

  
  1. @Test
  2. void update() {
  3. employee.setId( 1);
  4. employee.setAge( 18);
  5. employee.setEmail( "3123@hpu.edu");
  6. employee.setGender( 0);
  7. employee.setLastName( "lili");
  8. empolyeeMapper.updateById(employee);
  9. }

控制台打印出的sql语句 

如果我们不设置实体类的email与gender属性,结果是怎样的呢?


  
  1. @Test
  2. void update() {
  3. employee.setId( 2);
  4. employee.setAge( 21);
  5. //employee.setEmail("318011@hpu.edu");
  6. //employee.setGender(1);
  7. employee.setLastName( "lihua");
  8. empolyeeMapper.updateById(employee);
  9. }

控制台sql语句: 

显然,mybatis-plus为我们做了非空判断,空值的话,默认不更新对应的字段.想一想,这是不是类似于mybatis中的动态sql呢?这种处理效果又会带来什么好处呢?

(3)查询


  
  1. // 根据 ID 查询
  2. T selectById(Serializable id);
  3. // 查询(根据ID 批量查询)
  4. List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
  5. // 查询(根据 columnMap 条件)
  6. List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

 selectById方法


  
  1. @Test
  2. void select() {
  3. Employee employee=empolyeeMapper.selectById( 4);
  4. System.out.println(employee);
  5. }

 selectBatchIds方法


  
  1. @Test
  2. void select() {
  3. List<Integer>list = new ArrayList<Integer>();
  4. list.add( 1);
  5. list.add( 2);
  6. list.add( 3);
  7. List<Employee>li=empolyeeMapper.selectBatchIds(list);
  8. for(Employee employee:li) {
  9. System.out.println(employee);
  10. }
  11. }

ps:发现该方法底层使用的竟然是sql的in关键字

 

selectByMap方法


  
  1. @Test
  2. void select() {
  3. Map<String,Object>map= new HashMap<String, Object>();
  4. map.put( "age", 22);
  5. map.put( "id", 16);
  6. List<Employee>li=empolyeeMapper.selectByMap(map);
  7. for(Employee employee:li) {
  8. System.out.println(employee);
  9. }
  10. }

(4)删除


  
  1. // 删除(根据ID 批量删除)
  2. int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
  3. // 根据 ID 删除
  4. int deleteById(Serializable id);
  5. // 根据 columnMap 条件,删除记录
  6. int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

(三)不得不提的条件构造器---Wrapper

1.wrapper及其子类介绍 

(1)Wrapper :条件构造抽象类,最顶端父类,抽象类中提供3个方法以及其他方法.


(2)AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件,QueryWrapper(LambdaQueryWrapper) 和 UpdateWrapper(LambdaUpdateWrapper) 的父类用于生成 sql 的 where 条件, entity 属性也用于生成 sql 的 where 条件

AbstractWrapper比较重要,里面的方法需要重点学习.

该抽象类提供的重要方法如下:

 


(3)AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
(4)LambdaQueryWrapper :看名称也能明白就是用于Lambda语法使用的查询Wrapper
(5)LambdaUpdateWrapper : Lambda 更新封装Wrapper
(6)QueryWrapper : Entity 对象封装操作类,不是用lambda语法,自身的内部属性 entity 也用于生成 where 条件

该类的重要方法:

select方法


  
  1. select(String... sqlSelect)
  2. select(Predicate<TableFieldInfo> predicate)
  3. select(Class<T> entityClass, Predicate<TableFieldInfo> predicate)
  4. /*
  5. 例: select("id", "name", "age")
  6. 例: select(i -> i.getProperty().startsWith("test"))
  7. */


(7)UpdateWrapper : Update 条件封装,用于Entity对象更新操作.
该类主要有以下三个重要的方法:

set方法


  
  1. set( String column, Object val)
  2. set( boolean condition, String column, Object val)
  3. /*
  4. SQL SET 字段
  5. 例:  set( "name", "老李头")
  6. 例:  set( "name", "")--->数据库字段值变为空字符串
  7. 例:  set( "name", null)--->数据库字段值变为null
  8. 说明: boolean condition为控制该字段是否拼接到最终的sql语句中
  9. */

setSql方法


  
  1. setSql(String sql)
  2. /*
  3. 设置 SET 部分 SQL
  4. 例: setSql("name = '老李头'")
  5. */

2.带条件的crud实验

(1)带条件的查询


  
  1. // 根据 entity 条件,查询一条记录
  2. T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  3. // 根据 entity 条件,查询全部记录
  4. List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  5. // 根据 Wrapper 条件,查询全部记录
  6. List<Map<String, Object>> selectMaps( @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  7. // 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
  8. List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  9. // 根据 entity 条件,查询全部记录(并翻页)
  10. IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  11. // 根据 Wrapper 条件,查询全部记录(并翻页)
  12. IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
  13. // 根据 Wrapper 条件,查询总记录数
  14. Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

(2)带条件的更新


  
  1. @Test
  2. void update() {
  3. UpdateWrapper<Employee> updateWrapper= new UpdateWrapper<Employee>();
  4. updateWrapper.eq( "last_name", "lili").eq( "age", 18).set( "id", 100).set( false, "email", "000@qq.com");
  5. empolyeeMapper.update(employee, updateWrapper);
  6. }
  7. }

 其中set("id", 100).set(false, "email", "000@qq.com");中email属性设置为false,从执行的sql可以看出,设置为false不会拼接到最终的执行sql中

(3)带条件的删除


  
  1. // 根据 entity 条件,删除记录
  2. int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
  3. // 根据 columnMap 条件,删除记录
  4. int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

转载:https://blog.csdn.net/qq_42681787/article/details/105181645
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场