自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(207)
  • 收藏
  • 关注

原创 【Spring】_Spring事务与事务传播机制

由于id作为主键采取了自增方式,而此时第二次执行insert操作后id为2,说明第一次执行insert也执行成功,但事务回滚,故数据表user_info中又删除了id=1的用户信息;现已验证,使用@Transactional进行编程式事务管理时,当接口内部抛出运行时异常,或接口内部抛出异常并未捕获、抛出异常捕获但未正确处理时,都会导致事务回滚。编程式事务与声明式事务的不同体现在controller中,不同的事务类型将创建不同的Controller,稍后完成controller对service的调用。

2025-03-07 13:14:19 1201

原创 【Spring AOP】_静态代理与动态代理

Spring AOP是基于动态代理实现的。本文使用房屋、房东、中介模型介绍代理模式以及静态代理与动态代理。

2025-03-06 16:16:34 984

原创 【Spring AOP】_切点类的切点表达式

在aspect包下创建MyAspect注解类:// 表示该注解用于标注方法// 表示该注解声明周期在程序执行时有效。

2025-03-05 20:25:46 780

原创 【Spring AOP】_使用注解编写AOP程序

现aspect包下由AspectDemo、AspectDemo1、AspectDemo2三个切面类,并在每个切面类中实现@Before通知和@After通知。(2)在当前类中,若在其类中实现的切点需要在其他类中使用,则切点必须以public修饰。上述使用方法中,在使用对应注解标注通知方法时,需要重复编写公共切点表达式,这很不方便;@Around:环绕通知,此注解标注的通知方法在目标方法前、后都被执行。2、@Before:前置通知,此注解标注的通知方法在目标方法前被执行;

2025-03-05 19:33:08 855

原创 【软件测试】_selenium自动化测试:页面及窗口操作

在专栏前文中,已经介绍了对页面元素的操作,详见下文:【软件测试】_selenium自动化测试:定位元素与点击元素-CSDN博客【软件测试】_selenium自动化测试:操作页面元素的常用方法-CSDN博客对于WebElement类,可以通过该类及其成员方法获取并操作页面元素,但对于页面标题、URL等无法通过WebElement类相关方法获得。而实现了WebDriver接口的具体某一浏览器驱动类,如ChromeDriver,实例化后可通过该类型的对象对页面进行操作。

2025-03-04 18:19:48 810

原创 【软件测试】_selenium自动化测试:操作页面元素的常用方法

2、使用WebElement对象调用getText方法时无需传参,但调用getAttribute方法时需要传递使用的标签的对应属性名,如“百度一下”是input标签的value属性值,“百度热搜”是div标签的aria-label属性值;在打印热搜词条的文本时就使用到了getText方法,getText方法与getAttribute方法容易混淆,getAttribute方法用于获取页面元素的属性值,getText方法用于获取页面元素的文本。在上文中,已经实现了click方法对页面元素进行点击。

2025-03-03 14:49:10 1004

原创 【软件测试】_selenium自动化测试:定位元素与点击元素

在使用selenium实现百度搜索栏搜索关键词并查询的示例中,也调用了WebElement对象的click方法,对于绝大多数页面元素,都可以进行点击,不限制于type为submit的input标签。为了获取所有<li>标签对应的热搜词条的文本,将自动获取到的上述CSS位置删除:nth-child(1),2. 关于cssSelector方法的参数,#kw和#su,就是元素定位的CSS选择器使用方法。可见搜索栏对应的input标签的id为#kw,百度以下对应的input标签的id为#su;

2025-03-03 12:55:19 1135

原创 【软件测试】_使用selenium进行自动化测试示例

创建一个空项目用于进行selenium的自动化测试。

2025-03-02 15:07:18 503

原创 【SpringBoot】_统一功能处理:统一数据返回格式

仍以图书管理系统为例。为了实现后端方法返回给前端的数据都被封装为Result类型,若逐个修改封装会非常麻烦,接下来采用统一数据返回对现有方法进行处理。

2025-02-23 21:03:48 822 1

原创 【SpringBoot】_统一功能处理:拦截器

