springboot之mybaitsPlus

mybaitsPlus是国内开发的,并不是springboot的项目,只是学习的时候直接就是适配的springboot。

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

快速开始

DROP TABLE IF EXISTS `user`;CREATE TABLE `user`
(id BIGINT NOT NULL COMMENT '主键ID',name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',age INT NULL DEFAULT NULL COMMENT '年龄',email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',PRIMARY KEY (id)
);DELETE FROM `user`;INSERT INTO `user` (id, name, age, email) VALUES
(1, 'Jone', 18, 'test1@baomidou.com'),
(2, 'Jack', 20, 'test2@baomidou.com'),
(3, 'Tom', 28, 'test3@baomidou.com'),
(4, 'Sandy', 21, 'test4@baomidou.com'),
(5, 'Billie', 24, 'test5@baomidou.com');
spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.52.3:3306/mybatisplus?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC#    url: jdbc:mysql://192.168.66.3:3306/mybatis?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTCusername: rootpassword: rootmybatis-plus:configuration:
#    配置日志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
package com.example.mybatisplus;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@MapperScan("com.example.mybatisplus.dao")
@SpringBootApplication
public class SpringbootMybatisplusApplication {public static void main(String[] args) {SpringApplication.run(SpringbootMybatisplusApplication.class, args);}}
package com.example.mybatisplus.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mybatisplus.pojo.User;
import org.springframework.stereotype.Repository;// 继承基本的类 BaseMapper
// 所有的crud操作都已经编写完成了,不需要再写方法和xml了
// 如果需要复杂的查询,BaseMapper没有提供,编写的方式就和mybatis一样了
@Repository
public interface UserMapper extends BaseMapper<User> {}
package com.example.mybatisplus;import com.example.mybatisplus.dao.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import java.util.List;@SpringBootTest
class SpringbootMybatisplusApplicationTests {@AutowiredUserMapper userMapper;@Testvoid contextLoads() {List list = userMapper.selectList(null);System.out.println(list);}// 更新@Testpublic void testUpdate(){User user = new User(4L, "sundy", 19, "test19@163.com");userMapper.updateById(user);}}

主键策略

在这里插入图片描述

public class User {/*** public enum IdType {*     AUTO(0), 自增,数据库id也必须是自增*     NONE(1), 未设置主键*     INPUT(2), 手动输入*     ID_WORKER(3), 默认,全局唯一id*     UUID(4), uuid*     ID_WORKER_STR(5); // ID_WORKER 的string形式*/@TableIdprivate Long id;@Testpublic void testInsert(){User user = new User();user.setName("ks");user.setAge(12);user.setEmail("139@qq.com");userMapper.insert(user);System.out.println(user);// ==>  Preparing: INSERT INTO user ( id, name, age, email ) VALUES ( ?, ?, ?, ? )// ==> Parameters: 1765291692593553409(Long), ks(String), 12(Integer), 139@qq.com(String)// 在这儿我们并没有指定id,是mybatisplus帮我们生成的id// 主键的生成方式有 uuid 自增id 雪花算法 redis zookeeper}

自动填充

public class User {// 标记需要填充内容的字段@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)private LocalDateTime updateTime;package com.example.mybatisplus.handler;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;import java.time.LocalDateTime;@Slf4j
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {// 插入时的填充策略@Overridepublic void insertFill(MetaObject metaObject) {log.info("start insert fill...");this.setFieldValByName("createTime", LocalDateTime.now(),metaObject);this.setFieldValByName("updateTime", LocalDateTime.now(),metaObject);}// 更新时的填充策略@Overridepublic void updateFill(MetaObject metaObject) {log.info("start update fill...");this.setFieldValByName("updateTime", LocalDateTime.now(),metaObject);}
}

乐观锁

在这里插入图片描述

public class User {@Version // 乐观锁version注解,同时给数据库添加version字段private Integer version;// 注册组件
package com.example.mybatisplus.config;import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;@EnableTransactionManagement
@Configuration
public class MybatisPlusConfig {// 注册乐观锁插件@Beanpublic OptimisticLockerInterceptor optimisticLockerInterceptor(){return new OptimisticLockerInterceptor();}}
// 测试乐观锁成功@Testpublic void testOptimisticLockerSuccess(){User user = userMapper.selectById(1L);user.setAge(7);
//      ==>  Preparing: UPDATE user SET name=?, age=?, email=?, version=?, update_time=? WHERE id=? AND version=?
//      更新的时候会自动把version条件带上userMapper.updateById(user);}// 测试乐观锁失败!多线程下@Testpublic void testOptimisticLockerLose(){// 模拟线程1User user = userMapper.selectById(1L);user.setAge(1);
//      ==>  Preparing: UPDATE user SET name=?, age=?, email=?, version=?, update_time=? WHERE id=? AND version=?
//      更新的时候会自动把version条件带上User user2 = userMapper.selectById(1L);user2.setAge(2);// 模拟线程2 执行了插队操作// 执行更新操作的时候 线程1被线程2插队了userMapper.updateById(user2);userMapper.updateById(user); // 如果没有乐观锁就会覆盖插队线程的值// 如果非要更新成功,可以使用自旋锁来多次尝试提交!/*****Creating a new SqlSessionSqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6413d7e7] was not registered for synchronization because synchronization is not active2024-03-07 10:46:44.052  INFO 18316 --- [           main] c.e.m.handler.MyMetaObjectHandler        : start update fill...JDBC Connection [HikariProxyConnection@1759328722 wrapping com.mysql.jdbc.JDBC4Connection@67022ea] will not be managed by Spring
==>  Preparing: UPDATE user SET name=?, age=?, email=?, version=?, update_time=? WHERE id=? AND version=?
==> Parameters: sundy(String), 2(Integer), test163@163.com(String), 2(Integer), 2024-03-07 10:46:44.058(Timestamp), 1(Long), 1(Integer)<==    Updates: 1Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6413d7e7]Creating a new SqlSessionSqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@999b951] was not registered for synchronization because synchronization is not active2024-03-07 10:46:44.070  INFO 18316 --- [           main] c.e.m.handler.MyMetaObjectHandler        : start update fill...JDBC Connection [HikariProxyConnection@1708084589 wrapping com.mysql.jdbc.JDBC4Connection@67022ea] will not be managed by Spring
==>  Preparing: UPDATE user SET name=?, age=?, email=?, version=?, update_time=? WHERE id=? AND version=?
==> Parameters: sundy(String), 1(Integer), test163@163.com(String), 2(Integer), 2024-03-07 10:46:44.07(Timestamp), 1(Long), 1(Integer)<==    Updates: 0Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@999b951]*/}

我一向讨厌睡眠的必要性,它跟死亡一样,能让最强大的人倒下。
纸牌屋

部分内容转载自:
https://www.bilibili.com/video/BV17E411N7KN/?p=5&spm_id_from=pageDriver&vd_source=64c73c596c59837e620fed47fa27ada7

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/726214.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[ubuntu]ubuntu终端代理和清除终端代理命令

ubuntu设置终端代理和清除代理命令 1、添加代理 export http_proxyhttp://proxyAddress:port export https_proxyhttp://proxyAddress:port 2、查看代理 env |grep -i proxy 3、清除代理 unset http_proxy unset https_proxy 4、通过图形界面设置的代理清除 改3个文件 sudo…

linuxOPS基础_操作系统概述

计算机发展史 第一台计算机是1946 年2 月14 日诞生日&#xff0c;第一台名称ENIAC。体积一间屋子的大小&#xff0c;重量高达28t。 第一代&#xff1a;1946 – 1958 > 12 年 &#xff08;电子管&#xff09; 第二代&#xff1a;1958 – 1964 > 6 年 &#xff08;晶体管…

vue实现虚拟键盘

本文介绍一体机常用的虚拟键盘实现&#xff0c;主打一个免费文章。喜欢就点个赞支持一下吧 simple-keyboard官网&#xff1a;simple-keyboard - simple-keyboard - Francisco HodgeSimple-keyboard is a virtual keyboard for Javascript. You can use it as an input for dev…

请你简单说一下 Mysql 的事务隔离级别

什么情况&#xff0c;写了 5 年的 CRUD&#xff0c;还搞不清楚 Mysql 的事务隔离级别&#xff0c;难怪第一面就被刷下来。 一个 5 年经验的粉丝&#xff0c;在一个公司干了 5 年&#xff0c;觉得自己特厉害&#xff0c;什么都能搞定&#xff0c;结果每次一到技术面就被刷。问我…

算法训练营day42(补),动态规划10

func max(a, b int) int { if a > b { return a } return b } //121. 买卖股票的最佳时机 func maxProfit1(prices []int) int { n : len(prices) dp : make([][]int, n) for i : 0; i < n; i { dp[i] make([]int, 2) } dp[0][0] -prices[0] dp[0][1] 0 for i : 1;…

使用php编写代码实现伪协议包含和日志文件包含

伪协议包含是指利用php的include函数或者require函数来加载远程资源或者本地文件&#xff0c;通过伪协议的形式来指定文件路径。日志文件包含是指通过修改php的日志文件路径来实现包含恶意代码。 下面是一个使用php实现伪协议包含和日志文件包含的简单示例&#xff1a; 伪协议…

【项目】图书管理系统

目录 前言&#xff1a; 项目要求&#xff1a; 知识储备&#xff1a; 代码实现&#xff1a; Main&#xff1a; Books包&#xff1a; Book&#xff1a; BookList&#xff1a; Operate包&#xff1a; Operate: addOperate: deleteOperate: exitOperate: findOperate:…

Redis(十七)分布式锁

文章目录 面试题分布式锁锁的种类分布式锁需要具备的条件和刚需分布式锁 案例nginx分布式微服务部署&#xff0c;单机锁问题分布式锁注意事项lock/unlocklua脚本自研版的redis分布式锁搞定lua脚本 可重入锁可重入锁种类可重入锁hset实现&#xff0c;对比setnx&#xff08;重要&…

16-Java命令模式 ( Command Pattern )

Java命令模式 摘要实现范例 命令模式&#xff08;Command Pattern&#xff09;中请求以命令的形式包裹在对象中&#xff0c;并传给调用对象 调用对象寻找可以处理该命令的合适的对象&#xff0c;并把该命令传给相应的对象&#xff0c;该对象执行命令 命令模式是行为型模式&…

Clion调试QT程序qDebug()、cout控制台无输出的可能解决方法

qDebug()不输出 在当前项目配置中添加一个环境变量 方法一、单独为配置 QT_ASSUME_STDERR_HAS_CONSOLE1 方法二、全局配置&#xff08;系统变量&#xff09; 一劳永逸 效果 cout不输出 Clion在debug调试C/C的时候&#xff0c;printf/cout不会实时输出情况 结果同上~ 谢阅…

SDM450核心板_高通SDM450安卓核心板模块性能参数

高通SDM450核心板是基于SDM450移动平台开发的一款高性能核心板。采用领先的14纳米技术&#xff0c;该核心板为高端智能设备提供了卓越的性能和优质的体验。板载2GB16GB的内存(可选配4GB32GB)&#xff0c;双 ISP(图像传感器处理器)支持丰富的照片细节和双摄像头体验&#xff0c;…

30天自制操作系统(第28天)

28.1 alloca __alloca 会在下述情况下被 C 语言的程序调用&#xff08;采用 near-CALL 的方式&#xff09;。 1、要执行的操作从栈中分配 EAX 个字节的内存空间&#xff08; ESP - EAX; &#xff09; 2、要遵守的规则不能改变 ECX 、 EDX 、 EBX 、 EBP 、 ESI 、 EDI的值&am…

借助 Terraform 功能协调部署 CI/CD 流水线-Part 1

在当今快节奏的开发环境中&#xff0c;实现无缝、稳健的 CI/CD 流水线对于交付高质量软件至关重要。在本文中&#xff0c;我们将向您介绍使用 Bitbucket Pipeline、ArgoCD GitOps 和 AWS EKS 设置部署的步骤&#xff0c;所有步骤都将利用 Terraform 的强大功能进行编排。在Part…

01_Maven

文章目录 Maven安装MavenMaven的工作流程配置MavenMaven的使用module和project的关系如何用Maven导包 如何用Maven进行项目构建指令介绍clean指令compile指令package指令install指令 Maven的依赖管理如何导包scope作用域依赖传递依赖冲突 使用Maven开发项目Junit如何使用Junit …

Unity类银河恶魔城学习记录8-3 P79 Blackhole details setup源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Blackhole_Skill_Controller.cs using System.Collections; using System.C…

QT学习笔记3--创建对话框

1. 对话框子类 finddialog.h #ifndef FINDDIALOG_H #define FINDDIALOG_H#include <QLabel> #include <QDialog> #include <QCheckBox> #include <QLineEdit> #include <QPushButton>#include <QHBoxLayout> #include <QVBoxLayout&g…

UnityAPI的学习——Quaternion类

Quaternion又称为四元数&#xff0c;由x、y、z和w这4个分量组成&#xff0c;属于struct类型。 在Unity中&#xff0c;用Quaternion来存储和表示对象的旋转角度。 Quaternion类实例属性 在Quaternion类中&#xff0c;涉及的实例属性主要有eulerAngles eulerAngles属性&#x…

力扣刷题Day11--21. 合并两个有序链表(js)

目录 1&#xff0c;题目 2&#xff0c;代码 2.1迭代思想 2.2递归思想 3&#xff0c;学习与总结 3.1js中的链表类 3.2递归思想 3.3提醒自己 1&#xff0c;题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 2&am…

YOLOv9独家原创改进|加入RT-DETR中的HGBlock!

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、改进点介绍 HGBlock是RT-DETR中使用的特征提取模块。 二、HGBlock模块详解 2.1 模块简介 HGBlock的主要思想&#xff1a; 一个并联的卷积模块与…

java上传本地文件到服务器共享

在Windows系统中,将本地文件夹中的某个文件上传到另一台Windows服务器电脑上,前提:两台电脑网络互通,要接收文件的Windows服务器文件夹开启了共享,可以被本机用如下方式进行写入和读取: 如何配置服务器共享请自行百度查找。 所需要的maven依赖如下: <dependency>…