【Mybatis-Plus】Mybatis-Plus的入门运用
【Mybatis-Plus】Mapper CRUD 接口
文章目录
实习快一个月了,老板给我的任务大多都是crud(哈哈哈,我也现在也只会这些),而且用的大都是
MP
,但有时候一些难的sql语句我也忘的差不多了,所以特来复习一遍。写的不对的地方希望大佬指出,感谢
学习MP
我特别推荐大家去官网学习,那个官网的内容看着非常舒适。
MyBatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提高效率
从这张图中我们可以看出MP旨在成为MyBatis的最好搭档,而不是替换MyBatis,所以可以理解为MP是MyBatis的一套增强工具,它是在MyBatis的基础上进行开发的,我们虽然使用MP但是底层依然是MyBatis的东西,也就是说我们也可以在MP中写MyBatis的内容。
对于MP的学习,大家可以参考着官方文档来进行学习,里面都有详细的代码案例。
MP的特性:
- 无侵入:只做增强不做改变,不会对现有工程产生影响
- 强大的 CRUD 操作:内置通用 Mapper,少量配置即可实现单表CRUD 操作
- 支持 Lambda:编写查询条件无需担心字段写错
- 支持主键自动生成
- 内置分页插件
- ……
🐹 案例环境搭建
我们这里直接用SpringBoot搭建环境
步骤1:创建数据库和表
create database if not exists mp_db character set utf8;
use mp_db;
CREATE TABLE user
(
id bigint(20) primary key auto_increment,
name varchar(32) not null,
password varchar(32) not null,
age int(3) not null,
tel varchar(32) not null
);
insert into user
values (1, 'Tom', 'tom', 3, '18866668888');
insert into user
values (2, 'Jerry', 'jerry', 4, '16688886666');
insert into user
values (3, 'Jock', '123456', 41, '18812345678');
步骤2:创建SpringBoot工程
步骤3:勾选配置使用技术
步骤4:pom.xml补全依赖
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.16</version>
</dependency>
步骤5:添加MP的相关配置信息
resources默认生成的是properties配置文件,可以将其替换成yml文件,并在文件中配置数据库连接的相关信息:application.yml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mp_db?serverTimezone=UTC
username: root
password: root(这里填自己的数据库密码)
步骤6:根据数据库表创建实体类
@Data
public class User {
private Long id;
private String name;
private String password;
private Integer age;
private String tel;
}
步骤7:创建Mapper接口
@Mapper
public interface UserMapper extends BaseMapper<User>{
}
**说明:**Dao接口要想被容器扫描到,有两种解决方案:
- 方案一:在Dao接口上添加
@Mapper
注解,并且确保Dao处在引导类所在包或其子包中- 该方案的缺点是需要在每一Dao接口中添加注解
- 方案二:在引导类上添加
@MapperScan
注解,其属性为所要扫描的Dao所在包- 该方案的好处是只需要写一次,则指定包下的所有Dao接口都能被扫描到,
@Mapper
就可以不写。
- 该方案的好处是只需要写一次,则指定包下的所有Dao接口都能被扫描到,
步骤9:编写测试类
@SpringBootTest
class MpDemoApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void testGetAll() {
User user = userMapper.selectById(1L);
System.out.println(user);
}
}
测试结果
一个简单的MP案例就做完了,是不是感觉很神奇,自己连sql语句都不需要写,只需要调用就ok了。
为了方便我们了解背后的原理,我们可以开启MP查询日志,还可以关点Springboot
的日志
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
banner: off # 关闭mybatisplus启动图标
🐰 如何使用
MybatisPlus(简称MP)是基于MyBatis框架基础上开发的增强型工具,旨在简化开发、提供效率。
- 通用
CRUD
封装BaseMapper
接口,为MP
启动时自动解析实体表关系映射转换为Mybatis
内部对象注入容器 - 泛型
T
为任意实体对象 - 参数
Serializable
为任意类型逐渐MP
不推荐使用复合主键,约定每一张表都有自己的唯一id
主键。 - 对象
Wrapper
为条件构造器
这里我会把BaseMapper
的源码中全部的方法用实际案例操作一遍。
🐤 Insert
// 插入一条记录
int insert(T entity);
参数说明
类型 | 参数名 | 描述 |
---|---|---|
T | entity | 实体对象 |
-
T:泛型,新增用来保存新增数据
-
int:返回值,新增成功后返回1,没有新增成功返回的是0
在测试类中执行此操作
@Test
void testInsert01()
{
User user =new User();
user.setName("小新");
user.setPassword("xiaoxin");
user.setAge(18);
user.setTel("123456");
int result = userMapper.insert(user);
System.out.println(result);
}
结果:数据库表中就会添加一条数据
🦆 Delete
// 删除(根据ID 批量删除)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
// 根据 ID 删除
int deleteById(Serializable id);
// 根据 columnMap 条件,删除记录
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
参数说明
类型 | 参数名 | 描述 |
---|---|---|
Wrapper | wrapper | 实体对象封装操作类(可以为 null) |
Collection<? extends Serializable> | idList | 主键 ID 列表(不能为 null 以及 empty) |
Serializable | id | 主键 ID |
Map<String, Object> | columnMap | 表字段 map 对象 |
Serializable:参数类型
思考:参数类型为什么是一个序列化类?
从这张图可以看出,
- String和Number是Serializable的子类,
- Number又是Float,Double,Integer等类的父类,
- 能作为主键的数据类型都已经是Serializable的子类,
- MP使用Serializable作为参数类型,就好比我们可以用Object接收任何数据类型一样。
测试1
// 测试根据 ID 删除
// int deleteById(Serializable id);
@Test
void testDelete01() {
userMapper.deleteById(1584836939757613057L);
}
结果1:
测试2
测试这个之前,我们先添加两条数据
// 删除(根据ID 批量删除)
// int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
@Test
void testDelete02() {
List<Long> list = new ArrayList<>();
list.add(1584840088849457153L);
list.add(1584840133686484993L);
userMapper.deleteBatchIds(list);
}
测试2结果:
测试3
// 根据 columnMap 条件,删除记录
// int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
@Test
void testDelete03() {
// 删除name为 小新 的记录
Map<String, Object> columnMap = new HashMap<>();
columnMap.put("name", "小新");
userMapper.deleteByMap(columnMap);
}
测试3结果
DELETE FROM user WHERE name = ?
表明根据name字段删除值为小新
的记录。
🐔 Update
// 根据 ID 修改
int updateById(@Param(Constants.ENTITY) T entity);
-
T:泛型,需要修改的数据内容,注意因为是根据ID进行修改,所以传入的对象中需要有ID属性值
-
int:返回值,修改成功后返回1,未修改数据返回0
@Test
void testUpdate01() {
User user = new User();
user.setId(1L);
user.setName("Tom888");
user.setPassword("tom888");
userMapper.updateById(user);
}
通过结果我们发现,我们修改的时候只修改对题对象中有值的字段,没设置值的就不会修改,就不需要像Mybatis
中那样还需要判断是否为null。
🌵 Select
// 根据 ID 查询
T selectById(Serializable id);
// 查询(根据ID 批量查询)
List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
// 查询(根据 columnMap 条件)
List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
测试1:
// 根据 ID 查询
// T selectById(Serializable id);
@Test
void testSelect01()
{
User user = userMapper.selectById(1L);
System.out.println(user);
}
测试1结果:
测试2:
// 查询(根据ID 批量查询)
// List<T> selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);
@Test
void testSelect02() {
List<Long> list =new ArrayList<>();
list.add(1L);
list.add(2L);
List<User> users = userMapper.selectBatchIds(list);
System.out.println(users);
}
测试3:
// 查询(根据 columnMap 条件)
// List<T> selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
@Test
void testSelect03() {
// 查询name等于Jock的记录
Map<String, Object> map = new HashMap<>();
map.put("name", "Jock");
List<User> users = userMapper.selectByMap(map);
System.out.println(users);
}
🎅 小结
MyBatis-Plus
(简称 MP)是一个Mybatis
的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。在很多项目中都能见到它的身影,对于天天写CRUD
对我更是家常便饭。
接下来我将继续介绍关于MP
的其他知识,感谢大佬支持。