3-MyBatisPlus教程(CRUD-上)
1,增加MP日志配置
1 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 2 spring.datasource.url=jdbc:mysql://localhost:3306/mp-demo?serverTimezone=GMT%2B8 3 spring.datasource.username=root 4 spring.datasource.password=123456 5 6 #mybatis日志 7 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
增加日志后执行HelloWorld,这个时候就会输出SQL日志,帮助我们学习。
2,插入操作(insert)
package com.tongjun.mpdemo; import com.tongjun.mpdemo.entitiy.User; import com.tongjun.mpdemo.mapper.UserMapper; import lombok.extern.slf4j.Slf4j; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; import javax.annotation.Resource; @SpringBootTest @Slf4j public class CRUD_TestCase { @Resource private UserMapper userMapper; /** * 插入操作 */ @Test public void testInsert(){ User user=new User(); user.setName("白子画"); user.setAge(19); user.setEmail("bzh@163.com"); /** * 返回受影响的行数 */ int insert = userMapper.insert(user); log.info("受影响的行数为:{}",insert); } }
思考一下 我们在插入的时候并没有设置id,这个id根据我们配置的日志可以看出来是存在插入的。并且这个id看着像是一个唯一的。
主键策略
1,ID_WORKER
MyBatis-Plus默认的主键策略是:ID_WORKER 全局唯一ID
2,自增策略
要想主键自增需要配置如下主键策略
需要在创建数据表的时候设置主键自增
实体字段中配置 @TableId(type = IdType.AUTO)
package com.tongjun.mpdemo.entitiy; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import lombok.Data; @Data public class User { @TableId(type = IdType.AUTO) private Long id; private String name; private Integer age; private String email; }
3,其他策略
查看源码
public enum IdType { /** * 数据库ID自增 */ AUTO(0), /** * 该类型为未设置主键类型 */ NONE(1), /** * 用户输入ID * 该类型可以通过自己注册自动填充插件进行填充 */ INPUT(2), /* 以下3种类型、只有当插入对象ID 为空,才自动填充。 */ /** * 全局唯一ID (idWorker) */ ID_WORKER(3), /** * 全局唯一ID (UUID) */ UUID(4), /** * 字符串全局唯一ID (idWorker 的字符串表示) */ ID_WORKER_STR(5); private int key; IdType(int key) { this.key = key; }
3,更新操作(update)
/** * 更新操作 */ @Test public void testUpdate(){ User user=new User(); user.setId(1L); user.setName("花千骨"); int count = userMapper.updateById(user); log.info("受影响的行数为:{}",count); }
这个时候如果经常做项目的同学会发现一个特别常见的需求,根据阿里巴巴开发手册上也说过,一个表里必须有记录的创建时间和修改时间。这个时候我们可以使用MyBatisPlus(该文后面使用MP代替)的自动填充功能来简化我们代码的开发。
4,自动填充功能
首先将我们的user表增加2个字段 create_time update_time ,添加完成后 效果如下。
然后在我们的实体类中添加MP提供的注解
1 package com.tongjun.mpdemo.entitiy; 2 3 import com.baomidou.mybatisplus.annotation.FieldFill; 4 import com.baomidou.mybatisplus.annotation.IdType; 5 import com.baomidou.mybatisplus.annotation.TableField; 6 import com.baomidou.mybatisplus.annotation.TableId; 7 import lombok.Data; 8 9 import java.util.Date; 10 11 @Data 12 public class User { 13 @TableId(type = IdType.AUTO) 14 private Long id; 15 private String name; 16 private Integer age; 17 private String email; 18 19 /** 20 * 在新增记录时候自动填充 21 */ 22 @TableField(fill = FieldFill.INSERT) 23 private Date createTime; 24 25 /** 26 * 更新时间,在新增的时候也要填充,其次是更新的时候每次填充 27 * */ 28 @TableField(fill = FieldFill.INSERT_UPDATE) 29 private Date updateTime; 30 }
接下来编写处理器,实现MP提供的接口,在方法里面完成填充
package com.tongjun.mpdemo.handler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.util.Date; @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName("createTime",new Date(),metaObject); this.setFieldValByName("updateTime",new Date(),metaObject); } @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName("updateTime",new Date(),metaObject); } }
测试新增
/** * 插入操作 */ @Test public void testInsert(){ User user=new User(); user.setName("杀阡陌"); user.setAge(12); user.setEmail("sqm@163.com"); /** * 返回受影响的行数 */ int insert = userMapper.insert(user); log.info("受影响的行数为:{}",insert); }
测试修改
/** * 更新操作 */ @Test public void testUpdate(){ User user=new User(); user.setId(1257939437792489474L); user.setName("杀阡陌666"); int count = userMapper.updateById(user); log.info("受影响的行数为:{}",count); }
5,MP乐观锁插件使用
主要适用场景:当要更新一条记录的时候,希望这条记录没有被别人更新,也就是说实现线程安全的数据更新
乐观锁实现方式:
- 取出记录时,获取当前version
- 更新时,带上这个version
- 执行更新时, set version = newVersion where version = oldVersion
- 如果version不对,就更新失败
首先在表中增加version字段
然后在实体类中增加version注解
package com.tongjun.mpdemo.entitiy; import com.baomidou.mybatisplus.annotation.FieldFill; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.Version; import lombok.Data; import java.util.Date; @Data public class User { private Long id; private String name; private Integer age; private String email; /** * 在新增记录时候自动填充 */ @TableField(fill = FieldFill.INSERT) private Date createTime; /** * 更新时间,在新增的时候也要填充,其次是更新的时候每次填充 * */ @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; /** * 使用自动填充功能,在新增的时候 给version 自动填充 1 */ @TableField(fill = FieldFill.INSERT) @Version private Integer version; }
package com.tongjun.mpdemo.handler; import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import org.apache.ibatis.reflection.MetaObject; import org.springframework.stereotype.Component; import java.util.Date; @Component public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName("createTime",new Date(),metaObject); this.setFieldValByName("updateTime",new Date(),metaObject); this.setFieldValByName("version",1,metaObject); } @Override public void updateFill(MetaObject metaObject) { this.setFieldValByName("updateTime",new Date(),metaObject); } }
接着将乐观锁插件注入到spring容器中,在SpringBoot中推荐使用java代码进行配置
package com.tongjun.mpdemo.config; import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor; import org.mybatis.spring.annotation.MapperScan; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.annotation.EnableTransactionManagement; @EnableTransactionManagement @Configuration @MapperScan("com.tongjun.mpdemo.mapper") public class MyBatisPlusConfig { /** * 乐观锁插件 */ @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { return new OptimisticLockerInterceptor(); } }
这里面顺便将mapper 扫描也移到这里来了。接下来就是测试。
先插入一条记录
/** * 插入操作 */ @Test public void testInsert(){ User user=new User(); user.setName("巫妖王"); user.setAge(36); user.setEmail("wyw@163.com"); /** * 返回受影响的行数 */ int insert = userMapper.insert(user); log.info("受影响的行数为:{}",insert); }
观看日志
查看我们刚插入的数据,看看version字段有没有自动填充过来。
接着我们进行修改操作,我们先查询再修改
/** * 测试乐观锁插件 */ @Test public void testOptimisticLocker(){ //查询 这个id 是 原先 巫妖王的 id 该方法是根据id 查询 应该比较简单 先使用 User user = userMapper.selectById(1257943192512483330L); //修改数据 user.setName("希尔瓦娜斯"); user.setEmail("xnw@163.com"); //执行更新 userMapper.updateById(user); }
修改过来 版本自动+1。