快速入门
MyBatisPlus可以节省大量工作时间,所有CRUD操作可以自动完成
1、创建数据库mybatis_plus
2、创建user
表
真实开发中,还需要version(乐观锁)
、deleted(逻辑删除)
、gmt_create(创建时间)
gmt_modified(修改时间)
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)
);
DELETE FROM user;
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');
3、编写项目
启动SpringBoot项目
- 不要同时导入
mybatis
和mybatisplus
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--mybatisplus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.3.2</version>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
4、POJO对象和Dao接口
对象创建使用lombok
只需要输入变量
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
dao
只需要继承BaseMapper<泛型>
并且传入泛型
@Mapper
@Repository
public interface UserDao extends BaseMapper<User> {
//目前所有CRUD已经实现,不需要自己写基础功能
}
测试
@Test
public void testMybatisPlus(){
//wrapper 条件构造器
System.out.println(userDao.selectList(null));
}
配置日志
配置日志,可以选择不同的日志,需要倒入依赖,这里选择控制台输出
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
输出可以看到SQL语句
CURD扩展
方法介绍
增删改查的方法基本类似
输入主键ID进行操作
例如: deleteById() selectById()
输入Collection<> List进行批量操作,输入ID列表
例如:deleteBatchIds() selectBatchIds()
输入Map增加条件,key是属性,value是条件
例如:deleteByMap() selectMaps()
输入Wrapper条件
Insert 分布式系统唯一ID生成
雪花算法:
- 最高位是符号位,始终为0,不可用。
- 41位的时间序列,精确到毫秒级,41位的长度可以使用69年。时间位还有一个很重要的作用是可以根据时间进行排序。注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截) 后得到的值,这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序SnowFlake类的START_STMP属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69
- 10位的机器标识,10位的长度最多支持部署1024个节点。
- 12位的计数序列号,序列号即一系列的自增id,可以支持同一节点同一毫秒生成多个ID序号,12位的计数序列号支持每个节点每毫秒产生4096个ID序号。
1、变量上增加自增注解
//主键自增
@TableId(type = IdType.AUTO)
2、数据库中将key设置为自增
public enum IdType {
AUTO(0), 数据库自增ID
NONE(1), 未设置主键
INPUT(2), 手动输入
ASSIGN_ID(3), 分配ID代替ID_WORKER,ID_WORKER_STR
ASSIGN_UUID(4), 分配UUID代替UUID
/** @deprecated */
@Deprecated
ID_WORKER(3), 默认全局ID
/** @deprecated */
@Deprecated
ID_WORKER_STR(3), 全局ID字符串表示
/** @deprecated */
@Deprecated
UUID(4); 全局唯一ID
}
自动填充
首先在数据库中增加属性create_time
和 update_time
并且在User
对象中加入变量
//字段自动填充,插入时填充和插入更新时填充
@TableField(fill = FieldFill.INSERT)
private Date createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
实现MetaObjectHandler
接口,实现公共字段自动填写
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
log.info("start insert fill ...");
//名称要和POJO对象变量名一样,而不是和数据库一样
this.setFieldValByName("createTime",new Date(),metaObject);
this.strictUpdateFill(metaObject,"updateTime",Date.class,new Date());
}
@Override
public void updateFill(MetaObject metaObject) {
log.info("start update fill ...");
this.setFieldValByName("updateTime",new Date(),metaObject);
}
通过以上代码可以实现,在插入和更新数据的时候,对创建时间和修改时间进行更新。
insert新数据
修改数据
乐观锁
在数据库中加入属性version
记录当前数据的版本,并且增加注解@Version
@Version //乐观锁注解
private Integer version;
增加乐观锁的配置组件
@Configuration
@EnableTransactionManagement
public class MybatisPlusConfig {
//乐观锁插件
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
测试乐观锁
//测试乐观锁
@Test
public void optimisticLocker(){
User user = userDao.selectById(6L);
user.setName("crj111");
User user2 = userDao.selectById(6L);
user2.setName("crj222");
if(userDao.updateById(user2) != 0){
System.out.println("user更新成功");
} else {
System.out.println("user更新失败");
}
if(userDao.updateById(user) != 0){
System.out.println("user2更新成功");
} else {
System.out.println("user2更新失败");
}
}
可以看出修改语句自动检查版本号,user2更新时,版本号已经改变,所以更新失败
分页查询
MybatisPlus内置了分页查询,先导入分页的拦截器组件
//拦截器插件
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求 默认false
// paginationInterceptor.setOverflow(false);
// 设置最大单页限制数量,默认 500 条,-1 不受限制
// pagina
tionInterceptor.setLimit(500);
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
//测试分页查询
@Test
public void pageSearch(){
//current当前页 size页大小
Page<User> page = new Page<>(1,5);
userDao.selectPage(page, null);
page.getRecords().forEach(System.out::println);
}
逻辑删除
- 物理删除:直接从数据库中删除
- 逻辑删除:在数据库中没有被移除,只是标记为删除,例如
deleted
字段
高版本中只需要加入变量就行
@TableLogic
private Integer deleted;
配置application.properties配置文件
#逻辑删除,没删设0,删了设1
mybatis-plus.global-config.db-config.logic-delete-field=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
@Test
public void delete(){
userDao.deleteById(1304673079976280066L);
}
可以看出delete方法执行时时update语句,查询的时候也会自动判断deleted
属性,被标记删除的数据,就查询不到
条件构造器Wrapper
遇到复杂的sql可以使用wrapper,AbstractWrapper
是 QueryWrapper
和 UpdateWrapper
的父类,用于生成sql的where条件,entity属性也用于生成sql的where条件
MyBatis-Plus官方文本
@Test
public void test1(){
//查询name邮箱不为空,年龄大于等于12的用户
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.isNotNull("name")
.isNotNull("email")
.ge("age",12);
userDao.selectList(wrapper).forEach(System.out::println);
}
代码自动生成器
AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。