Mybatis-Plus学习笔记(狂神说版)

Mybatis-Plus

快速开始

导入依赖

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.1</version>
</dependency>

导入数据库

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');

配置数据源

spring.datasource.username=root
spring.datasource.password=123123
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncodind=utf8&useSSL=true&serverTimezone=GMT
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

创建实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {
   
    private Long id;
    private String name;
    private Integer age;
    private String email;
}

创建mapper接口,实现BaseMapper接口,泛型即为实体类对象,注册为组件

//在对应的mapper上面继承基本的类 BaseMapper
@Repository//代表持久层
public interface UserMapper extends BaseMapper<User> {
   
    //所有CRUD操作都已经编写完成了
    //你不需要向以前一样配置一大堆文件了!
}

@MapperScan在主入口类中扫描mapper所在的包

@MapperScan("com.lyk.mapper")

测试

@SpringBootTest
class MybatisPlusHelloApplicationTests {
   
    @Autowired
    private UserMapper userMapper;
    @Test
    void contextLoads() {
   
        List<User> users = userMapper.selectList(null);
        for (User user : users) {
   
            System.out.println(user);
        }
    }
}

测试成功,我们发现真的不用写那些基础的CURD操作了!!!

配置日志

配置日志 (默认控制台输出)

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

这样我们就可以在控制台上看到执行细节了

Insert插入

主键生成策略

默认生成,通过雪花算法生成ID 参考博客:https://blog.csdn.net/lq18050010830/article/details/89845790

==>  Preparing: INSERT INTO user ( id, name, age, email ) VALUES ( ?, ?, ?, ? )
==>  Parameters: 1423577873627734017(Long), 李永康(String), 19(Integer), 2238770242@qq.com(String)

可以观察到@TableId注解下有很多主键生成方案

AUTO(0),自增长ID,前提是将数据库设置为自增长
INPUT(2),自己输入ID
ASSIGN_ID(3),雪花算法,默认
ASSIGN_UUID(4),不带下划线的UUID,但是是String类型的

Update更新

通过updateById方法(参数传入一个对象,而不是一个值

通过实践发现,Mybatis-Plus是帮我们自动拼接了动态sql

    @Test
    void updateText(){
   
        User user = new User();
        user.setId(8848L);
        user.setAge(15);
//      user.setName("李晶晶");
        userMapper.updateById(user);
    }

当我们为对象只注入Age属性的时候

sql是这样的:==> Preparing: UPDATE user SET age=? WHERE id=?


@Test
void updateText(){
   
    User user = new User();
    user.setId(8848L);
    user.setAge(15);
    user.setName("李晶晶");
    userMapper.updateById(user);
}

当我们即注入的Age,还注入了Name的时候

sql是这样的:Preparing: UPDATE user SET name=?, age=? WHERE id=?

由此可见,Mybatis-Plus帮我们封装的动态sql

自动填充

gmt_create (创建时间)gmt_modified(修改时间)这两个属性都需要操作自动化完成,我们并不能手动的去控制。

先在数据库里加上这两个字段

然后更改实体类,在要操作的字段上加@TableField注解,注意这里是时间的类型是LocalDateTime

@TableField(fill = FieldFill.INSERT)
private LocalDateTime gmtCreate;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime gmtModified;

这个注解下有一个FieldFill类下有这么几个常量

DEFAULT,
INSERT,
UPDATE,
INSERT_UPDATE;

然后写一个类实现MetaObjectHandler接口

这个类必须@Component注册为组件

  • public void insertFill(MetaObject metaObject)是执行插入时候执行的方法

  • public void updateFill(MetaObject metaObject)是修改时执行的方法

@Component
public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        this.setFieldValByName("gmtCreate", LocalDateTime.now(), metaObject);
        this.setFieldValByName("gmtModified",LocalDateTime.now(),metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        this.setFieldValByName("gmtModified",LocalDateTime.now(),metaObject);
    }
}

测试即可

乐观锁OptimisticLockerInnerInterceptor

当要更新一条记录的时候,希望这条记录没有被别人更新
乐观锁实现方式:

  • 取出记录时,获取当前version
  • 更新时,带上这个version(作为oldVersion)
  • 执行更新时, set version = newVersion where version = oldVersion
  • 如果version不对,就更新失败

在数据库新增一个version列,默认值为1

在实体类中同样增加version,并且加上@version注解

  • 写一个MP的配置类,再次配置乐观锁的组件
@Configuration
@MapperScan("com.lyk.mapper")
public class MyBatisPlusConfig {
   
    @Bean
    public MybatisPlusInterceptor mybatisPlusIn
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值