MybatisPlus--CRUD接⼝及主键增长策略、⾃动填充、乐观锁
更新数据
⽬录
⼀、insert
1、插⼊操作
@RunWith(SpringRunner.class)
@SpringBootTest
public class CRUDTests {
@Autowired
private UserMapper userMapper;
@Test
public void testInsert(){
User user = new User();
user.setName("Helen");
user.setAge(18);
user.setEmail("55317332@qq");
int result = userMapper.insert(user);
System.out.println(result); //影响的⾏数
System.out.println(user); //id⾃动回填
}
}
注意:数据库插⼊id值默认为:全局唯⼀id
2、主键策略
(1)ID_WORKER
MyBatis-Plus默认的主键策略是:ID_WORKER 全局唯⼀ID
(2)⾃增策略
要想主键⾃增需要配置如下主键策略
需要在创建数据表的时候设置主键⾃增
实体字段中配置 @TableId(type = IdType.AUTO)
@TableId(type = IdType.AUTO)
private Long id;
要想影响所有实体的配置,可以设置全局主键配置
#全局设置主键⽣成策略
mybatis-plus.global-config.db-config.id-type=auto
其它主键策略:分析 IdType 源码可知
@Getter
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;
}
}
⼆、update
1、根据Id更新操作
注意:update时⽣成的sql⾃动是动态sql:UPDATE user SET age=? WHERE id=?
@Test
public void testUpdateById(){
User user = new User();
user.setId(1L);
user.setAge(28);
int result = userMapper.updateById(user);
System.out.println(result);
}
2、⾃动填充
项⽬中经常会遇到⼀些数据,每次都使⽤相同的⽅式填充,例如记录的创建时间,更新时间等。
我们可以使⽤MyBatis Plus的⾃动填充功能,完成这些字段的赋值⼯作:
(1)数据库表中添加⾃动填充字段
在User表中添加datetime类型的新的字段 create_time、update_time
(2)实体上添加注解
@Data
public class User {
......
@TableField(fill = FieldFill.INSERT)
private Date createTime;
//@TableField(fill = FieldFill.UPDATE)
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
(3)实现元对象处理器接⼝
注意:不要忘记添加 @Component 注解
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
private static final Logger LOGGER = Logger(MyMetaObjectHandler.class);
@Override
批量更新sql语句public void insertFill(MetaObject metaObject) {
LOGGER.info("start insert fill ....");
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
@Override
public void updateFill(MetaObject metaObject) {
LOGGER.info("start update fill ....");
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
3、乐观锁
主要适⽤场景:当要更新⼀条记录的时候,希望这条记录没有被别⼈更新,也就是说实现线程安全的数据更新乐观锁实现⽅式:
取出记录时,获取当前version
更新时,带上这个version
执⾏更新时, set version = newVersion where version = oldVersion
如果version不对,就更新失败
(1)数据库中添加version字段
ALTER TABLE `user` ADD COLUMN `version` INT
(2)实体类添加version字段
并添加 @Version 注解
@Version
@TableField(fill = FieldFill.INSERT)
private Integer version;
(3)元对象处理器接⼝添加version的insert默认值
@Override
public void insertFill(MetaObject metaObject) {
......
this.setFieldValByName("version", 1, metaObject);
}
特别说明:
⽀持的数据类型只有 int,Integer,long,Long,Date,Timestamp,LocalDateTime 整数类型下 newVersion = oldVersion + 1
newVersion 会回写到 entity 中
仅⽀持 updateById(id) 与 update(entity, wrapper) ⽅法
在 update(entity, wrapper) ⽅法下, wrapper 不能复⽤
(4)在 MybatisPlusConfig 中注册 Bean
创建配置类
@EnableTransactionManagement
@Configuration
@MapperScan("batis_plus.mapper")
public class MybatisPlusConfig {
/**
* 乐观锁插件
*/
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
(5)测试乐观锁可以修改成功
测试后分析打印的sql语句,将version的数值进⾏了加1操作
/**
* 测试乐观锁插件
*/
@Test
public void testOptimisticLocker() {
//查询
User user = userMapper.selectById(1L);
//修改数据
user.setName("Helen Yao");
user.setEmail("helen@qq");
//执⾏更新
userMapper.updateById(user);
}
此时数据库中的version版本也变为了2
三、select
1、根据id查询记录
@Test
public void testSelectById(){
User user = userMapper.selectById(1L);
System.out.println(user);
}
2、通过多个id批量查询
完成了动态sql的foreach的功能
@Test
public void testSelectBatchIds(){
List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3)); users.forEach(System.out::println);
}
3、简单的条件查询
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论