狂神说---MyBatisPlus学习

}

}

使用(测试类)

@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

2.测试使用

在这里插入图片描述

在这里插入图片描述

条件查询器Wrapper


条件查询器Wrapper

测试类

package com.hh;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

import com.hh.mapper.UserMapper;

import com.hh.pojo.User;

import org.junit.jupiter.api.Test;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

import java.util.Map;

/*

条件查询器–Wrapper–测试类

*/

@SpringBootTest

public class WrapperTest {

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

private UserMapper userMapper;

//查询name、email不为空,且年龄》=12的用户

@Test

void contextLoads() {

//参数 wrapper ,条件构造器

QueryWrapper wrapper = new QueryWrapper<>();

wrapper.isNotNull(“name”).isNotNull(“email”).ge(“age”,“12”);

userMapper.selectList(wrapper).forEach(System.out::println);

}

//查询名字“五哈"

@Test

public void test2(){

QueryWrapper wrapper = new QueryWrapper<>();

wrapper.eq(“name”,“五哈”);

User user = userMapper.selectOne(wrapper);//查询一个数据用 selectOne,多个用list 或map

System.out.println(user);

}

//查询年龄在20-30之间的

@Test

public void test3(){

QueryWrapper wrapper = new QueryWrapper<>();

wrapper.between(“age”,20,30);

Integer count = userMapper.selectCount(wrapper);

System.out.println(count);

}

//模糊查询(名字不包含e ,邮箱以 t 开头的)

@Test

public void test4(){

QueryWrapper wrapper = new QueryWrapper<>();

//likeRight(t%) 以 t 开头的

// likeLeft(%t) 以 t 结尾的

wrapper.notLike(“name”,“e”).likeRight(“email”,“t”);//SELECT id,name,age,email,version,deleted,create_time,update_time FROM user WHERE deleted=0 AND name NOT LIKE ? AND email LIKE ?

List<Map<String, Object>> maps = userMapper.selectMaps(wrapper);

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

}

//嵌套查询(可以插入自己写的SQL语句)

@Test

public void test5(){

QueryWrapper wrapper = new QueryWrapper<>();

wrapper.inSql(“id”,“select id from user where id<3”);

List objects = userMapper.selectObjs(wrapper);

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

}

//排序—通年龄进行排序(升序 :orderByAsc() ;降序 :orderByDesc())

@Test

public void test6(){

QueryWrapper wrapper = new QueryWrapper<>();

wrapper.orderByDesc(“age”);

List users = userMapper.selectList(wrapper);

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

}

}

测试一:

在这里插入图片描述

测试二:

在这里插入图片描述

后面的测试自己试验看结果

代码自动生成器


代码生成器(旧)

代码生成器(新)

AutoGenerator 是 MyBatis-Plus 的代码生成器,通过 AutoGenerator 可以快速生成 Entity、Mapper、Mapper XML、Service、Controller 等各个模块的代码,极大的提升了开发效率。

准备条件 :1.pom.xml配置包、2.application.properties配置、3.MyBatisPlusConfig配置类,4.自备数据库 然后就可以进行测试了

pom.xml

<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd”>

4.0.0

org.springframework.boot

spring-boot-starter-parent

2.6.2

com.hh

hh-community

0.0.1-SNAPSHOT

hh-community

何何学代码生成器

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

com.alibaba

fastjson

1.2.48

com.baomidou

mybatis-plus-boot-starter

3.0.5

org.apache.velocity

velocity-engine-core

2.0

com.alibaba

druid

1.1.12

log4j

log4j

1.2.17

org.projectlombok

lombok

io.springfox

springfox-swagger2

2.7.0

io.springfox

springfox-swagger-ui

2.7.0

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

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

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

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

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

架构学习资料

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

准备两个月,面试五分钟,Java中高级岗面试为何越来越难?

由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
endency>

org.projectlombok

lombok

io.springfox

springfox-swagger2

2.7.0

io.springfox

springfox-swagger-ui

2.7.0

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

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

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

[外链图片转存中…(img-p1hDYIo1-1713755634236)]

[外链图片转存中…(img-ZaQ3PJ2V-1713755634237)]

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

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

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

架构学习资料

[外链图片转存中…(img-FeVpQB0R-1713755634237)]

[外链图片转存中…(img-BxiJG36k-1713755634237)]

[外链图片转存中…(img-hEGsw3CY-1713755634237)]

[外链图片转存中…(img-2gS0kN81-1713755634238)]

[外链图片转存中…(img-8jjseSc2-1713755634238)]

由于篇幅限制小编,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值