Mybatis-Plus学习总结(超详细整理)(1),java面试项目中你遇到的难题

  • 分页插件支持多种数据库: 支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库

  • 内置性能分析插件: 可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询

  • 内置全局拦截插件: 提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

快速入门


1、创建数据库 mybatis_plus

现有一张 User 表,其表结构如下:

在这里插入图片描述

其对应的数据库 Schema 脚本,数据库 Data 脚本如下:

DROP TABLE IF EXISTS user;

CREATE TABLE user

(

id BIGINT(20) NOT NULL COMMENT ‘主键ID’,

name VARCHAR(30) NULL DEFAULT NULL COMMENT ‘姓名’,

age INT(11) NULL DEFAULT NULL COMMENT ‘年龄’,

email VARCHAR(50) NULL DEFAULT NULL COMMENT ‘邮箱’,

PRIMARY KEY (id)

);

– 真实开发中,version(乐观锁),deleted(逻辑删除)、gmt_create、gem_mo

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’);

2、新建Maven工程

在这里插入图片描述

2、导入相关依赖

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns=“http://maven.apache.org/POM/4.0.0”

xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”

xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>

4.0.0

org.springframework.boot

spring-boot-starter-parent

2.3.4.RELEASE

com.ly

mybatis-plus

1.0-SNAPSHOT

mybatis-plus

Demo project for Spring Boot

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>

<java.version>1.8</java.version>

com.baomidou

mybatis-plus-boot-starter

3.3.1.tmp

org.springframework.boot

spring-boot-starter-web

mysql

mysql-connector-java

runtime

org.projectlombok

lombok

org.springframework.boot

spring-boot-starter-test

test

org.junit.vintage

junit-vintage-engine

org.springframework.boot

spring-boot-maven-plugin

说明:我们使用mybatis-plus可以节省我们大量的代码,尽量不要同时导入mybatis和mybatis-plus! 版本的差异!

3、配置文件application.yml

spring:

#配置数据源

datasource:

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

url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8

username: root

password: 123456

#配置日志,我们所用的sql现在是不可见的,我们希望知道他是怎么执行的,所以我们必须要查看日志!

mybatis-plus:

configuration:

log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

4、编写代码

mybatis-plus的使用步骤: 引入依赖 -> 创建pojo -> 实现dao接口(不用写mapper.xml文件,只需要在启动器上配置 mapper 扫描路径即可)-> 基本使用

编写实体类 User.java,这里使用了Lombok插件

@Data

@AllArgsConstructor

@NoArgsConstructor

public class User {

private Long id;

private String name;

private Integer age;

private String email;

}

编写Mapper类 UserMapper.java

//在对应的Mapper上继承基本的类baseMapper

public interface UserMapper extends BaseMapper {

//所有的CRUD已经编写完成

//不需要像以前的配置一些xml

}

新建 Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹:

@SpringBootApplication

@MapperScan(“com.ly.mapper”)//扫描mapper文件夹

public class MybatisPlusApplication {

public static void main(String[] args) {

SpringApplication.run(MybatisPlusApplication.class, args);

}

}

工程目录:

在这里插入图片描述

添加测试类,进行功能测试:

@RunWith(SpringRunner.class)

@SpringBootTest

public class MybatisPlusTest {

//继承了BaseMapper,所有方法都来自父类

//我们可以编写自己的拓展方法

@Autowired

private UserMapper userMapper;

@Test

public void testSelect() {

System.out.println((“----- selectAll method test ------”));

//参数是一个Wrapper,条件结构器,这里先不用 填null

//查询所有的用户

List userList = userMapper.selectList(null);

userList.forEach(System.out::println);

}

}

UserMapper 中的 selectList() 方法的参数为 MP 内置的条件封装器 Wrapper,所以不填写就是无任何条件

控制台输出:

在这里插入图片描述

实现CRUD


插入操作:

插入一条记录: int insert(T entity);

插入类型T:实体对象

举例测试:

@Test

public void testInsert() {

User user = new User();

user.setName(“LY”);

user.setAge(100);

user.setEmail(“123@qq.com”);

int result = userMapper.insert(user); //帮我们生成id

System.out.println(result); //受影响的行数

System.out.println(user); //发现id会自动回填

}

运行结果:mybatis-plus实现了主键自动生成

在这里插入图片描述

主键生成策略:

数据库插入的id为全局默认的id(ID_WORKER),我们需要配置主键自增,在实体类字段上添加注解: @TableId(type =IdType.AUTO),数据库字段一定要是自增的。

public enum IdType {

AUTO(0), //数据可id自增

NONE(1), //未设置主键

INPUT(2), //手动输入

ID_WORKER(3), //默认的全局唯一id

UUID(4), //全局唯一id uuid

ID_WORKER_STR(5); // ID_WORKEK 字符串表示法

private int key;

private IdType(int key) {

this.key = key;

}

public int getKey() {

return this.key;

}

}

添加过注解,并将数据库id字段设置为自增后,测试插入数据:

在这里插入图片描述

雪花算法:

SnowFlake 算法,是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的。

这 64 个 bit 中,其中 1 个 bit 是不用的,然后用其中的 41 bit 作为毫秒数,用 10 bit 作为工作机器 id,12 bit 作为序列号。

更新操作