Slf4j@Component// 目标方法执行前执行@Overridelog.info("目标方法执行前");1、定义拦截器时,需要实现HandlerInterceptor接口;2、定义拦截器时,根据需要重写preHandle方法、postHandle方法和afterCompletion方法:(1)preHandle方法在目标方法执行前执行,返回类型为boolean类型,若返回true,表示放行,继续后续操作;若返回false,表示拦截成功;

2025-02-20 15:21:46 1261

原创 【Spring+MyBatis】_图书管理系统(下篇)

采用逻辑删除方式,即通过update操作实现,具体做法是将status置为0,令前端页面无法获取。但当前实现的updateBook方法仅支持一个id作为参数,即接口不可复用,需单独编写接口;同功能5的删除单个图书即单个更新图书状态的思路,批量删除图书就是批量更新图书状态;为空则表示删除成功,不为空则表示删除失败,并返回错误信息;为空则表示删除成功,不为空则表示删除失败,并返回错误信息;为空则表示删除成功,不为空则表示删除失败,并返回错误信息;可见id为5和6的图书的状态被置为0,且并未从数据库中删除;

2025-02-19 17:23:45 1344

原创 【Spring+MyBatis】_图书管理系统(中篇)

【Spring+MyBatis】_图书管理系统(上篇)-CSDN博客(1)当前页的内容records(类型为List);参数:userName=admin&&password=admin。1、前端发送给后端:(封装为对象:PageRequest)创建用户表user_info和图书表book_info;2、后端发送给前端:(封装为对象:PageResult)以上两句都表示从num2+1行开始返回num1行数据;输入账号admin和密码admin后,即可成功登录;响应:成功返回true,失败返回false。

2025-02-18 19:49:28 1183

原创 【Spring+MyBatis】_图书管理系统(上篇)

(1)当前页的内容records(类型为List<BookInfo>);参数:userName=admin&&password=admin。1、前端发送给后端:(封装为对象:PageRequest)创建用户表user_info和图书表book_info;2、后端发送给前端:(封装为对象:PageResult)以上两句都表示从num2+1行开始返回num1行数据;输入账号admin和密码admin后,即可成功登录;响应:成功返回true,失败返回false。请求:/User/login。

2025-02-17 21:28:32 1172

原创 【Spring+MyBatis】留言墙的实现

在Spring专栏中,已经实现了Spring MVC版的留言墙,详见下文:【SpringMVC】_SpringMVC实现留言墙_使用springmvc完成一个简单的留言板-CSDN博客1、请求:/message/publish2、参数:使用对象MessageInfo进行存储参数:3、响应:true/false;_使用springmvc完成一个简单的留言板该版本的消息存储采用了List<MessageInfo>存储,每次重启服务器就会导致信息丢失。本文基于上文,对表白墙系统进行持久化。

2025-02-16 16:00:42 948

原创 【MyBatis】_动态SQL

为实现传递参数个数的灵活选择,MyBatis可以使用动态SQL方式操作数据库。本文介绍为实现增删查改基本操作的常用标签。动态SQL方式也有注解方式和XML方式两种方式,本文采用XML方式,在增操作中进行注解方式的示例。

2025-02-15 14:31:14 877

原创 【MyBatis】预编译SQL与即时SQL

使用MyBatis进行数据库操作在进行参数传递时,有#{ } 与 ${ }两种方式。本文介绍两种方式的区别;

2025-02-14 18:04:05 1063

原创 【MyBatis】_MyBatis操作数据库进行查操作的结果映射

在专栏前文介绍基本查操作的全列查(select* from 表名)时,提到过由于对象属性和数据表字段名不一致而导致的无法正确查询的情况:使用select* from userinfo的测试结果:MyBatis会自动根据数据库的字段名和java对象的属性名进行映射,映射规则为名称一致,即如果名称一样就进行赋值,当名称不一致时就会匹配失败;本文介绍当数据表字段名与java对象属性名不一致时,采用和基于xml实现MyBatis进行结果映射的三种方式。

2025-02-14 12:19:37 1058

原创 【MyBatis】_使用XML实现MyBatis

MyBatis作为一个持久层框架,用于进行数据库操作。MyBatis的实现方式有两种:(1)注解;(2)XML;本文介绍基于XML实现MyBatis。

2025-02-13 17:22:53 1076

