Java最全狂神说---MyBatisPlus学习,2024最新网易Java面试题目

Spring全套教学资料

Spring是Java程序员的《葵花宝典》,其中提供的各种大招,能简化我们的开发,大大提升开发效率!目前99%的公司使用了Spring,大家可以去各大招聘网站看一下,Spring算是必备技能,所以一定要掌握。

目录:

部分内容:

Spring源码

  • 第一部分 Spring 概述
  • 第二部分 核心思想
  • 第三部分 手写实现 IoC 和 AOP(自定义Spring框架)
  • 第四部分 Spring IOC 高级应用
    基础特性
    高级特性
  • 第五部分 Spring IOC源码深度剖析
    设计优雅
    设计模式
    注意:原则、方法和技巧
  • 第六部分 Spring AOP 应用
    声明事务控制
  • 第七部分 Spring AOP源码深度剖析
    必要的笔记、必要的图、通俗易懂的语言化解知识难点

脚手框架:SpringBoot技术

它的目标是简化Spring应用和服务的创建、开发与部署,简化了配置文件,使用嵌入式web服务器,含有诸多开箱即用的微服务功能,可以和spring cloud联合部署。

Spring Boot的核心思想是约定大于配置,应用只需要很少的配置即可,简化了应用开发模式。

  • SpringBoot入门
  • 配置文件
  • 日志
  • Web开发
  • Docker
  • SpringBoot与数据访问
  • 启动配置原理
  • 自定义starter

微服务架构:Spring Cloud Alibaba

同 Spring Cloud 一样,Spring Cloud Alibaba 也是一套微服务解决方案,包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。

  • 微服务架构介绍
  • Spring Cloud Alibaba介绍
  • 微服务环境搭建
  • 服务治理
  • 服务容错
  • 服务网关
  • 链路追踪
  • ZipKin集成及数据持久化
  • 消息驱动
  • 短信服务
  • Nacos Confifig—服务配置
  • Seata—分布式事务
  • Dubbo—rpc通信

Spring MVC

目录:

部分内容:

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

需要这份系统化的资料的朋友,可以点击这里获取

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

在这里插入图片描述

3.新建springboot项目(mybatis_plus)

编写项目,初始化项目!使用springboot初始化!

4…导入依赖

mysql

mysql-connector-java

org.projectlombok

lombok

com.baomidou

mybatis-plus-boot-starter

3.0.5

在这里插入图片描述

5.连接数据库 application.xml

是否使用安全连接:useSSL=false

mysql5 驱动不同 com.mysql.jdbc.Driver

mysql8 驱动不同 com.mysql.cj.jdbc.Driver serverTimezone=GMT%2B8

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

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

spring.datasource.username=root

spring.datasource.password=123456

5.传统的Pojo-dao(连接mybatis,配置mapper.xml文件)-service-controller

6.用mybatis-plus后(pojo-mapper接口-使用)

Pojo:

@Data

@NoArgsConstructor

@AllArgsConstructor

public class User {

private Long id;

private String name;

private Integer age;

private String email;

}

Mapper:

//在对应的mapper上继承基本的类 —BaseMapper

@Repository//表示是持久层 dao层的 mapper

public interface UserMapper extends BaseMapper{

//在继承BaseMapper之后,所有的CRUD操作已经编写完成

}

注意点:主启动类MybatisPlusApplication 添加扫描包

@MapperScan(“com.hh.mapper”) //扫描包

@SpringBootApplication

public class MybatisPlusApplication {

public static void main(String[] args) {

SpringApplication.run(MybatisPlusApplication.class, args);

}

}

使用(测试类)

@SpringBootTest

class MybatisPlusApplicationTests {

@Autowired//远程注入 继承了BaseMapper,所有的方法都来自于父类

private UserMapper userMapper;

@Test

void contextLoads() {

//参数 wrapper ,条件构造器

List users = userMapper.selectList(null);

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

}

}

演示结果:

User(id=1, name=Jone, age=18, email=test1@baomidou.com)

User(id=2, name=Jack, age=20, email=test2@baomidou.com)

User(id=3, name=Tom, age=28, email=test3@baomidou.com)

User(id=4, name=Sandy, age=21, email=test4@baomidou.com)

User(id=5, name=Billie, age=24, email=test5@baomidou.com)

7.日志配置

#配置日志 方便在开发的时候看到查询语句是怎么运行的,在运营阶段可以关闭日志,提高效率

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

