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.Driver
    url: 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=UTC
    username: root
    password: root

mybatis-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 {


    @Autowired
    UserMapper userMapper;

    @Test
    void contextLoads() {

        List list = userMapper.selectList(null);
        System.out.println(list);
    }


	// 更新
	@Test
    public 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形式
     */
    @TableId
    private Long id;



@Test
    public 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 {

    // 插入时的填充策略
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("start insert fill...");
        this.setFieldValByName("createTime", LocalDateTime.now(),metaObject);
        this.setFieldValByName("updateTime", LocalDateTime.now(),metaObject);
    }

    // 更新时的填充策略
    @Override
    public 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 {


    // 注册乐观锁插件
    @Bean
    public OptimisticLockerInterceptor optimisticLockerInterceptor(){
        return new OptimisticLockerInterceptor();
    }


}

// 测试乐观锁成功
    @Test
    public 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);
    }


    // 测试乐观锁失败!多线程下
    @Test
    public void testOptimisticLockerLose(){

        // 模拟线程1
        User 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 SqlSession
        SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6413d7e7] was not registered for synchronization because synchronization is not active
        2024-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: 1
        Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6413d7e7]





        Creating a new SqlSession
        SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@999b951] was not registered for synchronization because synchronization is not active
        2024-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: 0
        Closing 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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

微服务获取登录用户Id与单体服务下获取用户Id对比(黑马头条Day03)

前置声明 当前前后端分离开发项目中&#xff0c;后端某个请求向具体某个数据库中的多个表插入数据时&#xff0c;经常需要使用到当前登录用户的Id&#xff08;唯一标识&#xff09;。在当前用户线程下以实现变量共享&#xff0c;同时为了避免不同用户线程之间操作变量的影响&am…

设计模式之模版方法实践

模版方法实践案例 实践之前还是先了解一下模版方法的定义 定义 模板方法模式是一种行为设计模式&#xff0c;它定义了一个骨架&#xff0c;并允许子类在不改变结构的情况下重写的特定步骤。模板方法模式通过在父类中定义一个模板方法&#xff0c;其中包含了主要步骤&#xf…

【Python】成功解决TypeError: ‘float‘ object is not iterable

【Python】成功解决TypeError: ‘float’ object is not iterable &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程&#x1f448; 希望得…

Mysql按照月份分组统计数据,当月无数据则填充0

目录 起因实现结论 起因 最近有个需求需要在sql中实现获取近半年的统计数据&#xff0c;本来以为挺简单的&#xff0c;不过这个项目数据基本没有&#xff0c;在此情况下还要实现获取近半年的数据就没办法简单group by了 实现 #如果每个月都有数据的话是比较简单的 SELECT DA…

【XR806开发板试用】串口驱动JQ8900播放音乐

一、硬件连接 1.JQ8900引脚定义 通过阅读JQ8900的数据手册&#xff0c;可以了解到驱动JQ8900有许多种方式&#xff0c;IO驱动&#xff0c;一线串口驱动&#xff08;VPP&#xff09;&#xff0c;两线串口驱动&#xff08;RX&#xff0c;TX&#xff09;&#xff0c;这里我使用两…

C#多线程(4)——任务并行库TPL

文章目录 1 什么是TPL2 创建与启动任务3 等待任务4 任务中的异常处理5 取消任务 1 什么是TPL T P L \textcolor{red}{TPL} TPL&#xff08;Task Parallel Library&#xff09;任务并行库&#xff0c;是从.NetFramwork4.0后引入的基于异步操作的一组API。TPL的底层是基于多线程实…

C语言第三十六弹---文件操作(中)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 文件操作 1、文件的顺序读写 1.1、顺序读写函数介绍 1.1.1、fgetc 与 fputc 1.1.2、fgets 与 fputs 1.1.3、fscanf 与 fprintf 1.1.4、fread 与 fwrite 1.…

基于状态机的按键消抖实现

摸鱼记录 Day_14 !(^O^)y review 在day_13中以按键状态判断为例学习了状态分析基于状态机的按键消抖原理-CSDN博客 分析得到了下图&#xff1a; 今日任务&#xff1a;完成此过程 !(^O^)y 小梅哥对应视频&#xff1a; 15B 基于状态机的按键消抖Verilog实现_哔哩哔哩…

《乱弹篇(23)读书摘录》

之前逾月&#xff0c;偷得闲遐&#xff0c;在腾迅视频看了两部以宋朝历史为背景的电视剧《后宫》和《清平乐》&#xff0c;觉得好看并觉得有所裨益&#xff0c;但之后就再也难以找到能让人有耐心去看完的一部电视剧了。在一阵儿唏嘘感叹后&#xff0c;便去读书网搜索小说书读&a…

