我们都知道MyBatis是目前比较常用的持久层框架;这个框架的使用也是很简单的,我们在使用的时候,只需要关注mapper的接口层和对应的xml文件即可。
但是MyBatis作为一个半自动框架,是需要我们自己手动编写sql语句的,对于一些单表的简单查询我们还是不大喜欢都需要自己来编写,虽然MyBatis也提供了代码生成器可以自动生成部分代码,但是依旧不够灵活。
所以MyBatis-Plus就出现了,MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。MyBatis-Plus官方网站:官网
1.快速使用
1.1 创建数据库及数据库表
创建表
CREATE DATABASE `mybatis_plus`;
use `mybatis_plus`;
CREATE TABLE `user` (
`id` bigint(20) NOT NULL COMMENT '主键ID',
`name` varchar(30) DEFAULT NULL COMMENT '姓名',
`age` int(11) DEFAULT NULL COMMENT '年龄',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
添加测试数据
INSERT INTO user (id, name, age) VALUES
(1, 'Jone', 18),
(2, 'Jack', 20),
(3, 'Tom', 28),
(4, 'Sandy', 21),
(5, 'Billie', 24);
1.2 创建Spring Boot项目
pom.xml
引入相关依赖
<!--mybatis-plus启动器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter-web</artifactId>
<version>3.5.1</version>
</dependency>
<!--lombok用于简化实体类开发-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.5.1</version>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.31</version>
</dependency>
主配置文件
spring:
# 配置数据源信息
datasource:
# 配置数据源类型
type: com.zaxxer.hikari.HikariDataSource
# 配置连接数据库的各个信息
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=utf8&autoReconnect=true&useSSL=false&allowMultiQueries=true
username: root
password: 12345678
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
1.3 基本的crud
MyBatis-Plus中的基本CRUD在内置的BaseMapper中都已得到了实现,我们可以直接继承该类就可以直接使用了。
创建User类
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
}
创建UserMapper接口
这个接口需要继承BaseMapper接口,才能使用基本的crud方法。可以看到我们没有在mapper接口中编写任何方法,同时也没有编写对应的xml文件。此时,我们已经可以实现基本的crud了。
@Repository
public interface UserMapper extends BaseMapper<User> {
}
添加包扫描路径
1.4 开始测试
1.4.1 插入测试
@SpringBootTest
class MybatisplusApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
public void testInsert(){
User user = new User();
user.setName("picacho");
user.setAge(18);
int result = userMapper.insert(user);
System.out.println("result:"+result);
System.out.println("id:"+user.getId());
}
}
测试效果:
这里,MyBatis-Plus默认使用雪花算法生成唯一主键插入到user表中。
1.4.2 删除测试
- 通过id删除单个数据
@Test
public void testDeleteById(){
// 1614268020820037633, 这里删除前面插入的记录
int result = userMapper.deleteById(1614268020820037633L);
System.out.println("受影响的行数:" + result);
}
测试效果:
- 通过id批量删除记录
@Test
public void testDeleteBatchIds(){
List<Long> idsList = Arrays.asList(1L, 2L, 3L);
int result = userMapper.deleteBatchIds(idsList);
System.out.println("受影响的行数:" + result);
}
测试效果:
- 通过map条件删除记录
@Test
public void testDeleteMap(){
Map<String, Object> map = new HashMap<>();
map.put("name", "Sandy");
map.put("age", 21);
int result = userMapper.deleteByMap(map);
System.out.println("受影响的行数:" + result);
}
测试效果:
1.4.3 修改测试
@Test
public void testUpdateById(){
User user = new User(5L, "picacho", 18);
int result = userMapper.updateById(user);
System.out.println("受影响的行数:" + result);
}
测试效果:
1.4.4 查询测试
由于前面将测试数据都删除了,所以这里先插入一些数据后再查询。
- 通过id查询记录
@Test
public void testSelectById(){
User user = userMapper.selectById(5L);
System.out.println(user);
}
测试效果:
- 通过多个id查询记录
@Test
public void testSelectBatchByIds(){
List<Long> idsList = Arrays.asList(1614277703085600770L, 1614277704847208450L, 5L);
List<User> userList = userMapper.selectBatchIds(idsList);
System.out.println(userList);
}
测试效果:
- 通过map条件查询记录
@Test
public void testSelectByMap(){
Map<String, Object> map = new HashMap<>();
map.put("age", 18);
map.put("name", "picacho0");
List<User> userList = userMapper.selectByMap(map);
System.out.println(userList);
}
测试效果:
- 查询所有记录
@Test
public void testSelect(){
List<User> userList = userMapper.selectList(null); // 这里没有使用条件选择器
System.out.println(userList);
}
测试效果:
可以看到,我们没有编写任何方法和sql语句,但是却能实现上面展示的各种方法,这是由于这些方法是MyBatis Plus提供的,sql语句是自动生成的。
2.通用Service
通用 Service CRUD 封装IService接口,进一步封装 CRUD。
采用 get 查询单行,remove 删除,list 查询集合,page 分页。前缀命名方式区分 Mapper 层避免混淆,泛型 T 为任意实体对象
2.1 IService
MyBatis-Plus中有一个接口 IService和其实现类 ServiceImpl,封装了常见的业务层逻辑。
2.2 创建Service接口和实现类
public interface UserService extends IService<User> {
}
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
}
2.3 测试基本方法
这里使用和mapper层基本一致,只是将具体实现提升到了service层。
2.3.1 测试查询记录
@Autowired
private UserService userService;
@Test
public void testSelectCount(){
long count = userService.count();
System.out.println("查询的行数:" + count);
}
测试效果:
2.3.2 测试批量插入
@Test
public void testSaveBatch(){
// SQL长度有限制,海量数据插入单条SQL无法实行,因此MP将批量插入放在了通用Service中实现,而不是通用Mapper
ArrayList<User> users = new ArrayList<>();
for (int i = 0; i < 5; i++) {
User user = new User();
user.setName("picacho" + i);
user.setAge(20 + i);
users.add(user);
}
// INSERT INTO t_user ( username, age ) VALUES ( ?, ? )
userService.saveBatch(users);
}
测试效果:
MyBatis-Plus的基本使用与MyBatis基本一致,只是不用我们自己去编写xml文件了,可以看到还是很好用的,同时我们也可以像使用MyBatis一样,自己编写xml文件;几乎可以说是无缝对接。