1,增加MP日志配置

 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mp-demo?serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456 #mybatis日志
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提供的注解

 package com.tongjun.mpdemo.entitiy;

 import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data; import java.util.Date; @Data
public class User {
@TableId(type = IdType.AUTO)
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;
}

接下来编写处理器,实现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。

3-MyBatisPlus教程(CRUD-上)的更多相关文章

  1. MybatisPlus的CRUD及拓展

    创建一个简单的MybatisPlus项目在上一篇博客:MybatisPlus入门程序 一.CRUD 1. select 1.1 查找全部用户 //查 @Test public void select( ...

  2. 设计师和开发人员更快完成工作需求的20个惊人的jqury插件教程(上)

    [转] 设计师和开发人员更快完成工作需求的20个惊人的jqury插件教程(上) jquery的功能总是那么的强大,用他可以开发任何web和移动框架,在浏览器市场,他一直是占有重要的份额,今天,就给大家 ...

  3. 一篇文章了解Github和Git教程-AndroidStudio上传Github教程

    前言 为了方便保存自己的代码,下班后可以回家继续进行,自己的码农工作,介绍一下Github. 什么是Github呢? 作为一个编程人员,我觉得得了解一下Github吧! 当然,如果你放弃了码农或者技术 ...

  4. python读书笔记-《简明python教程》上

    1月15日 <简明python教程>上 基本结构: 基础概念+控制流+函数+模块+数据结构+面向对象+I/O+异常+标准库+其他   1.概念 1-0    退出python linux: ...

  5. React-Router 中文简明教程(上)

    概述 说起 前端路由,如果你用过前端 MV* 框架构建 SPA 应用(单页面应用),对此一定不陌生. 传统开发中的 路由,是由服务端根据不同的用户请求地址 URL,返回不同内容的页面,而前端路由则将这 ...

  6. 使用Keil语言的嵌入式C编程教程(上)

    使用Keil语言的嵌入式C编程教程(上) Embedded C Programming Tutorial with Keil Language Embedded System 嵌入式系统是指以单片机为 ...

  7. Mybatis插件之Mybatis-Plus的CRUD方法

    使用Mybatis-plus进行基本的CRUD(增查改删)操作. 实体类(User)代码: import com.baomidou.mybatisplus.annotation.IdType; imp ...

  8. 使用 Mybatis-plus 进行 crud 操作

    1 Mybatis-Plus简介 1.1 什么是Mybatis-Plus MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化 ...

  9. 【mybatis-plus】CRUD必备良药,mybatis的好搭档

    做开发,免不了对数据进行增删改查,那么mybatis-plus我觉得很适合我这个java新手,简单好用. 官网在这 一.什么是mybatis-plus MyBatis-Plus(简称 MP),是一个M ...

  10. [个人翻译]Redis 集群教程(上)

    官方原文地址:https://redis.io/topics/cluster-tutorial  水平有限,如果您在阅读过程中发现有翻译的不合理的地方,请留言,我会尽快修改,谢谢.        这是 ...

随机推荐

  1. k8s Service学习

    service的概念 kubernetes service定义了一个抽象概念,一个pod的逻辑分组,一种可以访问的策略---通常称为服务.这组pod能够被service访问到,通常通过label se ...

  2. Git应用详解第七讲:Git refspec与远程分支的重要操作

    前言 前情提要:Git应用详解第六讲:Git协作与Git pull常见问题 这一节来介绍本地仓库与远程仓库的分支映射关系:git refspec.彻底弄清楚本地仓库到底是如何与远程仓库进行联系的. 一 ...

  3. break与continue对比

    - break 用来终止循环 - continue 用来跳出当前循环,继续下次循环 // 求1到100之间所有不能被3整除的整数的第一个大于2000的和 var sum = 0; for(var i= ...

  4. Pytest系列(21)- allure的特性,@allure.description()、@allure.title()的详细使用

    如果你还想从头学起Pytest,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1690628.html 前言 前面介绍了两种allure的 ...

  5. Redis学习二:Redis高并发之主从模式

    申明 本文章首发自本人公众号:壹枝花算不算浪漫,如若转载请标明来源! 感兴趣的小伙伴可关注个人公众号:壹枝花算不算浪漫 22.jpg 前言 前面已经学习了Redis的持久化方式,接下来开始学习Redi ...

  6. 不使用 if-elif 语句,如何优雅地判断某个数字所属的等级?

    偶然看到了 stackoverflow 上的一个问题,还挺有启发,故分享一下. 题目大意是:有从 A 到 F 的 5 个等级,现要判断某个数值(从 0 到 1 之间)所属的等级.举例,如数值 > ...

  7. I - Fill The Bag codeforces 1303D

    题解:注意这里的数组a中的元素,全部都是2的整数幂.然后有二进制可以拼成任意数.只要一堆2的整数幂的和大于x,x也是2的整数幂,那么那一堆2的整数幂一定可以组成x. 思路:位运算,对每一位,如果该位置 ...

  8. reactnavigation 5.x简单例子

    随着RN和reactnavigation的版本更新,网上很多老版的例子都不能用了. 自己摸索着跑通了一些简单的功能. 使用的是最新的    "react-native": &quo ...

  9. Des对称可逆加密

    /// <summary> /// DES AES Blowfish ///  对称加密算法的优点是速度快, ///  缺点是密钥管理不方便,要求共享密钥. /// 可逆对称加密  密钥长 ...

  10. 巧用Grafana和Arthas自动抓取K8S中异常Java进程的线程堆栈

    前言 近期发现业务高峰期时刻会出现CPU繁忙导致的timeout异常,通过监控来看是因为Node上面的一些Pod突发抢占了大量CPU导致的. 问: 没有限制CPU吗?是不是限制的CPU使用值就可以解决 ...