MyBatisPlus

2023-05-16

1.简介

官网:https://www.baomidou.com/

2.相关依赖以及配置

2.1. pom引入依赖

  <!--MyBatisPlus 启动器-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3</version>
        </dependency>
        <!--MyBatisPlus  代码生成器核心依赖-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.3</version>
        </dependency>
        <!--freemarker 依赖-->
        <dependency>
            <groupId>org.freemarker</groupId>
            <artifactId>freemarker</artifactId>
            <version>2.3.31</version>
        </dependency>

2.2. 配置application.yml

spring:
  datasource:
    #type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mybatis_plus
    username: root
    password: 2002

# 配置MyBatis日志
mybatis-plus:
  configuration:
    #配置MyBatis的日志,输出到指定控制台
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    #开启MyBatis的驼峰命名自动映射开关 a_colum --->  aColum
    map-underscore-to-camel-case: true
    #配置类型别名所对应的包
  type-aliases-package: com.huntouzai.mybatisplus.pojo
  #扫描通用枚举的包  3.5.2极其之后的版本不需要配置
  #type-enums-package: com.huntouzai.mybatisplus.enums

3.基本crud

3.1.BaseMapper

MyBatis-Plus中的基本CRUD在内置的BaseMapper中都已得到了实现,我们可以直接使用,案例如
下:

package com.baomidou.mybatisplus.core.mapper;
public interface BaseMapper<T> extends Mapper<T> {
  /**
  * 插入一条记录
  * @param entity 实体对象
  */
  int insert(T entity);
}

3.2.通用Service – IService

MyBatis-Plus中有一个接口 IService和其实现类 ServiceImpl,封装了常见的业务层逻辑
详情查看源码IService和ServiceImpl
使用方法如下:
创建Service接口和实现类

/**
* UserService继承IService模板提供的基础功能
*/
public interface UserService extends IService<User> {
 
}
**
* ServiceImpl实现了IService,提供了IService中基础功能的实现
*ServiceImpl无法满足业务需求,则可以使用自定的UserService定义方法,并在实现类中实现
*/
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements
UserService {
 
}

可以在测试方法中直接使用

@Autowired
private UserService userService;
@Test
public void testGetCount(){
  long count = userService.count();
  System.out.println("总记录数:" + count);
}

4.常用注解

4.1. @TableName处理数据库表名

  • 问题:之前BaseMapper中设置了泛型User,自动匹配操作的表为user,如果命名不一致,则无法匹配
  • 解决方案:需要在实体类上增加该注解@TableName(“t_user”)
  • 属性:注解内的属性为数据库表名
    也可以使用全局配置解决
mybatis-plus:
configuration:
  # 配置MyBatis日志
 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
 db-config:
   # 配置MyBatis-Plus操作表的默认前缀
  table-prefix: t_

4.2. @TableId处理主键

  • 问题:默认将ID作为主键列,用雪花算法生成id
  • 解决方案:在主键属性上增加@TableId(value=“uid”,type=idType.ASSIGN_ID)
  • 属性:将这个属性对应的字段作为当前主键,通过value属性设置数据库主键字段名,type属性设置主键id生成算法,递增(IdType.AUTO)、雪花算法(idType.ASSIGN_ID)等等
    也可以配置全局主键策略
mybatis-plus:
configuration:
  # 配置MyBatis日志
 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
 db-config:
   # 配置MyBatis-Plus操作表的默认前缀
  table-prefix: t_
   # 配置MyBatis-Plus的主键策略
  id-type: auto

4.2.1. 雪花算法

长度共64bit(一个long型)。
首先是一个符号位,1bit标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负
数是1,所以id一般是正数,最高位是0。
41bit时间截(毫秒级),存储的是时间截的差值(当前时间截 - 开始时间截),结果约等于69.73年。
10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID,可以部署在1024个节点)。
12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID)。
在这里插入图片描述
优点:整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞,并且效率较高。

4.3. @TableField处理数据库字段名

  • 问题:实体类属性名和类名不一致
  • 解决方案:在实体类属性上使用@TableField(“数据库对应字段名”)设置属性所对应的字段名