原创 【MyBatis】_MyBatis操作数据库进行删与改操作

在专栏前文,已经介绍了使用MyBatis进行数据库操作的基本步骤和查操作:【MyBatis】_以查询为例熟悉MyBatis操作数据库流程-CSDN博客在Spring项目中创建java对象,如果使用手动生成getter、setter、toString等方法提供调用接口,会导致代码修改成本与复杂度大大增加;接下来简单介绍lombok的使用方法;

2025-02-13 14:52:03 704

原创 【MyBatis】_MyBatis操作数据库进行增操作

专栏前文已经介绍MyBatis操作数据库的基本流程:【MyBatis】_以查询为例熟悉MyBatis操作数据库流程-CSDN博客在Spring项目中创建java对象,如果使用手动生成getter、setter、toString等方法提供调用接口,会导致代码修改成本与复杂度大大增加;接下来简单介绍lombok的使用方法;

2025-02-13 11:01:34 879

原创 【MyBatis】_以查询为例熟悉MyBatis操作数据库流程

在Spring项目中创建java对象,如果使用手动生成getter、setter、toString等方法提供调用接口,会导致代码修改成本与复杂度大大增加;接下来简单介绍lombok的使用方法;观察得到:由于在UserInfo中采用了小驼峰命名(deleteFlag、createTime与updateTime),这与数据库名及其字段名使用的蛇形命名(delete_flag、create_time与update_time)有所不同,故而在上述访问中可见这几个字段对应的数据并未被正确读出,值为null;

2025-02-12 14:39:46 826

原创 【Spring】_配置Spring日志

在官网中可查看到默认值:${LOG_FILE}.%d{yyyy-MM-dd}.%i.gzlogging:level:root: infocom:example:file:logback:重启程序查看目录处的日志文件名称格式:注:1、关于最大分割大小:日志文件的分割是以行来分割而不是以字符分割的。假设当前max-file-size设为1KB,并不是达到1KB就立即分割,会将本行日志存储后再进行分割;2、企业中通常日志分割大小为200M或500M;

2025-02-12 13:11:25 1073

原创 【Spring】_打印Spring日志

在当前打印日志的方法中,在打印日志的类中需创建一个logger对象,这使得打印日志时每次都需对一个类new 一个对象,较为麻烦。2、SLF4J是门面模式的典型应用,门面模式又称外观模式,提供了一个统一的接口,用来访问子系统中的一群接口,主要特征是定义了一个高层接口,让子系统更容易使用;注:1、日志对于系统运行信息的反映相对而言是滞后的,FATAL级已无法使用日志打印,故而只提供了其余四种级别的日志输出方法;1、SLF4J是一个日志框架,但SLF4J不是一个真实的日志框架实现,只是一个日志门面。

2025-02-11 13:30:25 730

原创 【数据结构】_堆的向上调整和向下调整建堆法

使以该结点为根结点的子树满足小根堆或大根堆特性。,然后调用向上调整方法使其满足大根堆或小根堆特性;

2025-02-11 12:07:01 456

原创 【数据结构】_堆排序问题

对于实现堆排序:1、若采用先建堆再排序的方法,则建大根堆实现降序,建小根堆实现升序;(通常不用)(1)这种方式需要调用HPPush方法,HPPush方法内部自行调用AdjustUp方法,并使用HPTop方法获取堆顶元素并逐个pop以实现降序或升序输出;(2)这种方式的空间复杂度为O(N);(较高)2、若采用不建堆直接排序的方法,则建大根堆实现升序,小根堆实现降序;(常用)

2025-02-10 14:26:02 1419

原创 【数据结构】_堆的实现

专栏前文中,已经介绍了入堆及向上调整算法,出堆及向下调整算法,详情见下文:实际对于整除运算parent = (child - 1) / 2,parent并不会小于0,但当parent=0时,若a[parent] > a[child],则再次进行child与parent的更新,使得parent与child均为0。当parent=0时,若若a[parent] > a[child],则再次进行child与parent的更新,使得child更新为0,下次则无法进入while循环;

2025-02-10 10:32:36 977

原创 【Spring】_SpringBoot的yml配置文件的读取