演示结果:

Preparing: SELECT id,name,age,email FROM user

CRUD 扩展


插入

@Test

void testinsert() {

User user = new User();

user.setName(“哈哈学mybatis_plus”);

user.setAge(10);

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

int result = userMapper.insert(user);//id 自动生成了

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

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

}

在这里插入图片描述

数据库插入的id的默认值为:全局的唯一id

主键生成策略

//默认ID_WORKER全局唯一ID

@TableId(type = IdType.ID_WORKER)

分布式系统唯一id生成方法汇总

雪花算法:snowflake是Twitter开源的分布式ID生成算法,结果是一个long型的ID。其核心思想是:使用41bit作为毫秒数,10bit作为机器的ID(5个bit是数据中心,5个bit的机器ID),12bit作为毫秒内的流水号(意味着每个节点在每毫秒可以产生 4096 个 ID),最后还有一个符号位,永远是0。具体实现的代码可以参看 https://github.com/twitter/snowflake。雪花算法支持的TPS可以达到419万左右(2^22*1000)。

雪花算法在工程实现上有单机版本和分布式版本。单机版本如下,分布式版本可以参看美团leaf算法:https://github.com/Meituan-Dianping/Leaf

主键自增

1.实体类上:@TableId(type = IdType.AUTO)

2.数据库字段一定要设置为自增

在这里插入图片描述

测试:

查看自增量

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述其余的源码解释:

public enum IdType {

AUTO(0),//数据库ID自增

NONE(1),//未设置主键INPUT(2),//手动输入

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

UUID(4),//全局唯一ID UUID

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

}

一般手动就必须配置id,注意:此时的数据库字段不能设置为自增

@TableId(type = IdType.INPUT)

user.setId(7L);

修改

//测试修改

@Test

void testUpdate() {

User user = new User();

//通过条件自动拼接动态SQL

user.setId(6L);

user.setName(“哈哈学mybatis_plus2”);

user.setAge(20);

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

int i = userMapper.updateById(user);

System.out.println(i);

}

在这里插入图片描述

自动填充

在这里插入图片描述

方式一:数据库级别(不建议使用)

1.在表新增字段 create_time ,update_time

在这里插入图片描述

2.在此测试更新,需要先把实体类同步

@Data

@NoArgsConstructor

@AllArgsConstructor

public class User {

//ID_WORKER 全局唯一ID ;AUTO:自增

@TableId(type = IdType.INPUT)

private Long id;

private String name;

private Integer age;

private String email;

@DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)

private Date createTime;

@DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)

private Date updateTime;

}

3.测试

@SpringBootTest

class MybatisPlusApplicationTests {

@Autowired//远程注入 继承了BaseMapper,所有的方法都来自于父类

private UserMapper userMapper;

@Test

public void contextLoads() {

//参数 wrapper ,条件构造器

List users = userMapper.selectList(null);

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

}

//测试新增(插入)

@Test

public void testInsert(){

// SimpleDateFormat simpleDateFormat = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);//设置日期格式

User user = new User();

user.setId(6L);

user.setName(“狂神”);

user.setAge(16);

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

// user.setCreateTime(simpleDateFormat.format(new Date()));

user.setCreateTime(new Date());

user.setUpdateTime(new Date());

int result = userMapper.insert(user);

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

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

}

//测试修改

@Test

public void testUpdate(){

User user = new User();

user.setId(6L);

user.setName(“关注狂神说”);

user.setAge(18);

//这里注意:并没有设置修改的时间,起作用的是数据库勾选的更新

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

int i= userMapper.updateById(user);

System.out.println(i);

}

}

演示结果

在这里插入图片描述

方式二:代码级别

1.删除数据库的默认值,更新操作

在这里插入图片描述

2.实体类字段属性上需要增加注解

@Data

@NoArgsConstructor

@AllArgsConstructor

public class User {

//ID_WORKER 全局唯一ID ;AUTO:自增【数据库记得id要设置自增!!!】

@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;

// @DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)

// private Date createTime;

// @DateTimeFormat(pattern = “yyyy-MM-dd HH:mm:ss”)

// private Date updateTime;

}

3.编写处理器来处理这个注解

package com.hh.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.util.Date;

@Slf4j //日志

@Component //把处理器加入到IOC容器中

public class MyMetaObjectHandler implements MetaObjectHandler {

//插入时的填充策略

@Override

public void insertFill(MetaObject metaObject) {

log.info(“start insertFill …”);

// setFieldValByName(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 updateFill …”);

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

}

}

