快速入门
https://baomidou.com/pages/226c21/#%E5%88%9D%E5%A7%8B%E5%8C%96%E5%B7%A5%E7%A8%8B
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');
-- 真实开发中,version(乐观锁),deleted(逻辑删除),get_create,gmt_modified
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0+ 版本</version>
<relativePath/>
</parent>
<dependencies>
<!-- 数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- mybatis_plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.2</version>
</dependency>
</dependencies>
application.yml
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&useUnicode=true&characterEncoding=Utf-8&serverTimezone=GMT%2B8
driver-class-name: com.mysql.cj.jdbc.Driver
记得在spring boot的启动类添加扫面注解 @MapperScan (“com.xz.mapper”)扫描Mapper文件夹
- pojo
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
private int id;
private String name;
private Integer age;
private String email;
}
- mapper接口
@Repository//持久层
public interface UserMapper extends BaseMapper<User> {
}
- 测试
@Autowired
private UserMapper userMapper;
@Test
void contextLoads() {
//参数是一个wrapper ,条件构造器
List<User> users = userMapper.selectList(null);
users.forEach(System.out::println);
}
日志
# 方式一
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 方式二 application.yml 中增加配置,指定 mapper 文件所在的包
logging:
level:
com.baomidou.example.mapper: debug
CRUD
//insert
@Test
public void testInsert(){
User user = new User();
user.setName("Mybatis_plus--study");
user.setAge(3);
user.setEmail("2673888518@qq.com");
int result = userMapper.insert(user);
System.out.println(result);
System.out.println(user);
}
@TableId(type = IdType.AUTO)//主键自增*
自动填充
创建时间,修改时间
一、数据库级别
二、代码级别
实体类字段属性增加注解
@TableField(fill = FieldFill.INSERT)
private Date creatTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
编写处理器–处理注解
package com.xz.handler;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.util.Date;
@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
//插入的填充策略
@Override
public void insertFill(MetaObject metaObject) {
//setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObject)
this.setFieldValByName("creatTime",new Date(),metaObject);
this.setFieldValByName("updateTime",new Date(),metaObject);
}
//更新的填充策略
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime",new Date(),metaObject);
}
}
乐观锁
乐观锁实现方式:
- 取出记录时,获取当前 version
- 更新时,带上这个 version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果 version 不对,就更新失败
数据库增加version
实体类字段属性增加
@Version//代表乐观锁
private Integer version;
注册组件
@EnableTransactionManagement//自动管理事务(默认是开启的)
@MapperScan("com.xz.mapper")//扫面mapper文件夹
@Configuration//配置类
public class MyBatisPlusConfig {
//注册乐观锁插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return mybatisPlusInterceptor;
}
}
测试
//测试乐观锁成功
@Test
public void testOption(){
User user = userMapper.selectById(2);
user.setName("乐观锁");
user.setAge(10);
userMapper.updateById(user);
}
//测试乐观锁失败-----多线程情况下
@Test
public void testOption2(){
//线程一
User user = userMapper.selectById(2);
user.setName("乐观锁");
user.setAge(10);
//线程二
User user2 = userMapper.selectById(2);
user2.setName("乐观锁222");
user2.setAge(10);
userMapper.updateById(user2);
//自旋锁多次尝试
userMapper.updateById(user);
}
查询
//批量查询
@Test
public void testSelect(){
List<User> userList = userMapper.selectBatchIds(Arrays.asList(2,3,4));
userList.forEach(System.out::println);
}
//条件查询map
@Test
public void testSelectMap(){
HashMap<String, Object> map = new HashMap<>();
//自定义查询
map.put("name","乐观锁222");
List<User> userList = userMapper.selectByMap(map);
userList.forEach(System.out::println);
}
分页查询
配置
//分页插件
@Bean
public MybatisPlusInterceptor PaginationInnerInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
测试
//测试分页查询
@Test
public void testPage(){
Page<User> page = new Page<>(1,4);
userMapper.selectPage(page,null);
page.getRecords().forEach(System.out::println);
}
逻辑删除
步骤 1: 配置
- 例: application.yml
mybatis-plus:
global-config:
db-config:
logic-delete-field: flag # 全局逻辑删除的实体字段名(since 3.3.0,配置后可以忽略不配置步骤2)
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
步骤 2: 实体类字段上加上@TableLogic
注解
@TableLogic
private Integer deleted;
条件构造器 – Wrapper
代码自动生成器
好东西!!!!!