自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(114)
  • 问答 (1)
  • 收藏
  • 关注

原创 深入理解 Java 中 synchronized 的使用和锁升级

JVM 会在当前线程的栈帧中创建一个锁记录(Lock Record),并将对象头中的 Mark Word 复制到锁记录中,然后尝试使用 CAS(Compare - And - Swap,比较并交换)操作将对象头的 Mark Word 替换为指向锁记录的指针。此后,当该线程再次访问同一对象的同步代码时,无需进行额外的加锁操作,直接进入同步代码块,因为 JVM 认为该线程很可能会再次访问。也就是说,当一个线程进入该方法时,会自动获取当前对象的锁,其他线程想要进入该方法,必须等待当前线程释放锁。

2025-02-14 13:50:58 648

原创 银行家算法

银行家算法(Banker’s Algorithm)是由艾兹格・迪杰斯特拉(Edsger Dijkstra)在 1965 年为解决死锁问题而提出的一种资源分配和死锁避免算法。它的命名源于银行系统的资金借贷模型,银行家需要在满足客户贷款需求的同时,确保自身资金的安全,避免出现无法满足所有客户需求的情况,对应到操作系统中,就是避免进程因资源分配不当而产生死锁。

2025-02-12 21:54:31 503

原创 操作系统中的任务调度算法

任务 A 需要执行 10 个时间单位,B 需要执行 3 个时间单位,C 需要执行 7 个时间单位。A 先在 Q1 队列执行 2 个时间单位,未完成降入 Q2 队列,在 Q2 队列执行 4 个时间单位后又降入 Q3 队列;假设有任务 A、B、C,时间片大小设为 2。A 需要执行 5 个时间单位,B 需要执行 3 个时间单位,C 需要执行 2 个时间单位。执行顺序可能为 A(2 时间单位)、B(2 时间单位)、C(2 时间单位)、A(2 时间单位)、B(1 时间单位)、A(1 时间单位)。

2025-02-12 21:52:41 876

原创 java中的128陷阱

在这之前我们需要补充一下java中的装箱与拆箱的概念在 Java 中,装箱和拆箱是基本数据类型与对应的包装类之间相互转换的机制。

2025-02-06 20:49:49 281

原创 vue的介绍

Vue(读音/vjuː/,类似于view)是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue被设计为可以自底向上逐层应用。Vue的核心库只关注视图层,不仅易于上手,还便于与第三方库或既有项目整合。另一方面,当与现代化的工具链以及各种支持类库结合使用时,Vue也完全能够为复杂的单页应用提供驱动。## 2.起步尝试Vue.js最简单的方法是使用HelloWorld例子。你可以在浏览器新标签页中打开它,跟着例子学习一些基础用法。或者你也可以创建一个.html文件。

2025-01-18 19:50:07 699

原创 四、常用注解

而对于一些简单的表,即使存储数据超过1亿行,也可以不分表。①同样以用户ID为例,假如我们一开始就规划了10个数据库表,可以简单地用user_id%10的值来表示数据所属的数据库表编号,ID为985的用户放到编号为5的子表中,ID为10086的用户放到编号为6的子表中。②复杂点:分段大小的选取。首先是一个符号位,1bit标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0。

2025-01-18 19:47:41 688

原创 三、基本CRUD

通过观察BaseMapper中的方法,大多方法中都有Wrapper类型的形参,此为条件构造器,可针对于SQL语句设置不同的条件,若没有条件,则可以为该形参赋值null,即查询(删除/修改)所有数据。MyBatis-Plus中有一个接口IService和其实现类ServiceImpl,封装了常见的业务层逻辑。b>根据多个id查询多个用户信息。c>通过map条件查询用户信息。c>通过map条件删除记录。b>通过id批量删除记录。a>根据id查询用户信息。a>通过id删除记录。

2025-01-18 19:45:05 201

原创 二、MybatisPlus的入门案例

BaseMapper是MyBatis-Plus提供的模板mapper,其中包含了基本的CRUD方法,泛型为操作的实体类型。IDEA在userMapper处报错,因为找不到注入的对象,因为类是动态创建的,但是程序可以正确的执行。在SpringBoot启动类中添加@MapperScan注解,扫描mapper包。为了避免报错,可以在mapper接口上添加@Repository注解。a>配置application.yml。c>idea中安装lombok插件。d>添加mapper。

2025-01-18 19:43:37 215

原创 七、Mybatisplus中的通用枚举

表中的有些字段值是固定的,例如性别(男或女),此时我们可以使用MyBatis-Plus的通用枚举来实现。(a)数据库表中添加字段sex。(b)创建通用枚举类型。

