不多bibi,直接建表

DROP TABLE IF EXISTS `user`;

CREATE TABLE `user` (

`id` bigint(20) NULL DEFAULT NULL COMMENT '主键',

`name` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',

`age` int(11) NULL DEFAULT NULL COMMENT '年龄',

`email` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '邮箱',

`manager_id` bigint(20) NULL DEFAULT NULL COMMENT '直属上级id',

`create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间',

`update_time` datetime(0) NULL DEFAULT NULL COMMENT '修改时间',

`version` int(11) NULL DEFAULT 1 COMMENT '版本',

`deleted` int(1) NULL DEFAULT 0 COMMENT '逻辑删除标识(0,未删除;1,已删除)'

) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `user` VALUES (1234, '大boss', 40, 'boss@163.com', NULL, '2019-10-02 10:08:02', '2019-10-02 10:08:05', 1, 0);

INSERT INTO `user` VALUES (2345, '王天风', 25, 'wtf@163.com', 1234, '2019-10-02 10:09:07', '2019-10-02 10:09:10', 1, 0);

INSERT INTO `user` VALUES (2346, '李艺伟', 28, 'lyw@163.com', 2345, '2019-10-02 10:10:09', '2019-10-02 10:10:12', 1, 0);

INSERT INTO `user` VALUES (3456, '张雨绮', 31, 'zyq@163.com', 2345, '2019-10-02 10:10:54', '2019-10-02 10:10:58', 1, 0);

INSERT INTO `user` VALUES (4566, '刘雨红', 32, 'lyh@163.com', 2345, '2019-10-02 10:11:51', '2019-10-02 10:11:55', 1, 0);

SET FOREIGN_KEY_CHECKS = 1;

逻辑删除

设定逻辑删除规则

在配置文件中配置逻辑删除和逻辑未删除的值

mybatis-plus:

global-config:

logic-not-delete-value: 0

logic-delete-value: 1

在pojo类中在逻辑删除的字段加注解@TableLogic

@Data

@EqualsAndHashCode(callSuper = false)

public class User extends Model {

@TableId(type = IdType.AUTO)

private Long id;

@TableField(condition = SqlCondition.LIKE)

private String name;

private Integer age;

private String email;

private Long managerId;

private LocalDateTime createTime;

private LocalDateTime updateTime;

private Integer version;

@TableLogic

private Integer deleted;

}

通过id逻辑删除

@Test

public void deleteById(){

userMapper.deleteById(4566L);

}

查询中排除删除标识字段及注意事项

逻辑删除字段只是为了标识数据是否被逻辑删除,在查询的时候,并不想也将该字段查询出来。

我们只需要在delete字段上增加@TableField(select = false)mybatisplus在查询的时候就会自动忽略该字段。

@Test

public void selectIgnoreDeleteTest(){

userMapper.selectById(3456L);

}

自定义sql,MybatisPlus不会忽略deleted属性,需要我们手动忽略

自动填充

MybaitsPlus在我们插入数据或者更新数据的时候,为我们提供了自动填充功能。类似MySQL提供的默认值一样。

如果我们需要使用自动填充功能,我们需要在实体类的相应属性上加@TableField注解,并指定什么时候进行自动填充。mybatisPlus为我们提供了三种填充时机,在FieldFill枚举中

public enum FieldFill {

/**

* 默认不处理

*/

DEFAULT,

/**

* 插入时填充字段

*/

INSERT,

/**

* 更新时填充字段

*/

UPDATE,

/**

* 插入和更新时填充字段

*/

INSERT_UPDATE

}

设置好之后,我们还需要编写具体的填充规则,具体是编写一个填充类并交给Spring管理,然后实现MetaObjectHandler接口中的insertFill和updateFill方法。

eg:

插入User对象的时候自动填充插入时间,更新User对象的时候自动填充更新时间。

指定实体类中需要自动填充的字段,并设置填充时机

@Data

@EqualsAndHashCode(callSuper = false)

public class User extends Model {

...

@TableField(fill = INSERT)

private LocalDateTime createTime;

@TableField(fill = UPDATE)

private LocalDateTime updateTime;

...

}

编写填充规则

@Component

public class MyMetaObjHandler implements MetaObjectHandler {

@Override

public void insertFill(MetaObject metaObject) {

if(metaObject.hasSetter("createTime")){

setInsertFieldValByName("createTime", LocalDateTime.now(),metaObject);

}

}

@Override

public void updateFill(MetaObject metaObject) {

if(metaObject.hasSetter("updateTime")){

setUpdateFieldValByName("updateTime",LocalDateTime.now(),metaObject);

}

}

}

解释一下为什么要用if判断是否有对应的属性

mybatisPlus在执行插入或者更新操作的时候,每次都会执行该方法,有些表中是没有设置自动填充字段的,而且有些自动填充字段的值的获取比较消耗系统性能,所以为了不必要的消耗,进行if判断,决定是否需要填充。

有些时候我们已经设置了属性的值。不想让mybatisPlus再自动填充,也就是说我们没有设置属性的值,mybatisPlus进行填充,如果设置了那么就用我们设置的值。这种情况我们只需要在填充类中提前获取默认值,然后使用该默认值就可以了。

@Override

public void updateFill(MetaObject metaObject) {

if(metaObject.hasSetter("updateTime")){

Object updateTime = getFieldValByName("updateTime", metaObject);

if(Objects.nonNull(updateTime)){

setUpdateFieldValByName("updateTime",updateTime,metaObject);

}else{

setUpdateFieldValByName("updateTime",LocalDateTime.now(),metaObject);

}

}

}

乐观锁

乐观锁适用于读多写少的情况,更新数据的时候不使用“锁“而是使用版本号来判断是否可以更新数据。通过不加锁来减小数据更新时间和系统的性能消耗,进而提高数据库的吞吐量。CAS机制就是一种典型的乐观锁的形式。

乐观锁是逻辑存在的一种概念,我们如果使用乐观锁需要手动在表的加上version字段。

mysql使用乐观锁伪代码示例:

update user

set balabala....

where balabala... and version = xxx

乐观锁

1.配置类中注入乐观锁插件

@Bean

public OptimisticLockerInterceptor optimisticLockerInterceptor(){

return new OptimisticLockerInterceptor();

}

实体类中的版本字段增加@version注解

@Data

@EqualsAndHashCode(callSuper = false)

public class User extends Model {

...

@Version

private Integer version;

...

}

test

更新王天风的年龄

@Test

public void testLock(){

int version = 1;

User user = new User();

user.setEmail("wtf@163.com");

user.setAge(34);

user.setId(2345L);

user.setManagerId(1234L);

user.setVersion(1);

userMapper.updateById(user);

}

image.png

数据库中的version已经变成2

image.png

注意事项:

支持的类型只有:int,Integer,long,Long,Date,Timestamp,LocalDateTime

整数类型下newVerison = oldVersion+1

newVersion会写到entity中

仅支持updateById(id)与update(entity,wrapper)方法

在update(entiry,wrapper)方法下,wrapper不能复用

性能分析

配置类中注入性能分析插件

@Bean

// @Profile({"dev,test"})

public PerformanceInterceptor performanceInterceptor() {

PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();

// 格式化sql输出

performanceInterceptor.setFormat(true);

// 设置sql执行最大时间,单位(ms)

performanceInterceptor.setMaxTime(5L);

return performanceInterceptor;

}

执行sql就可以打印sql执行的信息了

image.png

依靠第三方插件美化sql输出

第三方依赖

p6spy

p6spy

3.8.5

更改配置文件中的dirver和url

spring:

datasource:

# driver-class-name: com.mysql.cj.jdbc.Driver

username: root

password: root

# url: jdbc:mysql://localhost:3306/test?serverTimezone=CTT&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true

driver-class-name: com.p6spy.engine.spy.P6SpyDriver

url: jdbc:p6spy:mysql://localhost:3306/test?serverTimezone=CTT&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true

增加spy.properties配置文件

module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory

# 自定义日志打印

logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger

#日志输出到控制台

appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger

# 使用日志系统记录 sql

#appender=com.p6spy.engine.spy.appender.Slf4JLogger

# 设置 p6spy driver 代理

deregisterdrivers=true

# 取消JDBC URL前缀

useprefix=true

# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.

excludecategories=info,debug,result,batch,resultset

# 日期格式

dateformat=yyyy-MM-dd HH:mm:ss

# 实际驱动可多个

#driverlist=org.h2.Driver

# 是否开启慢SQL记录

outagedetection=true

# 慢SQL记录标准 2 秒

outagedetectioninterval=2

test

注意

开启性能分析会消耗系统的性能,所以性能分析插件要配合@Profile注解执行使用的环境。

SQL注入器 ->_-> 封装自定义通用SQL

实现步骤:

创建定义方法的类

创建注入器

在mapper中加入自定义方法

eg: 编写一个删除表所有数据的方法

创建定义方法的类

public class DeleteAllMethod extends AbstractMethod {

@Override

public MappedStatement injectMappedStatement(Class> mapperClass, Class> modelClass, TableInfo tableInfo) {

// 执行的sql

String sql = "delete from " + tableInfo.getTableName();

// mapper接口方法名

String method = "deleteAll";

SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, mapperClass);

return addDeleteMappedStatement(mapperClass, method, sqlSource);

}

}

创建注入器。添加自己的方法

@Component

public class MySqlInject extends DefaultSqlInjector {

@Override

public List getMethodList(Class> mapperClass) {

List methodList = super.getMethodList(mapperClass);

methodList.add(new DeleteAllMethod());

return methodList;

}

}

在mapper中加入自定义方法

public interface UserMapper extends BaseMapper {

/**

* 删除所有表数据

*

* @return 影响行数

*/

int deleteAll();

}

test

@Test

public void deleteAll(){

userMapper.deleteAll();

}

image.png

附录

mybatis plus 格式话_MyBatisPlus学习整理(二)相关推荐

  1. mybatis plus 格式话_作为阿里的面试官,我有话想说

    面试,面试官比候选人还难 勇于面试,你就是成功了一半 简历能不能好好写 话,真的要好好说 有不会的,很正常 T型人才,是标准 要成长,不要局限于公司的工作 说了这么多,你还想来阿里吗? <Jav ...

  2. mybitsplus的idworker应java什么类型_MyBatisPlus学习整理(一)

    本文是通过慕课网相关课程学习MyBatisPlus整理的笔记. MyBatisPlus入门 : - ) 老师讲的挺好的,还不会MyBatisPlus的小伙伴门可以听一下. MyBatisPlus官网 ...

  3. mybatis plus 格式话_(转)mybatis-plus的使用 ------ 进阶

    关于mybatis-plus的简介以及基本使用,我在<mybatis-plus的使用 ------ 入门>一文中已做介绍,此处不再赘述.本文主要对mybatis-plus的AR模式.插件. ...

  4. java8学习整理二

    java8不但可以提高代码的运行的性能,而且实现起来很优雅,因此学习它是不错的选择. 今天写这篇文章,是因为看到我们部门大佬写的代码,因此将其还原成匿名内部类的时候发现这个retrun是不能省掉的,省 ...

  5. mybatis plus 格式话_mybatis plus3.3.2配置打印sql

    如何配置mybatis plus配置打印sql,控制台输出配置显示sql语句进行调试程序如何配置,如何配置mybatis,实测使用mybatis-plus-boot-starter3.3.2成功打印. ...

  6. Mybatis底层原理学习(二):从源码角度分析一次查询操作过程

    在阅读这篇文章之前,建议先阅读一下我之前写的两篇文章,对理解这篇文章很有帮助,特别是Mybatis新手: 写给mybatis小白的入门指南 mybatis底层原理学习(一):SqlSessionFac ...

  7. Mybatis学习总结二

    Mybatis学习总结二 0.不需要修改的文件(在src下面) jdbc.properties文件 log4j.properties文件 SqlMapConfig.xml文件 1.高级结果映射 1.1 ...

  8. Deep Learning(深度学习)学习笔记整理(二)

    本文整理了网上几位大牛的博客,详细地讲解了CNN的基础结构与核心思想,欢迎交流 [1]Deep learning简介 [2]Deep Learning训练过程 [3]Deep Learning模型之: ...

  9. [MyBatis学习笔记] 二、Mybatis基本操作及相关标签介绍

    [MyBatis学习笔记] 二.Mybatis基本操作及相关标签介绍 一.Mybatis简介 二.简单的CRUD操作 1.构建SqlSessionFactory (1)编辑mybatis-config ...

最新文章

  1. 视觉SLAM如何基于深度学习闭环检测?
  2. jradiobutton设置默认选项_JRadioButton(单选按钮)添加事件监听
  3. [浅谈 演示] 你所不知道的HTML - 从 XHTML2 到 HTML5 (1)
  4. mysql显示bmp图片_BMP格式图像的显示
  5. js实现椭圆轨迹_Canvas实现直线与圆形的物理运动效果
  6. kibana操作elasticsearch:修改数据
  7. linux 设备节点 驱动,【Linux驱动】自动创建设备节点
  8. python3性能还低吗_Python3 vs. Python2 大作战,谁将是性能之王?
  9. JEECG再创新举,开辟支付宝服务窗开发新时代,业内独家培训 《支付宝服务窗实战培训》
  10. jdbc oracle 删除数据库连接,如何使用JDBC API从Oracle数据库中删除表?
  11. 如何修改Windows 7登录界面默认输入法?
  12. FoneDog Toolkit for Android如何从Android恢复丢失的文件
  13. 拍拍贷2019Q1财报:核心用户转化率上升 迎战资本竞争力略显不足
  14. 标准误和标准差及CV值
  15. vnc repeater linux,远程桌面中转,基于 UltraVNC Repeater(中继器)的远程桌面服务搭建,用于复杂网络环境...
  16. 如何删除word中页眉的横线
  17. 新款 MacBook Pro 评测:更好的性能、免费的刘海和更好的显示器
  18. 使用面膜过敏现象原因
  19. 码云,git使用 教程
  20. oracle 用户下建表进行加密(redact)实验

热门文章

  1. 【网络爬虫】初探网络爬虫
  2. 〖ChatGPT实践指南 - 零基础扫盲篇⑤〗- OpenAI API 演示 Demo 之宠物名字生成器
  3. 如何用python可视化疫情风险区?地图标记位置信息:数据爬取+地址解析+可视化
  4. 山东省中小企业数字化转型论坛成功举办,九州云赋能中小企业数智升级
  5. 收集整理网络协议类型
  6. 这30个高质量的数据集网站,你必须要试试!
  7. Aftereffect中英文切换技巧
  8. 冈萨雷斯《数字图像处理》学习笔记(七)小波变换和多分辨率处理
  9. 使用pngquant压缩png图片
  10. 【数据结构期末例题】