4.4. @TableLogic逻辑删除

  • 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除的数据
  • 逻辑删除:假删除,将对应数据中代表是否被删除字段的状态修改为“被删除状态”,之后在数据库
    中仍旧能看到此条数据记录
  • 可用于数据恢复
  • 使用方式:一般定义实体类的删除属性,数据库真添加删除字段
@TableLogic
private Integer isDeleted;//默认0是未删除,1是已删除

5. wapper条件构造器

在这里插入图片描述

  • Wrapper : 条件构造抽象类,最顶端父类
    • AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
      • QueryWrapper : 查询条件封装
      • UpdateWrapper : Update 条件封装
      • AbstractLambdaWrapper : 使用Lambda 语法
        • LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
        • LambdaUpdateWrapper : Lambda 更新封装Wrapper

5.1. QueryWrapper查询条件封装

@Test
public void test04() {
  QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  //将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
  //UPDATE t_user SET age=?, email=? WHERE (username LIKE ? AND (age > ? ORemail IS NULL))
  //lambda表达式内的逻辑优先运算
  queryWrapper.like("username", "a")
     .and(i -> i.gt("age", 20).or().isNull("email"));
  User user = new User();
  user.setAge(18);
  user.setEmail("user@atguigu.com");
  int result = userMapper.update(user, queryWrapper);
  System.out.println("受影响的行数:" + result);
}

总结:并且直接链式编程,或者用or(),括号里的则写在and()的括号里边

5.2. UpdateWrapper更新条件封装

@Test
public void test07() {
  //将(年龄大于20或邮箱为null)并且用户名中包含有a的用户信息修改
  //组装set子句以及修改条件
  UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
  //lambda表达式内的逻辑优先运算
  updateWrapper
   .set("age", 18)
   .set("email", "user@atguigu.com")
   .like("username", "a")
   .and(i -> i.gt("age", 20).or().isNull("email"));
  //这里必须要创建User对象,否则无法应用自动填充。如果没有自动填充,可以设置为null
  //UPDATE t_user SET username=?, age=?,email=? WHERE (username LIKE ? AND(age > ? OR email IS NULL))
  //User user = new User();
  //user.setName("张三");
  //int result = userMapper.update(user, updateWrapper);
  //UPDATE t_user SET age=?,email=? WHERE (username LIKE ? AND (age > ? ORemail IS NULL))
  int result = userMapper.update(null, updateWrapper);
  System.out.println(result);
}

5.3. 条件查询

在条件构造器调用的方法中可以判空,注意使用的StringUtils是MyBatisPlus中的

@Test
public void test08UseCondition() {
  //定义查询条件,有可能为null(用户未输入或未选择)
  String username = null;
  Integer ageBegin = 10;
  Integer ageEnd = 24;
  QueryWrapper<User> queryWrapper = new QueryWrapper<>();
  //StringUtils.isNotBlank()判断某字符串是否不为空且长度不为0且不由空白符(whitespace)构成
  queryWrapper
     .like(StringUtils.isNotBlank(username), "username", "a")
     .ge(ageBegin != null, "age", ageBegin)
     .le(ageEnd != null, "age", ageEnd);
  //SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE (age >=
? AND age <= ?)
  List<User> users = userMapper.selectList(queryWrapper);
  users.forEach(System.out::println);
}

5.4. LambdaQueryWrapper

//避免使用字符串表示字段,防止运行时错误,“name”写为User::getName

@Test
public void test09() {
  //定义查询条件,有可能为null(用户未输入)
  String username = "a";
  Integer ageBegin = 10;
  Integer ageEnd = 24;
  LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
  //避免使用字符串表示字段,防止运行时错误
  queryWrapper
     .like(StringUtils.isNotBlank(username), User::getName, username)
     .ge(ageBegin != null, User::getAge, ageBegin)
     .le(ageEnd != null, User::getAge, ageEnd);
  List<User> users = userMapper.selectList(queryWrapper);
  users.forEach(System.out::println);
}