在上文中,已经介绍了SpringBoot项目中最常用的properties和yml配置文件的基本语法形式:【Spring】_SpringBoot配置文件-CSDN博客若需在项目中主动读取配置文件,可以使用@Value注解实现,使以"${ }"格式读取,示例如下:# 自定义配置启动程序,通过Chrome进行访问:可见配置文件成功读取;若需在项目中主动读取配置文件,可以使用@Value注解实现,使以"${ }"格式读取,示例如下:demo:启动程序,使用Chrome进行访问:可见配置文件成功读取;

2025-02-09 12:54:30 1622

原创 【数据结构】_堆的结构及向上、向下调整算法

实际对于整除运算parent = (child - 1) / 2,parent并不会小于0,但当parent=0时,若a[parent] > a[child],则再次进行child与parent的更新,使得parent与child均为0。当parent=0时,若若a[parent] > a[child],则再次进行child与parent的更新,使得child更新为0,下次则无法进入while循环;,删除最后一个结点后,再逐层调整父结点与子结点的大小关系,使其满足小根堆特性;(1)堆是完全二叉树;

2025-02-09 11:16:36 770

原创 【数据结构】_树与二叉树

2、除根节点外,其叶结点被分为M(M>0)个互不相交的集合T1,T2,T3...Tm,其中每一个集合Ti(1<=i<=m)又是一棵结构与树类型相似的子树,每棵树的根节点有且仅有一个前驱,可以有0个或多个后继;(11)结点的祖先:从根到该结点所经分支上的所有结点,如A是所有结点的祖先;(8)结点的层次:从根开始定义,根为第一层,根的子结点为第二层,以此类推;:含有子结点的结点,称该结点为其子结点的父结点,如A是B的父结点;:一个结点含有的子树的根节点称为该结点的子结点,如B是A的子结点;

2025-02-08 14:28:35 1094

原创 【数据结构】_栈与队列经典算法OJ:栈与队列的互相实现

队列:只允许在一端进行数据的插入操作,在另一端进行数据的删除操作的特殊线性表,队列具有先进先出FIFO(First In First Out)的特点。若top表示栈顶元素的下标,则初始化时(栈内无元素),top=-1,插入时在a[top++]处入栈元素;令要实现的队列入队列5、6,将其入栈到第一个栈,而后将第一个栈视为push栈,仅用于入数据;思路:依次从第一个栈出栈4、3、2,并令其入栈第二个栈,再出栈第一个栈的元素1即可;令第一个栈入栈1、2、3、4四个元素,此时队列要求出队1,但当前栈只能出栈4,

2025-02-08 11:28:19 1103

原创 【Spring】_SpringBoot配置文件

若需在项目中主动读取配置文件,可以使用@Value注解实现,使以"${ }"格式读取,示例如下:# 自定义配置启动程序,通过Chrome进行访问:可见配置文件成功读取;若需在项目中主动读取配置文件,可以使用@Value注解实现,使以"${ }"格式读取,示例如下:demo:启动程序,使用Chrome进行访问:可见配置文件成功读取;在yml配置的文件使用${ }进行读取时,需将配置文件中的冒号与空格更换为.;

2025-02-07 19:11:25 1133

原创 【数据结构】_队列经典算法OJ:循环队列

目录1. 题目描述及链接2. 解题思路2.1 循环队列的设计2.2 关于循环队列的假溢出问题3. 程序注:部分方法实现细节题目链接:622. 设计循环队列 - 力扣(LeetCode)题目描述:设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,

2025-02-07 13:02:28 746

原创 【数据结构】_栈与队列经典算法OJ:有效的括号

若top表示栈顶元素的下标,则初始化时(栈内无元素),top=-1,插入时在a[top++]处入栈元素;若top表示栈顶元素的下一个元素的下标,则初始化时top为0,插入时在a[top]处入栈元素。说明字符串中左括号比右括号多,则需对栈是否为空进行判断,若栈不为空,即字符串已遍历完毕,仍然有括号不匹配,返回false;给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。遍历字符串,将左括号入栈,对于右括号则出栈顶的左括号进行匹配。左括号必须以正确的顺序闭合。

2025-02-07 09:48:59 539

原创 【C++】_命名冲突与命名空间