2025-01-18 19:19:49 125

原创 六、MybatisPlus中的插件

(a)UserMapper中定义接口方法//自定义方法,分页查询用户信息,并返回自定义的Vo对象(b)UserMapper.xml中编写SQL--SQL片段,记录基础字段-->--></select></mapper>©测试@Autowired@Test//设置分页参数//获取分页数据System.out.println("当前页:"+page.getCurrent());System.out.println("每页显示的条数:"+page.getSize());

2025-01-18 19:18:19 366

原创 一、 MyBatis-Plus简介

MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。Mybatis-Plus提供了通用的Mapper和Service,可以在不编写任何SQL语句的前提下,快速的实现单表的增删改查(CURD),批量,逻辑删除,分页等操作。只要把MyBatis-Plus的特性到优秀插件,以及多数据源的配置进行详细讲解。愿景:我们的愿景是成为MyBatis最好的搭档,就像魂斗罗中的1P、2P,基友搭配,效率翻倍。

2025-01-18 19:16:23 225

原创 ES6的基础使用

script>//var声明的变量往往会越域//let声明的变量有严格局部作用域vara=1;letb=2;//1//var可以声明多次//let只能声明一次varm=1varm=2letn=3//var会变量提升//let不存在变量提升varx=10;lety=20;//1.声明之后不允许改变//2.一但声明必须初始化,否则会报错a=3;test2();</script>

2025-01-18 19:14:37 142

原创 ES6中的var let const的区别