// 根据 whereEntity 条件,更新记录

int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper updateWrapper);

// 根据 ID 修改

int updateById(@Param(Constants.ENTITY) T entity);

#参数说明

类型 参数名 描述

T entity 实体对象 (set 条件值,可为 null)

Wrapper updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句)

举例测试:

@Test

public void testUpdate() {

//sql自动动态配置

User user = new User();

user.setName=(“ZZ”);

user.setId(3L);

user.setAge(“50”);

//注意:updateById的参数是一个对象

userMapper.updateById(user);

}

运行结果:

在这里插入图片描述

自动填充


创建时间、修改时间!这些个操作一般都是自动化完成,我们不希望手动更新!

阿里巴巴开发手册:所有的数据库表:gmt_create\gmt_modified几乎所有的表都要配置上!而且需要自动化

方式一:数据库级别 (工作中不允许)

​在表中新增字段 create_time 、update_time,设为默认CURRENT_TIMESIAMP

方式二:代码级别

​在表中新增字段 create_time 、update_time:

在这里插入图片描述

​ 实体类上的属性需要增加注解 @TableField

@Data

@AllArgsConstructor

@NoArgsConstructor

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;

}

​ 编写处理器来处理这个注释:

@Slf4j

@Component //不要忘记吧处理器加到IOC容器中

public class MyMetaObjectHandler implements MetaObjectHandler {

//插入时候的填充策略

@Override

public void insertFill(MetaObject metaObject) {

log.info(“start insert fill …”); //日志

//设置字段的值(String fieldName字段名,Object fieldVal要传递的值,MetaObject metaObject)

this.setFieldValByName(“createTime”,new Date(),metaObject);

this.setFieldValByName(“updateTime”,new Date(),metaObject);

}

//更新时间的填充策略

@Override

public void updateFill(MetaObject metaObject) {

log.info(“start update fill …”);

this.setFieldValByName(“updateTime”,new Date(),metaObject);

}

}

测试插入一条数据:

在这里插入图片描述

数据库中的数据:

在这里插入图片描述

乐观锁


乐观锁:顾名思义十分乐观,它总是被认为不会出现问题,无论干什么都不去上锁!如果出现了问题,再次更新测试

悲观锁:顾名思义十分悲观,它总是出现问题,无论干什么都会上锁!再去操作!

乐观锁实现方式:

  • 取出记录时,获取当前version

  • 更新时,带上这个version

  • 执行更新事,set version=newVersion where version =oldVersion

  • 如果version不对,就更新失败

乐观锁: 1、先查询,获得版本号 version=1

–A

update user set name =“shuishui” ,version =version+1

where id =2 and version=1

–B 如果线程抢先完成,这个时候version=2,会导致A修改失败

update user set name =“shuishui” ,version =version+1

where id =2 and version=1

测试乐观锁:

1、表中创建乐观锁字段version 默认值为1

2、同步实体类

@Version //乐观锁Version注解

private Integer version;

3、注册组件 (config包下)

@EnableTransactionManagement

@MapperScan(“com.ly.mapper”)

@Configuration//配置类

public class MyBatisPlusConfig{

//注册乐观锁插件

@Bean

public OptimisticLockerInterceptor optimisticLockerInterceptor() {

return new OptimisticLockerInterceptor();

}

}

测试乐观锁成功:

//测试乐观锁成功

@Test

public void testOptimisticLocker(){

//1、查询用户信息

User user = userMapper.selectById(1L);

//2、修改用户信息

user.setName(“LZY”);

user.setEmail(“222@qq.com”);

//执行更新操作

userMapper.updateById(user);

}

在这里插入图片描述

模拟乐观锁失败:

//测试乐观锁失败

@Test

public void testOptimisticLocker2(){

//1、查询用户信息

User user = userMapper.selectById(1L);

//2、修改用户信息

user.setName(“LZY1”);

user.setEmail(“111@qq.com”);

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

最后

这份文档从构建一个键值数据库的关键架构入手,不仅带你建立起全局观,还帮你迅速抓住核心主线。除此之外,还会具体讲解数据结构、线程模型、网络框架、持久化、主从同步和切片集群等,帮你搞懂底层原理。相信这对于所有层次的Redis使用者都是一份非常完美的教程了。

image

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断!!!

锁失败

@Test

public void testOptimisticLocker2(){

//1、查询用户信息

User user = userMapper.selectById(1L);

//2、修改用户信息

user.setName(“LZY1”);

user.setEmail(“111@qq.com”);

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-GixBht8a-1711000709169)]
[外链图片转存中…(img-e18Bn4zd-1711000709170)]
[外链图片转存中…(img-0rzsdZD0-1711000709170)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-KIpDloq6-1711000709171)]

最后

这份文档从构建一个键值数据库的关键架构入手,不仅带你建立起全局观,还帮你迅速抓住核心主线。除此之外,还会具体讲解数据结构、线程模型、网络框架、持久化、主从同步和切片集群等,帮你搞懂底层原理。相信这对于所有层次的Redis使用者都是一份非常完美的教程了。

[外链图片转存中…(img-oYzUt9ou-1711000709171)]

整理不易,觉得有帮助的朋友可以帮忙点赞分享支持一下小编~

你的支持,我的动力;祝各位前程似锦,offer不断!!!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 30
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值