这是我参与8月更文挑战的第2天,活动详情查看:8月更文挑战
MyBatis-Plus快速使用
简介
mybatis增强工具。
特性
官网原文
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
- 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
- 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
- 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
- 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
- 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
- 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
- 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
- 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
框架结构
快速开始
有一张user表
对应sql
DROP TABLE IF EXISTS user;
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');
创建一个Spring Boot 项目
主要依赖web,mysql,mybatis-plus
配置yml
application.yml
#port
server:
port: 8800
#mysql
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/test?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8
username: root
password: root
编码
实体类和Mapper
User.java
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
UserMapper.java
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
测试
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void contextLoads() {
}
@Test
public void testSelect() {
System.out.println(("----- selectAll method test ------"));
List<User> userList = userMapper.selectList(null);
userList.forEach(System.out::println);
}
}
上面直接继承BaseMapper,然后调用方法无需手撸sql
编码
实体类和Mapper
User.java
@Data
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
UserMapper.java
@Mapper
public interface UserMapper extends BaseMapper<User> {
}
测试
@SpringBootTest
class MybatisPlusApplicationTests {
@Autowired
private UserMapper userMapper;
@Test
void contextLoads() {
}
@Test
public void testSelect() {
System.out.println(("----- selectAll method test ------"));
List<User> userList = userMapper.selectList(null);
userList.forEach(System.out::println);
}
}
上面直接继承BaseMapper,然后调用方法无需手撸sql
我们来看下BaseMapper,可以许多可以直接拿来用的方法
参数entity和id就先忽略,直接使用就行。
我们来看下columnMap和queryWrapper这两个参数
columnMap是一个map,字面意思就是键值对,写个方法测试
@Test
public void testSelectByMap() {
Map<String,Object> map = new HashMap<>();
map.put("id",1);
List<User> users = userMapper.selectByMap(map);
System.out.println(users);
}
再来看下queryWrapper,是Wrapper类型,是个条件构造器
\
Wrapper是个抽象类,有很多继承类。
我们先关注这三类Lambda,Query,Update
查看继承关系
QueryWrapper 和 QueryChainWrapper
查看QueryWrapper方法
测试queryWrapper
@Test
public void testQueryWrapper() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//自定义所取的列
QueryWrapper<User> ids = queryWrapper.select("id", "name", "age");
//eq条件查询,相当于拼接的where条件
queryWrapper.eq("id",1L);
List<User> users = userMapper.selectList(ids);
users.forEach(System.out::println);
}
测试queryChainWrapper
queryChainWrapper多了链式查询方法,如list,one
@Test
public void testQueryChainWrapper() {
//QueryChainWrapper使用
QueryChainWrapper<User> queryChainWrapper = new QueryChainWrapper<>(userMapper);
//list
List<User> list = queryChainWrapper.list();
list.forEach(System.out::println);
//one
queryChainWrapper.eq("id", 1L);
User one = queryChainWrapper.one();
System.out.println(one);
}
UpdateWrapper 和**UpdateChainWrapper**
测试UpdateWrapper
@Test
public void testUpdateWrapper() {
//updateWrapper使用
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
//更新age列所有值
UpdateWrapper<User> age = updateWrapper.set("age", 18);
userMapper.update(new User(), age);
//eq条件更新字段值
updateWrapper.eq("name", "Jone");
User user = new User();
user.setEmail("Jone@baomidou.com");
userMapper.update(user, updateWrapper);
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
//通过id修改字段值
User user2 = new User();
user2.setId(1L);
user2.setAge(22);
userMapper.updateById(user2);
List<User> users2 = userMapper.selectList(null);
users2.forEach(System.out::println);
}
测试UpdateChainWrapper
@Test
public void testUpdateChainWrapper() {
//updateChainWrapper使用
UpdateChainWrapper<User> updateChainWrapper = new UpdateChainWrapper<>(userMapper);
updateChainWrapper.eq("name","Jone").set("email","test1@baomidou.com");
//remove移除这条数据
updateChainWrapper.remove();
}
LambdaQueryWrapper 和 LambdaUpdateWrapper
测试LambdaQueryWrapper
@Test
public void testLambdaQueryWrapper() {
//lambdaQueryWrapper使用
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getId, 2);
List<User> users = userMapper.selectList(lambdaQueryWrapper);
users.forEach(System.out::println);
//LambdaQueryChainWrapper使用
LambdaQueryChainWrapper<User> lambdaQueryChainWrapper = new LambdaQueryChainWrapper<>(userMapper);
List<User> list = lambdaQueryChainWrapper.list();
list.forEach(System.out::println);
}
测试LambdaUpdateWrapper
@Test
public void testLambdaUpdateWrapper() {
//lambdaQueryWrapper使用
LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
LambdaUpdateWrapper<User> xiaomi = lambdaUpdateWrapper.eq(User::getId, 2).set(User::getName, "xiaomi");
userMapper.update(null, xiaomi);
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
//lambdaQueryWrapper使用
LambdaUpdateChainWrapper<User> lambdaUpdateChainWrapper = new LambdaUpdateChainWrapper<>(userMapper);
User user = new User();
user.setName("xiaomi");
lambdaUpdateChainWrapper.eq(User::getId, 3).update(user);
List<User> users1 = userMapper.selectList(null);
users1.forEach(System.out::println);
}