sex:'男'运行上述代码,发现person对象的name属性确实被修改了,这是怎么回事呢?因为对象是引用类型的,person中保存的仅是对象的指针,这就意味着,const仅保证指针不发生改变,修改对象的属性不会改变对象的指针,所以是被允许的。也就是说const定义的引用类型只要指针不发生改变,其他的不论如何改变都是允许的。然后我们试着修改一下指针,让person指向一个新对象,果然报错sex:'男'person={sex:'男'

2025-01-18 19:13:45 252

原创 五.条件构造器和常用借口

Wrapper : 条件构造抽象类,最顶端父类​ AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件QueryWrapper : 查询条件封装UpdateWrapper : Update 条件封装AbstractLambdaWrapper : 使用Lambda 语法LambdaQueryWrapper :用于Lambda语法使用的查询WrapperLambdaUpdateWrapper : Lambda 更新封装Wrapper函数名说明。

2025-01-15 17:07:57 779

原创 mybatis中的多对多映射关系处理(包含具体例子)

们在创建实体类的时候就需要使用 List 集合接收我们的结果。举例:商品表<—>连接表(中间表)<—>订单表,用户在购买商品的时候,需要获取到商品的id,同时。下订单时也会有一个订单的id,那么如何将这两个属性连接起来,我们需要一个中间表,存储这两种。那么我们可以通过商品的id查询订单,也可以通过订单id查询商品。因为是多对多的关系,在查询的时候,商品会有多个查询结果,订单同样也会有多个查询结果,那么我。以,因为是多对多的关系,我们无论是对商品进行查询得到商品被多少订单购买还是对订单进行查询得。

2025-01-11 14:40:03 287

原创 mybatis中的多对一以及多对多映射关系处理(包含具体例子)

我们如果想使用级联,那么就需要在 Emp 实体类中去创建 Dept 对象,我们才可以通过级联的方式去拿到对应的属性进行查询。与一对一映射关系不通的是,多对一查询使用的标签为: collection ,但是总体还是差不多的,因为。一对多的映射有点不同,因为一个部门对应多个员工,那么我们在获取到查询结果的时候就需要用List集。然有多个员工对应一个部门,但是我们每次查询的时候(通过id)只能是看一个员工的信息,所以其实。在多对一的关系中,我们查找的其实还是一对一的关系,为什么这么说?

2025-01-11 14:35:04 301

原创 mybatis中的多表查询(一对一映射关系包含具体例子)

查询的语句还是不变,使用多表查询,只不过我们在 association 标签中指定了我们的 idCard 对象,使用自定义的映射关系,将 idCard 对象中的属性映射到 idcard 表中的列名,使用多表查询的方式,这。字面意思,分步写我们的sql语句进行查询,现在person表中查询id,再通过查询到的结果中的card_id。这种方式就不需要一层层的去关联属性,我们利用association标签,可以直接指定我们的列名和对应的。(外键)继续到idcard表中查询对应的code,最后返回最终的查询结果。

2025-01-09 17:06:04 277

原创 mybatis中的一些特殊操作

目录1.mybatis中的一些特殊操作1.1批量删除1.2动态获取表名1.3添加功能获取自增主键1.4自定义映射resultMap1.mybatis中的一些特殊操作1.1批量删除/*** 批量删除用户信息*/Integer deleteUserByIds(String ids);<!-- 批量删除用户信息 --><delete id="deleteUserByIds">delete from user where id in (${ids})</delet

2025-01-09 16:58:42 666

原创 MyBaits中的各种查询功能

这里我们获取的就是那个外层的 Map ,所以在写测试方法的数据类型的时候注意 Key 的类型,要和你在注解中定义的主键的类型一致。这个注解会将我们的 Map 集合包装在一个更大的 Map 集合中,但是需要我们去指定主键,这里我们。这个其实也不难,就是将查询的对象类型换成了 List 集合,在查询整个数据库中的数据信息时会用。一个 User 对象只能存储一条数据,那么这里就提示我们找到了11条相关数据,并反馈给我们这个。所以我们将返回类型修改为一个 List 集合,就可以存储多条相同类型的数据。

2025-01-09 09:28:42 285

原创 java中的监听器Listener

在JavaWeb被监听的事件源为:ServletContext、HttpSession、ServletRequest,即三大域对象。监听域对象“创建”与“销毁”的监听器;监听域对象“操作域属性”的监听器;监听HttpSession的监听器。

2025-01-09 09:11:50 365

原创 java中的过滤器 Filter

Filter的三个方法:void init(FilterConfig):在Tomcat启动时被调用;void destroy():在Tomcat关闭时被调用;void doFilter(ServletRequest,ServletResponse,FilterChain):每次有请求时都调用该方法;FilterConfig类:与ServletConfig相似,用来获取Filter的初始化参数。

2025-01-09 09:06:47 1429 1

原创 八大排序-插入排序

插入排序(英语:Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

2025-01-09 08:54:06 102

原创 八大排序-快速排序

​。

2025-01-09 08:53:58 619

原创 选择排序-堆排序

①:0号节点是最大值,我们将它与最后一个节点交换位置​②:此时的堆不是大顶堆需要重现构建​③:再次调整,index = 1 ,此时 下标为1的值为5,值大于左右子树,所以 index -1 ,此时值为1.然后需要进行交换​ 交换完成之后,发现1号节点不再大于其子节点了,所有需要在交换一次​④:交换后的结果是​⑤:0号节点是最大值,我们将它与最后一个节点交换位置​。

2025-01-09 08:53:52 830

原创 八大排序-希尔排序

希尔排序也是一种。

2025-01-09 08:53:35 199

原创 八大排序-归并排序

我们将指针s1的范围锁定在 s1<=min ,将指针s2的范围锁定在s2<=high,我们可以比较s1和s2当前指向的值的大小,将小的一方放入到临时数组当中去,直到s1或s2一方指向为空,那么就可以将另一方全部放入到临时数组当中去。首先我们需要弄清楚,我们这里所谓的分离其实是概念意义上的,在我们的数组结构上其实并没有分离,而且由于回溯的原因 5,6 , 1 , 3是其实和上边是对应的关系,如图所示。下边我们为了演示选择了 5,6 , 1 , 3的合并过程。下边我们来一步一步的展示整个合并的过程,

2025-01-09 08:53:24 393

原创 八大排序-基数排序

我们回想一下我们小时候是怎么学习比较数字大小的?我们是先比位数,如果一个位数比另一个位数多,那这个数肯定更大。如果位数同样多,就按位数递减依次往下进行比较,哪个数在这一位上更大那就停止比较,得出这个在这个位上数更大的数字整体更大的结论。

2025-01-09 08:53:13 129

原创 数据结构-递归算法

​。

2025-01-09 08:53:02 234

原创 springbot数据层开发

修改spring.datasource.type=com.alibaba.druid.pool.DruidDataSource。Springboot中提供了JdbcTemplateAutoConfiguration的自动配置。我们同样可以在mybatis的接口上不加@Mapper注解,通过扫描器注解来扫描。让我们使用yaml方式配置,创建application.yaml。在application.yaml中配置mybatis的信息。Mapper接口存放在cn.tx.mapper下。

2025-01-09 08:52:44 913

原创 选择排序--简单选择排序

第二次从arr[1]到arr[n-1]中选取最小值,与arr[1]交换,第三次从arr[2]到arr[n-1]中选取最小值,与arr[2]交换,…,第i次从arr[i-1]arr[n-1]中选取最小值,与arr[i-1]交换,…, 第n-1次从arr[n-2]~arr[n-1]中选取最小值,与arr[n-2]交换,总共通过n-1次,得到一个按排序码从小到大排列的有序序列。选择排序(select sorting)也是一种简单的排序方法。

2024-12-29 14:35:58 196

原创 java中的多线程

首先我们新建一个类ThreadNew​。

2024-12-29 14:31:52 610

原创 java中的继承

​。

2024-12-29 14:31:45 665

原创 java中的多态

我们先来了解一个业务背景:请设计一个系统,描述主人喂养宠物的场景,首先在这个场景当中应该有“宠物对象”,宠物对象应该有一个吃的行为,另外还需要一个“主人对象”,主人对象应该有一个喂的行为,请看代码://宠物狗​//主人​​测试类​运行结果如下图所示:​ 以上程序编译和运行都很正常,输出结果也是对的,那么存在什么问题吗?假设后期用户提出了新的需求,软件可能面临着功能扩展,这个扩展会很方便吗?假设现在主人家里又来了一个宠物猫,那该怎么办呢?在以上代码的基础之上,新增了一个Cat类,来表示宠物猫,这个

2024-12-29 14:31:37 607

原创 java中的final关键字

这里以String类为例​。

2024-12-29 14:31:29 291

原创 java中的抽象类

假设你的公司要进行招聘,招聘2名产品经理,10名程序员,现在让你和小A设计这个网站让报名人员填写基本信息。大概有两种设计方式----。小A的设计方法:​但是我们发现这两个页面基本上内容是相同的,于是你的设计方法是这样的:​我们将一些相同的信息都提取到一起我们把这个过程叫做----抽象。

2024-12-29 14:31:23 338

原创 Object类,所有类的父类

因为我们认为两个对象即使不是指向的同一块内存,只要这两个对象的各个字段属性值都相同,那么就认为这两个对象是同一个对象。可以认为利用哈希表也能起到一定的判重的作用,但是现实是可能存在哈希冲突,即使是两个不同的对象,他们的哈希值也可能相同,如何解决哈希冲突,这里就略略略了。如果两个对象的hashCode相同(存在哈希冲突),那么它们可能相同也可能不同(即equals比较可能是false也可能是true)如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相 同!

2024-12-29 14:31:13 524

原创 java中的对象包装类与自动装箱

答案就在Integet的valueOf()方当中,如果我们的数值在-128-127之间的数值都存储在有一个catch数组当中,该数组相当于一个缓存,当我们在-128-127之间进行自动装箱的时候,我们就直接返回该值在内存当中的地址,所以在-128-127之间的数值用==进行比较是相等的。我们知道这个的执行过程中,最开始是一个叫javac的编译器将.java文件编译称为.class的文件,在这个过程当中我们写的程序。从上边的图当中我们看到了一个不寻常的现象,就是一个int类型的值赋给了对象类型的变量。

2024-12-29 14:31:01 284

原创 java中的接口

1.接口的方法默认是 public,所有方法都是抽象方法,在接口中不能有实现(Java 8 开始接口方法可以有默认实现),抽象类可以有非抽象的方法。5.接口不能用 new 实例化,但可以声明,但是必须引用一个实现该接口的对象 从设计层面来说,抽象类是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。2.接口中的实例变量默认是 final 类型的,而抽象类中则不一定。4.一个类实现接口的话要实现接口的所有方法,而抽象类不一定。接口回调:先有接口的使用者,后有接口的实现者。定义三个实现接口的类。

2024-12-29 14:30:50 178

原创 lamdba表达式

在数学中,函数是有输入量和输出量的一套计算方案,就是拿“数据做操作”在面向对象的编程中强调,必须通过对象的形式来做事情函数式思想则尽量的忽略对象的复杂语法,“强调做什么,而不是以什么形式去做”lambda表达式就是函数式思想的体现。

2024-12-29 14:30:42 374

原创 java中的反射

(1)Java反射机制的核心是在程序运行时动态加载类并获取类的详细信息,从而操作类或对象的属性和方法。本质是JVM得到类对象之后,再通过类对象进行反编译,从而获取对象的各种信息。(2)Java属于先编译再运行的语言,程序中对象的类型在编译期就确定下来了,而当程序在运行时可能需要动态加载某些类,这些类因为之前用不到,所以没有被加载到JVM。通过反射,可以在运行时动态地创建对象并调用其属性,不需要提前在编译期知道运行的对象是谁。

2024-12-29 14:30:27 1070

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除