5.5. LambdaUpdateWrapper

@Test
public void test10() {
  //组装set子句
  LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
  updateWrapper
   .set(User::getAge, 18)
   .set(User::getEmail, "user@atguigu.com")
   .like(User::getName, "a")
   .and(i -> i.lt(User::getAge, 24).or().isNull(User::getEmail)); //lambda表达式内的逻辑优先运算
  User user = new User();
  int result = userMapper.update(user, updateWrapper);
  System.out.println("受影响的行数:" + result);
}

6.插件

6.1. 分页

6.1.1. 分页插件

实现步骤

  • 添加配置类
@Configuration
//@MapperScan("com.atguigu.mybatisplus.mapper")  //可以将主类中的注解移到此处,包扫描,我个人习惯在Mapper接口上加上@Mapper注解
public class MybatisPlusConfig { 
  @Bean
  public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    return interceptor;
 }
}
  • 测试
@Test
public void testPage(){
  //设置分页参数
  Page<User> page = new Page<>(1, 5);
  userMapper.selectPage(page, null);
  //获取分页数据
  List<User> list = page.getRecords();
  list.forEach(System.out::println);
  System.out.println("当前页:"+page.getCurrent());
  System.out.println("每页显示的条数:"+page.getSize());
  System.out.println("总记录数:"+page.getTotal());
  System.out.println("总页数:"+page.getPages());
  System.out.println("是否有上一页:"+page.hasPrevious());
  System.out.println("是否有下一页:"+page.hasNext());
}

6.1.2. xml自定义分页

Mapper接口方法

Page<User> selectPageVo(@Param("page") Page<User> page, @Param("age") Integer age);

Mapper.xml中编写SQL

    <select id="selectPageVo" resultType="User">
        select *
        from user where age > #{age}
    </select>

6.2.乐观锁

  • 1.给实体类和数据库分别新增属性和字段:version,加上并在实体列的属性名上加注解:@Version
  • 2.添加配置乐观锁插件
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor(){
  MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
  //添加分页插件
  interceptor.addInnerInterceptor(new
PaginationInnerInterceptor(DbType.MYSQL));
  //添加乐观锁插件
  interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
  return interceptor;
}

代码实现

@Test
public void testConcurrentVersionUpdate() {
  //小李取数据
  Product p1 = productMapper.selectById(1L);
  //小王取数据
  Product p2 = productMapper.selectById(1L);
  //小李修改 + 50
  p1.setPrice(p1.getPrice() + 50);
  int result1 = productMapper.updateById(p1);
  System.out.println("小李修改的结果:" + result1);
  //小王修改 - 30
  p2.setPrice(p2.getPrice() - 30);
  int result2 = productMapper.updateById(p2);
  System.out.println("小王修改的结果:" + result2);
  if(result2 == 0){
    //失败重试,重新获取version并更新
    p2 = productMapper.selectById(1L);
    p2.setPrice(p2.getPrice() - 30);
    result2 = productMapper.updateById(p2);
 }
  System.out.println("小王修改重试的结果:" + result2);
  //老板看价格
  Product p3 = productMapper.selectById(1L);
  System.out.println("老板看价格:" + p3.getPrice());
}

7.通用枚举

创建通用枚举类型

package com.atguigu.mp.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import lombok.Getter;
@Getter
public enum SexEnum {
  MALE(1, "男"),
  FEMALE(2, "女");
  @EnumValue
  private Integer sex;
  private String sexName;
  SexEnum(Integer sex, String sexName) {
    this.sex = sex;
    this.sexName = sexName;
     }
}

扫描通用枚举

mybatis-plus:
configuration:
  # 配置MyBatis日志
 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
global-config:
 db-config:
   # 配置MyBatis-Plus操作表的默认前缀
  table-prefix: t_
   # 配置MyBatis-Plus的主键策略
  id-type: auto
 # 配置扫描通用枚举
type-enums-package: com.atguigu.mybatisplus.enums

测试

