Mybatis-Plus 常用增删改查方法详解(Wrapper 条件构造器的使用)
Posted Yan Yang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mybatis-Plus 常用增删改查方法详解(Wrapper 条件构造器的使用)相关的知识,希望对你有一定的参考价值。
Mybatis-Plus
内容
一、Mybatis-Plus 概念
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
二、项目准备(以 SpringBoot 项目为例)
1. 项目结构图
2. 数据表
2.1 数据表截图
2.2 建表语句
CREATE TABLE `employee` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`password` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`admin` bit(1) DEFAULT NULL,
`dept_id` bigint(20) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;
3. 项目依赖
3.1 集成 SpringBoot 项目
这里是用 SpringBoot 集成 Mybatis-Plus 需要引入的依赖,自己可以根据需求自己添加依赖。
- pom.xml
<?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>mybatis-plus</groupId>
<artifactId>mybatis-plus-demo</artifactId>
<version>1.0.1</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.3</version>
</parent>
<dependencies>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.17</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.22</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.16</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
3.2 集成 SSM 项目
Spring 整合 Mybatis-plus 很简单,只需把mybatis的依赖换成mybatis-plus的依赖,再把sqlSessionFactory换成mybatis-plus的即可;下面只给出核心依赖,自己根据需求引入其他依赖。本项目还需要的依赖有:mysql驱动、Druid、日志(slf4j-api,slf4j-log4j2)、lombok。集成mybatis-plus要把mybatis、mybatis-spring去掉,避免冲突。
- pom.xml
<!-- spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>4.3.14.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.14.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- mp 依赖 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>2.3</version>
</dependency>
4. application.properties 配置文件
server.port=8888
#mysql
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis-plus?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2b8:00
spring.datasource.username=root
spring.datasource.password=admin
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# mybatis 配置 slq 打印日志
#logging.level.com.yy.mp.mapper=debug
# mybatis-plus 配置 slq 打印日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
5. Employee 实体类
package com.yy.mp.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
// @TableName("t_employee") // 表名映射注解,当类名跟表名不一致时使用
public class Employee {
// mybatis-plus id 策略默认是使用雪花算法(随机生成一组唯一的数字)
@TableId(type = IdType.AUTO) // id注解,指定 id生成算法(AUTO 为数据表自增)
private Long id;
// @TableField("name") // 列名映射注解,当属性名跟列名不一致时使用
private String name;
private String password;
private String email;
private int age;
private Boolean admin;
private Long deptId;
@TableField(exist = false) // 当表中没有该列时使用
private int sex; // 表中没有的列
@TableField(exist = false)
private Department dept;
}
6. EmployeeMapper
public interface EmployeeMapper extends BaseMapper<Employee> {
}
7. App 启动类
@SpringBootApplication
@MapperScan(basePackages = "com.yy.mp.mapper")
public class App {
}
三、Mybatis-Plus 常用注解
-
@TableName(“t_employee”)
描述:表名注解;
作用:当表名与类名不一致时使用,指定当前实体类映射哪张数据库表, 默认是跟实体类名一致;
@TableName("t_employee") // 表名映射注解,当类名跟表名不一致时使用
public class Employee {}
-
@TableId(value=“id”, type= IdType.AUTO)
描述:主键注解;
作用:标记当前属性为映射表主键,type = IdType.AUTO 指定 id 生成算法(AUTO 为数据表自增);
@TableId(type = IdType.AUTO) // id注解,指定 id生成算法(AUTO 为数据表自增)
private Long id;
-
@TableField(value=“employename”,exist = false)
描述:字段注解(非主键);
作用:当属性名跟列名不一致时使用,指定当前属性映射数据库表哪一列, 默认是跟属性名一致;
@TableField("name") // 列名映射注解,当属性名跟列名不一致时使用
private String name;
-
@Version
描述:乐观锁注解、标记 @Verison 在字段上
作用:用于标记乐观锁操作字段
四、Mybatis-Plus 日志
# mybatis 配置 slq 打印日志
#logging.level.com.yy.mp.mapper=debug
# mybatis-plus 配置 slq 打印日志
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
五、通用 BaseMapper 接口方法
1. insert 添加(1个)
// 需求:添加一条用户信息
// 打印的SQL语句:INSERT INTO employee ( name, password, email, age, admin, dept_id ) VALUES ( ?, ?, ?, ?, ?, ? )
@Test
public void testSave(){
Employee employee = new Employee();
employee.setAdmin(true);
employee.setAge(18);
employee.setDeptId(1L);
employee.setEmail("yanyang@wolfcode");
employee.setName("yanyang");
employee.setPassword("111");
employeeMapper.insert(employee);
}
2. update 更新(2个)
2.1 updateById
- 根据 id 更新单条数据
// 需求: 将 id=20 用户名字修改为 yy
// 打印的SQL语句:UPDATE employee SET name=?, age=? WHERE id=?
@Test
public void testUpdateById() {
Employee employee = new Employee();
employee.setId(20L);
employee.setName("yy");
employeeMapper.updateById(employee);
}
2.2 修改参数丢失(更新部分数据时)
-
注意:基本数据类型默认值的存在导致属性参与 sql 拼接,引起参数丢失问题
-
参数实体属性值如果为 null,不参与 sql 拼接;
-
如果参数实体属性类型是 8 大基本数据类型,有不为 null 的默认值,mybatis-plus 认为有属性值,参数参与 sql 拼接;
-
-
解决:
方案一:将基本数据类型属性改为包装类型;
方案二:1> 先查询得到整条数据;2> 修改该条数据上想要修改的字段;3> 更新整条数据;
方案三:使用 update(null,wrapper)方法操作,部分字段更新方法;
2.3 update
- 根据传入的条件更新数据
// 需求: 将 id=20 用户名字修改为 yy
// 打印的SQL语句:UPDATE employee SET name=? WHERE (id = ?)
// 部分字段更新
@Test
public void testUpdate() {
// 条件构造器:暂时理解 where 条件拼接逻辑
UpdateWrapper<Employee> wrapper = new UpdateWrapper<>();
wrapper.eq("id", 20L); // 等价于:where id = 20
wrapper.set("name", "yy"); // 等价于:set name = yy
employeeMapper.update(null, wrapper);
}
2.4 updateById(entry) 跟 update(null, wrapper) 怎么选择?
-
updateById(entry)
1> sql 的 where 条件是 id 时使用;
2> 全部字段更新时使用;
-
update(null, wrapper)
1> sql 的 where 条件不一定是 id 时使用,例如 eg:where age > 19;
2> 部分字段更新时使用;
3. delete 删除(4个)
3.1 deleteById
- 根据 id 删除单条数据
// 需求:删除 id = 20 的员工信息
// 打印的SQL语句:DELETE FROM employee where id = ?
@Test
public void testDeleteById() {
employeeMapper.deleteById(20L);
}
3.2 deleteBatchIds
- 根据 id 集合,批量删除数据
// 需求:删除 id=21,id=22 的员工信息
// 打印的SQL语句:DELETE FROM employee WHERE id IN ( ? , ? )
@Test
public void deleteBatchIds() {
employeeMapper.deleteBatchIds(Arrays.asList(21L, 22L));
}
3.3 deleteByMap
- 根据传入的约束条件删除对应数据
// 需求:删除 name=yanyang 且 age=18 的员工信息
// 打印的SQL语句:DELETE FROM employee WHERE name = ? AND age = ?
@Test
public void testDeleteByMap() {
// key:条件对应的表列;value:条件对应的表值
Map<String, Object> map = new HashMap<>();
map.put("name", "yanyang");
map.put("age", 18);
employeeMapper.deleteByMap(map);
}
3.4 delete
- 使用条件构造器,根据传入条件删除对应数据
// 需求:删除 name=yanyang 且 age=18 的员工信息
// 打印的SQL语句:DELETE FROM employee WHERE (name = ? AND age = ?)
@Test
public void testDelete() {
// updateWrapper:更新操作使用
// QueryWrapper:查询条件使用
QueryWrapper<Employee> wrapper = new QueryWrapper<>();
wrapper.eq("name", "yanyang");
wrapper.eq("age", 18);
employeeMapper.delete(wrapper);
}
4. select 删除(7个)
4.1 selectById
- 根据 id 查询单条数据
// 需求:查询 id=1 的员工信息
// 打印的SQL语句:SELECT id,name,password,email,age,admin,dept_id FROM employee WHERE id=?
@Test
public void testSelectById() {
Employee employee = employeeMapper.selectById(1L);
System.out.println("employee = " + employee);
}
4.2 selectBatchIds
- 根据 id 集合查询多条数据
// 需求:查询 id=1,id=2 的员工信息
// 打印的SQL语句:SELECT id,name,password,email,age,admin,dept_id FROM employee WHERE id IN ( ? , ? )
@Test
public void selectBatchIds() {
List<Employee> employees = employeeMapper.selectBatchIds(Arrays.asList(1L, 2L));
employees.forEach(System.out::println);
}
4.3 selectByMap
- 根据条件查询所有数据,map 作为查询条件
// 需求:查询 name=yanyang,且 age=18 的员工信息
// 打印的SQL语句:SELECT id,name,password,email,age,admin,dept_id FROM employee WHERE name = ? AND age = ?
@Test
public void selectByMap() {
// key:条件对应的表列;value:条件对应的表值
Map<String, Object> map = new HashMap<>();
map.put("name", "yanyang");
map.put("age", 18);
List<Employee> employee = employeeMapper.selectByMap(map);
System.out.println("employee = " + employee);
}
4.4 selectCount
- 查询数据总条数
// 需求:查询所有员工个数
// 打印的SQL语句:SELECT COUNT( 1 ) FROM employee
@Test
public void selectCount() {
// 没有条件查询所有
Integer count = employeeMapper.selectCount(null);
System.out.println("count = " + count);
}
4.5 selectList
- 根据条件查询所有数据
// 需求:查询所有员工信息,返回 List<Employee>
// 打印的SQL语句:SELECT id,name,password,email,age,admin,dept_id FROM employee
@Test
public void selectList() {
// 如果加 wrapper 表示条件查询,如果为 null,表示查询所有
List<Employee> employees = employeeMapper.selectList(null);
employees.forEach(System.out::println);
}
4.6 selectMaps
- 根据条件查询所有数据,查询出来的为 List
// 需求:查询所有员工信息,返回 List<Map>
// 打印的SQL语句:SELECT id,name,password,email,age,admin,dept_id FROM employee
@Test
public void selectMaps() {
// 如果加 wrapper 表示条件查询,如果为 null,表示查询所有
List<Map<String, Object>> employees = employeeMapper.selectMaps(null);
for (Map<String, Object> employee : employees) {
System.out.println("employee = " + employee);
}
}
4.7 selectList(wrapper) 跟 selectMaps(wrapper) 怎么选择?
- 查询数据能封装成 domain 使用 selectList
- 查询数据不能封装成 domain 使用 selectMaps
4.8 selectPage 分页查询
- App 启动类
@SpringBootApplication
@MapperScan(basePackages = "com.yy.mp.mapper"SQLAlchemy(二):SQLAlchemy对数据的增删改查操作属性常用数据类型详解
Java:SpringBoot整合MyBatis-Plus实现MySQL数据库的增删改查
SpringBoot + MyBatis-Plus +MySQL8 +Thymeleaf +LayUI通用业务模块增删改查
springboot系列:如何通过mybatis-plus实现接口增删改查|超级详细,建议收藏