以上不再逐一测试 。
更新操作 @Testpublic void testUpdate(){User user = new User();// 通过条件自动拼接动态sqluser.setId(1302223874217295874L);user.setName("kwhua_mybatis-plus_updateTest");user.setAge(20);// 注意:updateById 但是参数是一个对象!int i = userMapper.updateById(user);System.out.println(i);}

文章插图
自动填充创建时间、修改时间!这两个字段操作都是自动化完成的,我们不希望手动更新!
阿里巴巴开发手册:所有的数据库表都要配置上gmt_create、gmt_modified!而且需要自动化!
方式一:数据库级别(工作中一般不用)
1、在表中新增字段 gmt_create, gmt_modified

文章插图
2、把实体类同步
private Date gmtCreate;private Date gmtModified;3、再次查看
文章插图
方式二:代码级别
1、删除数据库的默认值、更新操作!
[图片上传失败...(image-eb7082-1599457281465)]
2、实体类字段属性上需要增加注解
// 字段添加填充内容@TableField(fill = FieldFill.INSERT)private Date gmt_create;@TableField(fill = FieldFill.INSERT_UPDATE)private Date gmt_modified;3、编写处理器来处理这个注解即可!@Slf4j@Component // 一定不要忘记把处理器加到IOC容器中!public class MyMetaObjectHandler implements MetaObjectHandler {// 插入时的填充策略@Overridepublic void insertFill(MetaObject metaObject) {log.info("start insert fill.....");// setFieldValByName(String fieldName, Object fieldVal, MetaObject metaObjectthis.setFieldValByName("gmt_create",new Date(),metaObject);this.setFieldValByName("gmt_modified",new Date(),metaObject);}// 更新时的填充策略@Overridepublic void updateFill(MetaObject metaObject) {log.info("start update fill.....");this.setFieldValByName("gmt_modified",new Date(),metaObject);}}4、测试插入和更新,检查时间变化 。乐观锁乐观锁 : 顾名思义,十分乐观,它总是认为不会出现问题,无论干什么不去上锁!如果出现了问题,
再次更新值测试
悲观锁:顾名思义,十分悲观,它总是认为总是出现问题,无论干什么都会上锁!再去操作!
乐观锁实现方式:
取出记录时,获取当前version
更新时,带上这个version
执行更新时,set version = newVersion where version = oldVersion
如果version不对,就更新失败
乐观锁:1、先查询,获得版本号 version = 1-- Aupdate user set name = "kwhua", version = version + 1where id = 2 and version = 1-- B 线程抢先完成,这个时候 version = 2,会导致 A 修改失败!update user set name = "kwhua", version = version + 1where id = 2 and version = 1乐观锁测试1、给数据库中增加version字段!

文章插图
2、实体类加对应的字段
@Version //乐观锁Version注解private Integer version;3、注册组件// 扫描我们的 mapper 文件夹@MapperScan("com.kwhua.mapper")@EnableTransactionManagement@Configuration // 配置类public class MyBatisPlusConfig {// 注册乐观锁插件@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor() {return new OptimisticLockerInterceptor();}}4、测试// 测试乐观锁成功!@Testpublic void testOptimisticLocker(){// 1、查询用户信息User user = userMapper.selectById(1L);// 2、修改用户信息user.setName("kwhua");user.setEmail("123456@qq.com");// 3、执行更新操作userMapper.updateById(user);}version字段已经由1变成了2// 测试乐观锁失败!多线程下@Testpublic void testOptimisticLocker2(){// 线程 1User user = userMapper.selectById(1L);user.setName("kwhua111");user.setEmail("123456@qq.com");// 模拟另外一个线程执行了插队操作User user2 = userMapper.selectById(1L);user2.setName("kwhua222");user2.setEmail("123456@qq.com");userMapper.updateById(user2);// 自旋锁来多次尝试提交!userMapper.updateById(user); // 如果没有乐观锁就会覆盖插队线程的值!}
文章插图
可以看到线程1执行更新失败
查询操作
// 测试查询@Testpublic void testSelectById(){User user = userMapper.selectById(1L);System.out.println(user);}// 测试批量查询!@Testpublic void testSelectByBatchId(){List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));users.forEach(System.out::println);}// 按条件查询之一使用map操作@Testpublic void testSelectByBatchIds(){HashMap<String, Object> map = new HashMap<>();// 自定义要查询map.put("name","kwhua");map.put("age",15);List<User> users = userMapper.selectByMap(map);users.forEach(System.out::println);}
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Photoshop常用快捷键,photoshop各种快捷键?
- 手机启动wapi什么意思?启动WAPI什么意思?
- win10常用的几款软件
- 红茶滋味常用评语,黑茶的冲泡方式选水及茶水比例
- API的五个常见漏洞
- nginx系列:常用利用shell统计日志
- 全栈开发必备技能:构建RESTful API的13种最佳实践
- 跟常用框架SpringSecurity比 微服务到底胜在哪?
- 使用 HTTPie 进行 API 测试
- Nginx配置跳转的常用方式