@Test
public void testSexEnum(){
  User user = new User();
  user.setName("Enum");
  user.setAge(20);
  //设置性别信息为枚举项,会将@EnumValue注解所标识的属性值存储到数据库
  user.setSex(SexEnum.MALE);
  //INSERT INTO t_user ( username, age, sex ) VALUES ( ?, ?, ? )
  //Parameters: Enum(String), 20(Integer), 1(Integer)
  userMapper.insert(user);
}

8.代码生成器

自行查看MyBatisPlus官网

9.多数据源

引入依赖

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
  <version>3.5.0</version>
</dependency>

配置多数据源

spring:
 # 配置数据源信息
datasource:
 dynamic:
   # 设置默认的数据源或者数据源组,默认值即为master
  primary: master
   # 严格匹配数据源,默认false.true未匹配到指定数据源时抛异常,false使用默认数据源
  strict: false
  datasource:
   master:
    url: jdbc:mysql://localhost:3306/mybatis_plus?characterEncoding=utf-8&useSSL=false
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456
   slave_1:
    url: jdbc:mysql://localhost:3306/mybatis_plus_1?characterEncoding=utf-8&useSSL=false
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456

在用户service中,在类上增加@DS(“数据源名称”)来指定所操作的数据源

10. MyBatisX插件

MyBatisX插件用法:https://baomidou.com/pages/ba5b24/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyBatisPlus 的相关文章

  • MyBatisPlus(三)CRUD接口操作

    一 CRUD扩展 Insert 插入 span class token comment 测试插入 span span class token annotation punctuation 64 Test span span class to
  • Mybatis和Mybatis-Plus的配置

    目录 一 springMVC中Mybatis的配置 1 添加 MyBatis 和 MyBatis Spring 的依赖 2 配置数据源 3 配置 MyBatis 4 编写 Mapper 接口和对应的 XML 文件 二 springnboot
  • Mybatis-Plus时间范围查询

    方式一 通过apply方法 来实现时间范围查询 该方法可用于数据库函数 动态入参的params对应前面applySql内部的 index 部分 这样是不会有sql注入风险的 反之会有 apply String applySql Object
  • 3、MyBatisPlus的CRUD 接口

    MyBatisPlus的CRUD 接口 一 insert 1 插入操作 2 主键策略 二 update 1 根据Id更新操作 2 自动填充 3 乐观锁 三 select 1 根据id查询记录 2 通过多个id批量查询 3 简单的条件查询 4
  • 5.Mybatis-plus_乐观锁和悲观锁

    乐观锁 故名思意十分乐观 它总是认为不会出现问题 无论干什么不去上锁 如果出现了问题 再次更新值测试 悲观锁 故名思意十分悲观 它总是认为总是出现问题 无论干什么都会上锁 再去操作 乐观锁实现方式 取出记录时 获取当前 version 更新
  • RocketMQ发送接收项目实战+对cos或者oss服务上的pdf文件和图片加水印

    使用mq的原因 因为项目中文件上传比较多 需要使用mq分担当前系统线程压力 所以单独使用一个服务来处理文件上传 加快文件上传速度的同时也缓解了当前服务的处理压力 核心服务1 一个项目 发送mq GeneralFileEvent 需要发送给m
  • MybatisPlus自定义sql多表关联分页条件查询

    MybatisPlus自定义sql多表关联分页条件查询 mp封装了crud但是对应复杂sql还是需要自己定义 网上对于多表分页查询的mp描述不是很清楚 我在这里重新写一篇文章 1 数据库准备 需要实现的sql是两表关联条件查询 select
  • Mybatis-Plus(一)

    Mybatis Plus 一 最近在项目当中学习到了一种新的构建sql查询的技术 mybatis plus 相交与之前使用的example即先创建一个example对象 再根据这个对象创建一个criteria对象来说 这种方式更为简洁方便
  • mybatisplus 修改某个字段为空值

    文章目录 前言 一 重现bug 二 解决方法 总结 前言 需求 移除企业 将ent id设置为null 一 重现bug 1 使用updateById 更新单独个字段为空值 结果报错 Override public void update S
  • mybatis-plus教程-Mybatis-Plus增删改查

    完整代码 https github com pbteach mybatis plus test Mybatis plus增删改查 通过前面的学习 我们了解到通过继承BaseMapper就可以获取到各种各样的单表操作 接下来我们将详细讲解这些
  • mybatis-plus 自动代码生成

    最新mybatis plus 代码自动生成工具 创建一个springboot 项目 引入如下依赖
  • MybatisPlus QueryWrapper的null查询

    查询字段对应 null的值 特殊 isNull QueryWrapper
  • Mybatis-plus中操作JSON字段

    1 实体类上要加上自动映射 TableName value school autoResultMap true 2 json字段上加上json处理器 TableField value cover url typeHandler Jackso
  • 【Java笔记+踩坑】MyBatisPlus基础

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud SpringCloudAlibaba 黑马旅游 谷粒商城 目录 1 MyBatisPlus简介 1 1 回顾Sp
  • MyBatisPlus学习(1)—— 初始化环境配置 + BaseMapper

    一 添加依赖 首先创建springboot工程 然后在pom xml中添加mybatis plus相关依赖
  • springboot整合mybatis-plus,代码自动生成

    Mybatis Plus 简称MP 是一个 Mybatis 的增强工具 在 Mybatis 的基础上只做增强不做改变 为简化开发 提高效率而生 特性 无侵入 Mybatis Plus 在 Mybatis 的基础上进行扩展 只做增强不做改变
  • 服务端架构:Mybatis-Plus的优缺点

    前段时间帮朋友处理java后端架构问题 看到了mybatis plus 其实早几年就知道这个东西 但一直没用没学 这两天许久未见的web服务看了看 聊聊个人感受 如有不适 请见谅 文章目录 优点 缺点 1 对数据访问层DAO的上层入侵太强
  • mybatis-plus 新增/修改实现自动填充指定字段

    需要修改的字段在模型类上添加 TableField fill FieldFill xxx 注解 FieldFill的选项 哪个字段在什么时候填充需要手动设置注解 新建一个MetaObjectHandler的实现类MyMetaObjectHa
  • mybatis-plus入坑指南

    简介 MyBatis Plus 简称 MP 是一个 MyBatis 的增强工具 在 MyBatis 的基础上只做增强不做改变 为简化开发 提高效率而生 特性 无侵入 只做增强不做改变 引入它不会对现有工程产生影响 如丝般顺滑 损耗小 启动即
  • SpringBoot-基础篇复习(全)

    本文包含SpringBoot基础篇的所有知识点 大家一起来学习吧 开启一段新的旅程 加油吧 springboot是由Picotal团队提供的全新框架 用来简化spring的搭建和开发过程的配置 因为spring的配置比较繁琐 故引入了spr