3、C++标准库都放在一个叫std(standard)的命名空间中,包括cin、cout对象和enl函数等等,在日常练习中可以使用using namespace std;当运行时会默认首先在局部域寻找变量rand,寻找失败时会到全局域中寻找,全局域中有两个rand,一个是标准库stdlib.h中的rand函数,一个是定义的全局变量rand=0;4、使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对该问题。

2025-02-07 09:32:12 646

原创 【C++】_缺省参数与函数重载

缺省参数是声明或定义函数时为函数的参数制定一个默认值。在调用该函数时,如果没有指定实参,则采用该默认值。如果指定了实参,就使用指定的实参。Fun(2);Fun(3);Fun();return 0;函数重载是函数的一种特殊情况,C++允许在同一作用域中声明几个功能类似的同名函数,这些同名函数的形参列表(形参个数、类型、顺序)必须不同,(让编译器根据参数可以区分到底将形参传递给哪个函数)常用来处理实现功能类似,数据类型不同的问题。

2025-02-06 15:37:36 679

原创 【数据结构】_队列的结构与实现

队列:只允许在一端进行数据的插入操作,在另一端进行数据的删除操作的特殊线性表,队列具有先进先出FIFO(First In First Out)的特点。(2)若队列仅剩一个元素,按当前无特殊情况处理的方法实现,则pq->ptail未置空,使得其成为野指针,故需对其进行单独处理。注:若采取设有头结点的单链表,可传一级指针,但仍然需传队尾结点指针,仍需要传递两个参数,总体而言依然较为麻烦。若将数组头视为队头,数组尾视为队尾,则插入对应尾插实现方便,但删除对应头删实现麻烦;出队列:进行删除操作的一端称为队头;

2025-02-06 13:22:46 743

原创 【IoC&DI】_@Autowired存在的问题及解决

在上文中,已经介绍了依赖注入的三种方式:关于IoC与DI,相关的基本内容如下:官网对于Spring Web MVC的介绍如下:链接如下:即Spring Web MVC是基于Servlet API构建的原始的Web框架,它从一开始就包含在Spring框架中,通常被称为Spring MVC;三层架构强调对数据进行不同维度的处理,如表现层进行数据的校验与返回,业务逻辑层进行数据的处理,数据层进行数据的存储等等。将对象的控制权交给Spring的IoC容器,由IoC容器实现对依赖对象的创建及管理。

2025-02-06 09:48:27 1081

原创 【IoC&DI】_三种属性注入(DI)方式

关于IoC与DI,相关的基本内容如下:官网对于Spring Web MVC的介绍如下:链接如下:即Spring Web MVC是基于Servlet API构建的原始的Web框架,它从一开始就包含在Spring框架中,通常被称为Spring MVC;三层架构强调对数据进行不同维度的处理,如表现层进行数据的校验与返回,业务逻辑层进行数据的处理,数据层进行数据的存储等等。将对象的控制权交给Spring的IoC容器,由IoC容器实现对依赖对象的创建及管理。

2025-02-05 12:09:19 851

原创 【IoC&DI】_Spring的基本扫描机制

程序通过注解告诉Spring希望哪些bean被管理,但在仅使用@Bean时已经发现,Spring需要根据五大类注解才能进一步扫描方法注解。由此可见,Spring对注解的扫描并不是全项目扫描的,本文对Spring的基本扫描机制进行验证。

2025-02-05 10:00:23 718

原创 【数据结构】_栈的结构与实现

若top表示栈顶元素的下标,则初始化时(栈内无元素),top=-1,插入时在a[top++]处入栈元素;若top表示栈顶元素的下一个元素的下标,则初始化时top为0,插入时在a[top]处入栈元素。1、若采用数组实现栈,则可将数组头视为栈底,数组尾视为栈顶,出入栈都在数组尾进行操作。3、若采用双链表实现栈,则无论将哪端视为栈底,出栈、入栈等方法的实现都非常方便;1、栈:一种特殊的线性表,只允许在固定的一端插入和删除数据;2、压栈:栈的插入操作叫做进栈、压栈、入栈。3、出栈:栈的删除操作叫做出栈。

2025-02-04 19:44:58 426

空空如也

空空如也

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

TA关注的人

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