4.测试插入和修改

//测试新增(插入)

@Test

public void testInsert(){

User user = new User();

user.setName(“哈哈学mybatis-plus”);

user.setAge(8);

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

user.setCreateTime(new Date());

user.setUpdateTime(new Date());

int result = userMapper.insert(user);

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

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

}

//测试修改

@Test

public void testUpdate(){

User user = new User();

user.setId(7L);

user.setName(“五哈”);

user.setAge(18);

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

int i= userMapper.updateById(user);

System.out.println(i);

}

插入演示:

在这里插入图片描述

修改演示:

在这里插入图片描述

乐观锁处理

在这里插入图片描述

乐观锁学习

乐观锁实现方式:

取出记录时,获取当前 version

更新时,带上这个 version

执行更新时, set version = newVersion where version = oldVersion

如果 version 不对,就更新失败

在这里插入图片描述

测试一下Mybatis_plus【MP】的乐观锁插件

1.给数据库添加 version 字段

在这里插入图片描述

在这里插入图片描述

2.同步实体类字段

@Version //乐观锁注解

private Integer version;

3.注册组件

主启动类可以把扫描包的工作交给config

//@MapperScan(“com.hh.mapper”) //扫描包

@SpringBootApplication

public class MybatisPlusApplication {

public static void main(String[] args) {

SpringApplication.run(MybatisPlusApplication.class, args);

}

}

组件

@MapperScan(“com.hh.mapper”) //扫描包

@EnableTransactionManagement//自动管理事务注解

@Configuration//配置类

public class MyBatisPlusConfig {

@Bean

public OptimisticLockerInterceptor optimisticLockerInterceptor(){

return new OptimisticLockerInterceptor();

}

}

4.测试

//测试乐观锁–成功

@Test

public void testOptimisticLocker(){

//1.查询用户信息 2.修改用户信息 3.执行更新操作

User user = userMapper.selectById(1L);

user.setName(“hhhhhhhh”);

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

userMapper.updateById(user);

}

//测试乐观锁–失败 【多线程下】

@Test

public void testOptimisticLocker2(){

//1.查询用户信息 2.修改用户信息 3.执行更新操作

//线程1

User user1 = userMapper.selectById(1L);

user1.setName(“线程1”);

user1.setEmail(“86412858545@qq.com”);

//线程2(模拟插队操作)

User user2 = userMapper.selectById(1L);

user2.setName(“线程2”);

user2.setEmail(“86412858545@qq.com”);

userMapper.updateById(user2);

//如果没有乐观锁就会覆盖插队线程的值

userMapper.updateById(user1);

}

在这里插入图片描述

在这里插入图片描述

多线程:

在这里插入图片描述

查询操作

//测试 —查询

@Test

public void selectById(){

User user = userMapper.selectById(1L);

System.out.println(user);

}

//测试批量查询

@Test

public void selectByBatchId(){

//参数 wrapper ,条件构造器

List users = userMapper.selectBatchIds(Arrays.asList(1,2,3));

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

}

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

//按条件查询之一-----map操作

@Test

public void selectByBatchIds(){

HashMap<String, Object> map = new HashMap<>();

//自定义要查询

map.put(“name”,“关注狂伸说”);

map.put(“age”,18);

List users = userMapper.selectByMap(map);

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

}

在这里插入图片描述

分页查询

在这里插入图片描述

如何使用?

分页代码官网参考

1.配置拦截器组件即可 ( 在MyBatisPlusConfig配置类中添加)

// 分页------旧版

@Bean

public PaginationInterceptor paginationInterceptor() {

return new PaginationInterceptor();

}

// 最新版

@Bean

public MybatisPlusInterceptor mybatisPlusInterceptor() {

MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();

interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.H2));

return interceptor;

}

2.直接使用page对象即可

在这里插入图片描述

在这里插入图片描述

//测试分页查询

@Test

public void testPage(){

//current:当前页;size:页面大小(页面条数)

Page page = new Page<>(1,5);

userMapper.selectPage(page,null);

page.getRecords().forEach(System.out::println);

System.out.println(page.getTotal());

}

删除操作

@Test

public void deleteById(){

userMapper.deleteById(7L);

}

//删除----通过id批量删除数据

@Test

public void deleteBatchId(){

userMapper.deleteBatchIds(Arrays.asList(6L,5L));

}