随机推荐

  • nginx

    介绍 nginx Nginx是一款轻量级的Web服务器 反向代理服务器及电子邮件 xff08 IMAP POP3 xff09 代理服务器 其特点是占有内存少 xff0c 并发能力强 xff0c 在各大型互联网公司都有非常广泛的使用 nigi
  • SpringBoot基础

    SpringBootWeb快速入门 创建SpringBoot工程 xff08 需要联网 xff09 基于Spring官方骨架 xff0c 创建SpringBoot工程 基本信息描述完毕之后 xff0c 勾选web开发相关依赖 xff08 注
  • docker Hub-Node模式运行selenium grid4,经常遇到用例运行到60%-65%时无法继续运行

    问题描述 报错第一行 INTERNALERROR gt def worker internal error self node formatted error 报错中间错误内容详情 情况一 selenium common exception
  • Postman

    Postman是一款功能强大的网页调试与发送网页HTTP请求的Chrome插件 Postman原是Chrome浏览器的插件 xff0c 可以模拟浏览器向后端服务器发起任何形式 如 get post 的HTTP请求 使用Postman还可以在
  • MyBatis -- 1

    创建springboot工程 创建springboot工程 xff0c 并导入 mybatis的起步依赖 mysql的驱动包 配置MyBatis 在springboot项目中 xff0c 可以编写application properties
  • java.lang.ClassNotFoundException:javax.xml.bind.DatatypeConverter【解决办法】使用jwt时报错

    遇到的问题 java lang ClassNotFoundException javax xml bind DatatypeConverter 原因 xff1a 这有可能是因为SpringBoot项目结合jwt进行登录时出现的问题 xff0
  • 开发规范--REST、统一响应结果、开发流程

    开发规范 REST REST xff08 Representational State Transfer xff09 xff0c 表述性状态转换 xff0c 它是一种软件架构风格 传统URL风格如下 xff1a http localhost
  • Java-springboot中的常见的注解

    64 RestController RestController注解相当于 64 ResponseBody和 64 Controller合在一起使用 64 Controller xff1a 将当前修饰类注入ICO容器 xff0c 也有语义化
  • 文件上传前后端实现

    前端实现 span class token tag span class token tag span class token punctuation lt span form span span class token attr name
  • SpringBoot配置文件 -- 参数配置化

    常见配置文件格式对比 SpringBoot提供了多种属性配置方式 application properties server port 61 8080 server address 61 127 0 0 1 application yml
  • JWT令牌技术

    JWT令牌 全称 xff1a JOSN Web Token https jwt io 定义了一种简介的 自包含的格式 xff0c 用于在通信双方以JSON数据格式安全的传输信息 犹豫数字签名的存在 xff0c 这些信息是可靠的 通过base
  • 拦截器Interceptor

    Interceptor拦截器入门 介绍 什么是拦截器 xff1f 是一种动态拦截方法调用的机制 xff0c 类似于过滤器 拦截器是Spring框架中提供的 xff0c 用来动态拦截控制器方法的执行 拦截器的作用 xff1a 拦截请求 xff
  • 异常处理--全局异常处理器

    异常处理方案 出现异常之后 xff0c 三层依次向上抛出 xff0c 最后交给Spring框架处理 xff0c 返回一个JSON的错误信息 在三层构架项目中 xff0c 出现了异常 xff0c 可以用以下两种方式处理 方案一 xff1a 在
  • 简单理解位运算:位与&、位或|、位非~、异或^、左移<<、右移>>

    位运算 xff0c 顾名思义 xff0c 就是对字节中的每个位进行一位一位的运算 常见的运算符有 xff1a 位与 xff08 amp xff09 位或 xff08 xff09 位非 xff08 xff09 异或 xff08 xff09 左
  • bash 脚本字符串截取表达式详细说明

    在编写linux脚本时 xff0c 有时需要操作字符串 xff0c 从一个字符串中截取一段字符串 xff0c linux系统的bash脚本截取字符串的功能比较强 xff0c 表达式丰富 xff0c 时间长了容易忘记 xff0c 因此作此笔记
  • Springboot入门 -- AOP

    一 事务 1 回顾MySQL事务管理 事务的操作主要有三步 xff1a 开启事务 xff08 一组操作开始前 xff0c 开启事务 xff09 xff1a start transaction begin 提交事务 xff08 这组操作全部成
  • SpringBoot原理篇

    1 配置优先级 优先级一次为 xff1a application properties application yml application ymal 推荐使用yml 除了配置文件属性配置 xff0c 还支持Java系统属性和命令行参数的
  • maven私服配置说明

    私服配置说明 使用私服 xff0c 需要在maven的settings xml配置文件中 xff0c 做如下配置 xff1a 需要在 servers 标签中 xff0c 配置访问私服的个人凭证 访问的用户名和密码 span class to
  • Git基本使用

    1 Git快速入门 1 1 Git概述 Git是一个免费的 xff0c 开源的分布式版本控制系统 xff0c 可以快速高效地处理从小型或大型的各种项目 Git易于学习 xff0c 占用空间小 xff0c 性能快得惊人 官网 xff1a ht
  • MyBatisPlus

    1 简介 官网 xff1a https www baomidou com 2 相关依赖以及配置 2 1 pom引入依赖 span class token comment lt MyBatisPlus 启动器 gt span span cla