砝码称重 蓝桥杯

在C中&#xff0c;fabs()和abs()都用于计算数字的绝对值&#xff0c;但它们之间有一些区别。 fabs(double x)&#xff1a;计算浮点数x的绝对值&#xff0c;返回一个double类型的结果。 abs(int x)&#xff1a;计算整数x的绝对值&#xff0c;返回一个int类型的结果。 数组的默…

PolarDB for PostgreSQL-概述

阿里云数据库的概述 本篇罗列了一些知识点和结构。 日志 2. 同步复制&#xff1a;下降20% 异步复制&#xff1a;数据丢失风险&#xff0c; 部署 1.示例&#xff1a; vim polarx.toml 1.测试主库和备库数据一致性 备库是否一致性读 一个节点荡掉&#xff0c;提供服务。 GMS CN…

HCIP —— BGP --- 路由反射器和联邦

目录 IBGP的水平分割 解决办法 路由反射器 --- RR 反射器的环路问题如何解决&#xff1f;&#xff1f;&#xff1f; 1.Originator_ID 起源者ID 2.Cluster_List --- 簇列表 RR的配置 联邦的配置 1.联邦和其他AS设备建EBGP对等体 2.联邦内部IBGP建立对等体 3.联邦内部E…

数据管理【总结】

大数据&#xff1a;是指极其庞大的数据集&#xff0c;通常具备五大特征&#xff08;5个V&#xff09;&#xff1a;数据量大&#xff08;Volume&#xff09;、数据类型多样&#xff08;Variety&#xff09;、数据生成速度快&#xff08;Velocity&#xff09;、数据真实性高&…

最新Claude3注册教程:解决Claude3 Opus被封无法发送手机验证码问题

Claude3注册指南&#xff1a;解决无法发送手机验证码问题 Anthropic在3月4日宣布推出最新的大型语言模型&#xff08;LLM&#xff09;系列——Claude 3。这一系列模型在多种认知任务上树立了新的性能标准&#xff0c;包括Claude 3 Haiku、Claude 3 Sonnet 和 Claude 3 Opus三个…

2024年纯前端VUE在线编辑微软Office/金山WPS的Word文档,支持私有化部署!

现在&#xff0c;随着数字化进程渗透到到各行各业&#xff0c;数据安全已经成为了数字化革命中的重要组成部分&#xff0c;而在线Office成在OA、ERP、文档系统中得到了广泛的应用&#xff0c;为我国的信息化事业也做出了巨大贡献。随着操作系统、浏览器及Office软件的不断升级和…

node的安装与介绍

安装 下载地址 node官网首页就会有两个安装选择&#xff0c;会根据当前电脑的系统自动显示对应的安装包&#xff0c;一个长期维护版&#xff08;LTS&#xff09;,一个是尝鲜版&#xff0c;记住选择LTS版本 安装指定版本下载截图 安装过程截图&#xff08;非常简单&#xff…

短剧小程序:掌中剧院,随时演绎精彩

在快节奏的现代生活中&#xff0c;人们越来越追求高效与便捷。为了满足广大用户对短剧内容的热爱和追求&#xff0c;我们推出了全新的短剧小程序&#xff0c;让精彩剧情触手可及&#xff0c;随时随地为您带来欢乐与感动。 一、轻松点播&#xff0c;随享短剧魅力 通过短剧小程…

Talk|加州大学圣地亚哥分校程旭欣:视觉反馈下足式机器人的全身操作与运动

本期为TechBeat人工智能社区第576期线上Talk。 北京时间3月6日(周三)20:00&#xff0c;加州大学圣地亚哥分校博士生—程旭欣的Talk已准时在TechBeat人工智能社区开播&#xff01; 他与大家分享的主题是: “视觉反馈下足式机器人的全身操作与运动”&#xff0c;向大家系统地介绍…

【开源】JAVA+Vue.js实现大学生相亲网站

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统展示四、核心代码4.1 查询会员4.2 查询相亲大会4.3 新增留言4.4 查询新闻4.5 新增新闻 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的大学生相亲网站&#xff0c;包含了会员管理模块、新闻管…

Vue开发实例(十)Tabs标签页打开、关闭与路由之间的关系

创建标签页 一、创建标签页二、点击菜单展示新标签页1、将标签数据作为全局使用2、菜单点击增加标签页3、处理重复标签4、关闭标签页 三、点击标签页操作问题1&#xff1a;点击标签页选中菜单进行高亮展示问题2&#xff1a;点击标签页路由也要跳转 四、解决bug 先展示最终效果 …