//删除----通过map删除数据

@Test

public void deleteMap(){

HashMap<String, Object> map = new HashMap<>();

map.put(“name”,“关注狂神说”); //自定义要删除的数据

userMapper.deleteByMap(map);

}

在这里插入图片描述

逻辑删除

区别:物理删除是真正的删除,再也找不到这个文件了。

逻辑删除并没有真正的删除掉,可以重新恢复,类似于回收站,还可以再找回数据

物理删除:真实删除。将对应数据从数据库中删除,之后查询不到此条被删除数据;

逻辑删除:假删除。在数据库中没有被移除,而是通过改变一个变量来让它失效!!!!

例如:delete=0;delete=1

管理员可以查看被删除的数据,防止数据的丢失

测试一下:

1.数据库新增字段 deleted(逻辑删除)

在这里插入图片描述

2.实体类同步数据(实体类字段上加上@TableLogic注解)

@TableLogic //逻辑删除

private Integer deleted;

3.在MyBatisPlusConfig配置类添加组件 ,注入bean

//逻辑删除组件

@Bean

public ISqlInjector sqlInjector(){

return new LogicSqlInjector();

}

4.在application.properties里面配置逻辑删除的设定(或者用application.yml)

逻辑删除官网参考

application.properties

#逻辑删除 (0-没有被删除,1-删除)

mybatis-plus.global-config.db-config.logic-delete-value=1

mybatis-plus.global-config.db-config.logic-not-delete-value=0

application.yml

mybatis-plus:

global-config:

db-config:

logic-delete-value: 1 # 逻辑已删除值(默认为 1)

logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

5.测试

在这里插入图片描述

在这里插入图片描述

性能分析插件


性能分析插件参考博客

作用:性能分析拦截器,用于输出每条sql语句及其执行的时间

mybatis-plus(MP)也提供了性能分析插件,如果超过之歌时间就停止运行

1.导入插件

//性能分析插件——————sql执行效率插件

@Bean

@Profile({“dev”,“test”})

public PerformanceInterceptor performanceInterceptor() {

PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();

// 在工作中,不允许用户等待 (分别测试 1ms:1毫秒 1000ms:1秒)

performanceInterceptor.setMaxTime(1000); // ms 设置sql执行的最大s时间,如果超过了则不执行

performanceInterceptor.setFormat(true); // 是否进行格式化

return new PerformanceInterceptor();

}

注意:要在springboot中配置环境为dev环境或者test环境

#设置开发的环境 application.properties或者 application.yml

spring.profiles.active=dev

完结

Redis基于内存,常用作于缓存的一种技术,并且Redis存储的方式是以key-value的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。

Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。

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

需要这份系统化的资料的朋友,可以点击这里获取

mg.cn/60a1037cd8ba4189a7c8625a66649afc.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5pyo5p6X5qOu5bG_5Z-O,size_20,color_FFFFFF,t_70,g_se,x_16)

性能分析插件


性能分析插件参考博客

作用:性能分析拦截器,用于输出每条sql语句及其执行的时间

mybatis-plus(MP)也提供了性能分析插件,如果超过之歌时间就停止运行

1.导入插件

//性能分析插件——————sql执行效率插件

@Bean

@Profile({“dev”,“test”})

public PerformanceInterceptor performanceInterceptor() {

PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();

// 在工作中,不允许用户等待 (分别测试 1ms:1毫秒 1000ms:1秒)

performanceInterceptor.setMaxTime(1000); // ms 设置sql执行的最大s时间,如果超过了则不执行

performanceInterceptor.setFormat(true); // 是否进行格式化

return new PerformanceInterceptor();

}

注意:要在springboot中配置环境为dev环境或者test环境

#设置开发的环境 application.properties或者 application.yml

spring.profiles.active=dev

完结

Redis基于内存,常用作于缓存的一种技术,并且Redis存储的方式是以key-value的形式。Redis是如今互联网技术架构中,使用最广泛的缓存,在工作中常常会使用到。Redis也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一,因此作为Java开发者,Redis是我们必须要掌握的。

Redis 是 NoSQL 数据库领域的佼佼者,如果你需要了解 Redis 是如何实现高并发、海量数据存储的,那么这份腾讯专家手敲《Redis源码日志笔记》将会是你的最佳选择。

[外链图片转存中…(img-9WV2sNMZ-1715352323932)]

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

需要这份系统化的资料的朋友,可以点击这里获取

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值