狂神说---MyBatisPlus学习,电商秒杀java面试题目

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

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

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

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注Java)
img

正文

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

PRIMARY KEY (id)

);

2.新增数据进表

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

}

最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们:

目录:

二面蚂蚁金服(交叉面),已拿offer,Java岗定级阿里P6

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

二面蚂蚁金服(交叉面),已拿offer,Java岗定级阿里P6

Java面试核心知识点

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
A5pyo5p6X5qOu5bG_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();

}

最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们:

目录:

[外链图片转存中…(img-jwlAUC9U-1713478308327)]

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

[外链图片转存中…(img-Q9HcCN6a-1713478308328)]

Java面试核心知识点

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-jzNwl1XL-1713478308329)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值