CRUD 是 4 个单词的首字母

CRUD 分别指增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)这 4 个单词的首字母。

一、通用 Mapper

MyBatis-Plus(MP)中的基本 CRUD 在内置的 BaseMapper 中都已得到了实现。

1、Create

创建 MapperTests 测试类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@SpringBootTest
public class MapperTests {
@Resource
private UserMapper userMapper;

@Test
public void testInsert() {
User user = new User();
user.setName("张三");
user.setAge(18);
user.setEmail("123@qq.com");
int result = userMapper.insert(user);
System.out.println(result);
}
}

2、Retrieve

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Test
public void testSelect() {
// 按id查询
// ==> Preparing: SELECT id,name,age,email FROM user WHERE id=?
User user = userMapper.selectById(1);
System.out.println("user = " + user);

// 按id列表查询
// ==> Preparing: SELECT id,name,age,email FROM user WHERE id IN ( ? , ? , ? )
List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
System.out.println("users = " + users);

// 将map集合中不同的查询条件用and连接到一起,按条件查询
// ==> Preparing: SELECT id,name,age,email FROM user WHERE name = ? AND age = ?
HashMap<String, Object> map = new HashMap<>();
// 注意此处是表中的列名,不是类中的属性名
map.put("name", "张三");
map.put("age", 18);
List<User> userList = userMapper.selectByMap(map);
System.out.println("userList = " + userList);
}

3、Update

1
2
3
4
5
6
7
8
9
10
11
12
@Test
public void testUpdate() {
// update时生成的sql自动是动态sql,避免了误操作
// ==> Preparing: UPDATE user SET name=? WHERE id=?
User user = new User();
user.setId(1L);
user.setName("李四");
int result = userMapper.updateById(user);
// 受影响的行数
// result = 1
System.out.println("result = " + result);
}

4、Delete

1
2
3
4
5
6
@Test
public void testDelete() {
// ==> Preparing: DELETE FROM user WHERE id=?
int result = userMapper.deleteById(1L);
System.out.println("影响的行数:" + result);
}

二、通用 Service

MP 中有一个接口 IService 和其实现类 ServiceImpl,封装了常见的业务层逻辑

1、创建 Service 接口

创建 service 包,创建 UserService 接口,继承 IService

1
2
3
4
5
6
7
8
package com.atguigu.mybatisplus.service;

import com.atguigu.mybatisplus.entity.User;
import com.baomidou.mybatisplus.extension.service.IService;

// 需要管理哪个实体,就写哪个泛型
public interface UserService extends IService<User> {
}

2、创建 Service 实现类

创建 impl 包,创建 UserServiceImpl,继承 ServiceImpl,实现 UserService

1
2
3
4
5
package com.atguigu.mybatisplus.service.impl;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}

3、创建测试类

创建 ServiceTests,测试查询总记录数

1
2
3
4
5
6
7
8
9
10
11
12
13
@SpringBootTest
public class ServiceTests {
@Resource
private UserService userService;

@Test
public void testCount() {
// 查询总记录数
// ==> Preparing: SELECT COUNT( * ) FROM user
int count = userService.count();
System.out.println("总记录数:" + count);
}
}

5、测试批量插入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Test
public void testSaveBatch() {
// 批量插入
// ==> Preparing: INSERT INTO user ( id, name, age ) VALUES ( ?, ?, ? )
ArrayList<User> users = new ArrayList<>();
for (int i = 0; i < 5; i++) {
User user = new User();
user.setName("张" + i);
user.setAge(18 + i);
users.add(user);
}
// return !CollectionUtils.isEmpty(list) && executeBatch(entityClass, log, (sqlSession) ->
boolean b = userService.saveBatch(users);
System.out.println("插入是否成功:" + b);
}

三、自定义 Mapper

当通用 Mapper 无法满足我们的需求时,我们可以自定义基于 Mapper 接口的 xml 文件,并在 xml 文件中配置 SQL 语句

1、接口方法定义

在 UserMapper 接口中定义如下方法

1
2
3
public interface UserMapper extends BaseMapper<User> {
List<User> selectAllByName(String name);
}

2、创建 xml 文件

在 resources 目录中创建mapper目录,在mapper目录中创建UserMapper.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?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.atguigu.mybatisplus.mapper.UserMapper">

<sql id="Base_Column_List">
id
,name,age,email
</sql>

<select id="selectAllByName" resultType="com.atguigu.mybatisplus.entity.User">
select
<include refid="Base_Column_List"/>
from user
where name = #{name}
</select>

</mapper>

注意:MP 中 mapper 目录是持久层映射文件的默认目录,如果是其他目录,则需要在application.properties配置 mapper-locations,例如:

1
mybatis-plus.mapper-locations=classpath:xml/*.xml

3、测试条件查询

在 MapperTests 中创建如下测试用例

1
2
3
4
5
6
@Test
public void testSelectAllByName(){
// ==> Preparing: select id,name,age,email from user where name = ?
List<User> users = userMapper.selectAllByName("Tom");
users.forEach(System.out::println);
}

四、自定义 Service

1、添加接口方法

UserService 中添加接口方法

1
2
3
public interface UserService extends IService<User> {
List<User> listAllByName(String name);
}

2、实现接口方法

1
2
3
4
5
6
7
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
@Override
public List<User> listAllByName(String name) {
return baseMapper.selectAllByName(name);
}
}

3、测试

ServiceTests 中添加测试方法

1
2
3
4
5
6
@Test
public void testListAllByName() {
// ==> Preparing: select id ,name,age,email from user where name = ?
List<User> users = userService.listAllByName("Tom");
users.forEach(System.out::println);
}