- 博客(51)
- 收藏
- 关注
原创 MyBatis动态sql与留言墙联系
trim会基于prefix配置,开始部分加上 ( ,基于suffix配置,结束部分加上 ) ,多个组织的语句都以 , 结尾,在最后拼接好的字符串还会以 , 结尾,会基于suffixOverrides配置去掉最后⼀个 ,if标签的test属性中放入Java对象的属性,当age不存在时,if的内容,age或,#{age}也不会拼接进sql中,从而打到选择性插入的效果.之前的留言板练习,没有后台数据库,所有留言都存留在内存中,当服务器重启,留言就会消失.结合mybatis内容对留言板练习进行重做.
2025-10-29 18:32:27
574
原创 MyBatis操作数据库入门补充2
查询sql:SELECT ta.id,ta.title,ta.content,ta.uid,tb.username,tb.age,tb.gender FROM articleinfo ta LEFT JOIN userinfo tb ON ta.uid = tb.id WHERE ta.id = #{id}首先,预编译sql的性能更好.因为一条sql语句要经过sql语法解析,sql优化,sql编译之后才会执行.预编译SQL,编译⼀次之后会将编译后的SQL语句缓存起来,后⾯再次执⾏这条语句时,不会再次编译。
2025-10-28 17:15:28
707
原创 MyBatis操作数据库入门补充1
在xml文件中使用标签resultMap来创建映射,属性id为这个映射的名称,方便后续使用这个映射,而属性type为与数据库进行对应的实体类的位置(与select中的resultType类似).在resultMap的元素内容中,使用标签result来创建映射(用法与使用注释时的用法类似),可以使用id标签来映射主键.在xml中队函数进行实现,在mapper标签下,创建插入标签Insert,insert的属性id值应该为对应的方法名称,元素内容为所执行的sql语句.刚才插入的id为9的数据被删除成功.
2025-10-27 18:04:46
817
原创 MyBatis操作数据库入门
MyBatis是⼀款优秀的持久层框架,⽤于简化JDBC的开发.MyBatis是更简单完成程序和数据库交互的框架,也就是更简单的操作和读取数据库⼯具.
2025-10-26 20:58:31
671
原创 Spring IoC&DI补充
Component@Bean@Bean@Bean此时获取对象又报错了,NoUniqueBeanDefinitionException,根据报错信息判断出,Spring容器中包含多个Bean,但是Spring无法判断选择哪一个.此时我们只需要指定获取哪个Bean即可.//指定获取名为user的对象在指定获取之后,程序成功允许并获得了正确的结果.
2025-10-19 17:07:02
742
原创 Spring IoC & DI
容器是⽤来容纳某种物品的(基本)装置 ⸺来⾃:百度百科⽣活中的⽔杯,垃圾桶,冰箱等等这些都是容器.我们想想,之前课程我们接触的容器有哪些?List/Map -> 数据存储容器Tomcat -> Web容器IoC是Spring的核心思想.其实IoC我们在前⾯已经使⽤了,我们在前⾯讲到,在类上⾯添加@RestController 和@Controller 注解,就是把这个对象交给Spring管理,Spring框架启动时就会加载该类.把对象交给Spring管理,就是IoC思想.
2025-10-16 17:21:33
1022
原创 Spring MVC练习:留言板
在展示留言的方法中,接收后端传来的留言list,循环构造留言信息并打印.在发布留言的方法中,接受后端传来的处理结果,为true则展示留言信息,false则告知用户输入不合法.首先要有一个表示留言信息的类.在处理类中包含这个信息类的list,在发表留言的方法中对留言信息进行判断,如果留言不合法则返回false,合法则放入list并返回true.访问路径/message/publish,请求应包含留言信息.响应为留言是否成功(true/false).2.用户访问时,后端输出数据到前端显示留言板的留言信息.
2025-10-15 17:09:53
371
原创 SpringMVC练习:加法计算器与登录
请求路径:calc/add,请求方式:GET/POST.请求参数:num1:类型Integer,必传参数;num2:类型Integer,必传参数.登录请求路径:/user/login,请求方式POST.登录请求参数:userName:类型String,必传参数;password:类型String,必传参数.查询用户是否登录路径:/user/getLoginUser。
2025-10-14 18:25:37
683
原创 Spring MVC入门补充2
随着互联⽹的发展,⽬前项⽬开发流⾏"前后端分离"模式,Java主要是⽤来做后端项⽬的开发,所以也就不再处理前端相关的内容了.MVC的概念也逐渐发⽣了变化,View不再返回视图,⽽是返回显示视图时需要的数据.而@RestController就是现在概念中的返回数据,@Controller就是之前概念中的返回视图.@ResponseBody既可以修饰类,也可以修饰方法.当修饰类时,表示该类的所有⽅法,返回的都是数据,如果修饰⽅法,表⽰该⽅法返回的是数据.
2025-10-14 17:39:37
375
原创 Spring Web MVC入门补充1
在计算机领域,会话是⼀个客户与服务器之间的不中断的请求响应.对客⼾的每个请求,服务器能够识别出请求来⾃于同⼀个客户.当⼀个未知的客⼾向Web应⽤程序发送第⼀个请求时就开始了⼀个会话.当客⼾明确结束会话或服务器在⼀个时限内没有接受到客⼾的任何请求时,会话就结束了.服务器同⼀时刻收到的请求是很多的.服务器需要清楚的区分每个请求是从属于哪个用户,也就是属于哪个会话,就需要在服务器这边记录每个会话以及与用户的信息的对应关系.Session是服务器为了保存用户信息⽽创建的⼀个特殊的对象.
2025-10-13 19:40:59
756
原创 Spring Web MVC入门
Spring Web MVC是基于Servlet API构建的原始Web框架,从⼀开始就包含在Spring框架中.它的正式名称“Spring Web MVC”来⾃其源模块的名称(Spring-webmvc),但它通常被称为"Spring MVC".MVC是Model View Controller的缩写,它是软件⼯程中的⼀种软件架构设计模式,它把软件系统分为模型,视图和控制器三个基本部分.MVC模型草图:View(视图):指在应⽤程序中专⻔⽤来与浏览器进⾏交互,展⽰数据的资源.Model(模型)
2025-10-12 18:21:21
1012
1
原创 第一个SpringBoot程序
src/main/java: Java源代码.src/main/resources:为静态资源或配置⽂件.src/test/java:测试代码源代码.target:编译后的文件路径.pom.xml:Maven配置文件.
2025-10-10 18:40:13
589
原创 JVM中的垃圾回收机制
新生代区中的对象每次垃圾回收都有⼤批对象死去,只有少量存活.对于小对象且对象数量少时,适合使用复制算法.新生代区分为Eden区与两个幸存区,当扫描到幸存对象后,会将幸存对象送入幸存区,后续进行复制算法的清除,如果一个对象在幸存区存货较长时间那么这个对象就会被送入老年代区."复制"算法是为了解决"标记-清理"的效率问题.它将可⽤内存按容量划分为大小相等的两块,每次只使⽤其中的⼀块.当这块内存需要进⾏垃圾回收时,会将此区域还存活着的对象复制到另⼀块上⾯,然后再把已经使⽤过的内存区域⼀次清理掉.
2025-10-03 19:45:32
966
原创 JVM的类加载机制
⼀个类加载器收到了类加载的请求,它⾸先不会⾃⼰去尝试加载这个类,⽽是把这个请求委派给⽗类加载器去完成,每⼀个层次的类加载器都是如此,因此所有的加载请求最终都应该传送到最顶层。类的话,那么程序运⾏的时候,系统就会出现多个不同的Object类,⽽有些Object类又是用户自己提供的,因此安全性就不能得到保证了.而使用双亲委派模型可以很好的保护API不被篡改.1.避免重复加载类:⽐如A类和B类都有⼀个⽗类C类,那么当A启动时就会将C类加载起来,那么在B类进⾏加载时就不需要在重复加载C类了.
2025-10-03 18:57:02
983
原创 JVM中的内存区域划分
虚拟机栈的作⽤:Java虚拟机栈的⽣命周期和线程相同,Java虚拟机栈描述的是Java⽅法执⾏的内存模型:每个⽅法在执⾏的同时都会创建⼀个栈帧(Stack Frame)⽤于存储局部变量表,操作数栈,动态链接,⽅法出⼝等信息。运行时常量池是元数据区的一个部分,class文件中除了有类的版本,字段,方法,接口等描述信息外,还有一项信息是常量池,用于存放编译期间生成的各种字面量和符号引用,这部分内容会在类加载后进入方法区的运行时常量池中.程序计数器的作⽤:⽤来记录当前线程执⾏的⾏号的.
2025-10-03 18:29:09
409
原创 网络原理-HTTPS
引入对称加密后,即使黑客拦截了数据,但是不知道密钥是什么,就无法对数据解密,这样就保证了安全.但是,服务器一次会和多个客户端进行通信,这些客户端和服务器之间使用的密钥肯定是不相同的(如果相同,那么密钥就形同虚设了).这样,就需要在一开始沟通,这次通信的密钥是什么,这一次通信是没有加密的.如果,黑客拦截到这次通信,那么黑客就知道密钥是多少,就能对后续的通信进行解密.,签名是基于非对称算法的,是一个经过加密的校验和.签名的加密是公证机构使用私钥进行的加密,而公钥一般是内置在操作系统中的.
2025-10-02 18:59:04
1041
1
原创 网络原理-HTTP补充2
永久重定向.响应报⽂的header部分会包含⼀个Location字段,表⽰要跳转到哪个⻚⾯.当浏览器收到这种响应时,后续的请求都会被⾃动改成新的地址.响应报头的基本格式和请求报头的格式基本⼀致.类似于Content-Type,Content-Length等属性的含义也和请求中的含义⼀致.表示访问被拒绝,一些页面需要权限才能访问,当权限不足时就会被拒绝访问.例如,在没有登录的情况下区访问某人的私人仓库.重定向指用户访问某个网页时,被引导到另一个URL不同的网页.例如,在登录页面成功后,用户被重定向到主页.
2025-09-30 18:20:55
570
1
原创 网络原理-HTTP补充1
2.ip地址/域名:在HTML中可以省略(比如mg,link,script,a标签的src或者href属性).省略后表⽰服务器的ip/域名与当前HTML所属的ip/域名⼀致.转义的规则如下:将需要转码的字符转为16进制,然后从右到左,取4位(不⾜4位直接处理),每2位做⼀位,前⾯加上%,编码成%XY格式.例如:c++会被转义为c%2B%2B.平时我们俗称的"⽹址"其实就是说的URL统⼀资源定位符.互联⽹上的每个⽂件都有⼀个唯⼀的URL,它包含的信息指出⽂件的位置以及浏览器应该怎么处理它.
2025-09-29 20:20:09
886
原创 网络原理-HTTP
HTTP(全称为"超⽂本传输协议")是⼀种应⽤⾮常⼴泛的应⽤层协议. 文本:字符串;超文本:不仅仅是字符串,还可以携带一些图片/特殊的格式. HTTP往往是基于传输层的TCP协议实现的(HTTP1.0,HTTP1.1,HTTP2.0均有TCP协议实现,HTTP3.0由UDP协议实现).目前主流使用的是HTTP1.1与HTTP2.0. 当我们在浏览器输入一个网址(URL),浏览器就会给对应的服务器发送一个HTTP请求,服务器收到请求后返回一个HTTP响应,浏览器对响应
2025-09-27 19:31:11
736
原创 网络原理-数据链路层
"以太网"不是一个具体的网络,而是一个技术标准.即包含了数据链路层的结构,也包含了物理层的结构.以太网是当前应用最广泛的局域网技术,与以太网并列的有令牌环网,无线LAN等.3.到达对端后,根据13位偏移来进行组包,拼装到一起返回给传输层.一旦在传输的过程中发送丢包,接收端的重组就会失败,ip协议不会对丢包的情况进行重传.3.最理想的情况下,MSS的值正好是在IP不会被分⽚处理的最⼤⻓度(这个⻓度仍然是受制于数据链路层的MTU).为了不被分包来保证可靠性.由于MTU的限制,对于较大的ip数据报就要进行分包.
2025-09-26 20:18:21
647
原创 网络原理-传输层补充2
假设,接收方的接收缓冲区有2MB,在接收1MB的数据后,立刻返回ACK,这个ACK的窗口大小就是1MB.如果让ACK的返回稍微延后,接收方就能"消化"一些缓冲区的数据,在等待的时间里接收方消化了0.5MB的数据,那么就让ACK中的窗口大小从1MB扩大到1.5MB.毕竟窗口越大,网络的吞吐量越高,TCP为了在不拥堵的前提下尽可能的提高网络的吞吐量,就引入了延迟应答.由于TCP协议是面向字节流的,那么在读取数据时,站在应用层的角度看到的是一串连续的字节数据,无法知晓哪里是一个完整的应用层数据包.
2025-09-22 20:31:50
710
原创 网络原理-传输层补充1
在客户端发送SYN报文,服务端接收到后,服务端就知晓服务端接收能力正常,客户端发送能力正常,随后服务端返回ACK+SYN报文,客户端接收到后,客户端就知晓客户端发送,接收能力正常,服务端发送,接收能力正常,随后客户端返回给服务端ACK报文,服务端接收到后就知晓服务端发送能力正常,客户端接收能力正常.如图,ACK3001丢包,但是发送方收到了ACK4001,就知晓4001之前的接收方都已收到,接下来从4001开始发送即可,这种情况无需重传.3.收到ACK后,窗口向后滑动,继续发送后续报文段.
2025-09-20 19:49:05
859
原创 网络原理-传输层
2.如果数据已经被应用层读走了,socket api是可以记录最后一次读取的数列号是多少,同时数据的读取是从序列号小的开始,如果新接收的数据的序列号小于记录的序列号,则新接收的数据是重复数据直接抛弃.UDP报的最大长度是有限的,其容量64KB在今下的互联网上是一个非常小的数字,在使用UDP进行传输大数据时,需要在发送方的应用层手动拆分数据,在接收方的应用层手动合并数据.但是这个时间的长短是随着网络的质量变化的.如果超时时间设的太长,那么会影响数据的传输效率,如果超时时间设置的太短,就可能会让重传频繁发生.
2025-09-17 19:42:14
975
原创 UDP套接字的使用
Java中使⽤UDP协议通信,主要基于 DatagramSocket 类来创建数据报套接字,并使⽤DatagramPacket 作为发送或接收的UDP数据报.
2025-09-12 11:24:56
802
原创 网络原理基本概念
在网络通信中,设计的细节是很复杂的,如果使用一个协议来完成网络通信,就需要这个协议约定方方面面,那么会导致协议很复杂.这时就需要对这个协议进行拆分,将原来臃肿的协议拆分为多个小协议,为了让这些小协议互相配合工作,就引入了协议分层.TCP/IP是⼀组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇.TCP/IP通讯协议采⽤了5层的层级结构,每⼀层都呼叫它的下⼀层所提供的⽹络来完成⾃⼰的需求。网络通信协议拆分之后进行了分层,将功能相近的协议分入同一层,下层给上层提供服务,上层调用下层的功能,只有。
2025-09-02 17:33:51
736
原创 操作文件 File类
在使用相对路径时,AbsolutePath返回的是针对当前目录解析相对路径后获得的路径,而CanonicalPath返回的是文件的绝对路径.这三个方法都是返回文件的路径,但是结果略有差异.getCanonicalPath在使用时可能会抛出IOException异常.当使用mkdir时,如果目录需要中间目录才能创建,那么就无法成功创建目录.而使用mkdirs则可以创建中间目录与目标目录.在Windows中,路径分隔符支持"/"和"\",Linux分隔符仅支持"/".成功将T.txt重命名为1.txt.
2025-08-31 19:29:40
1258
原创 IO、存储、硬盘、文件系统相关
从树形结构来看,从根节点到某个文件的路径是唯一的,这个路径就是这个文件的绝对路径,在Windows系统中,路径的根节点是相对应的盘符(C:).相对的,从某个位置开始出发,到这个文件的路径就是这个文件相对这个位置的相对路径.计算机的存储包括CPU寄存器,缓存,内存,硬盘,他们的容量大小是递增的,速度是递减的.寄存器与内存中的数据在断电后会消失,而硬盘中的数据断电后依旧保存在硬盘中.⽂件由于被操作系统进⾏了管理,所以根据不同的⽤⼾,会赋予⽤⼾不同的对待该⽂件的权限,⼀般地可以认为有可读、可写、可执⾏权限.
2025-08-30 17:33:24
370
原创 多线程下使用集合类
CopyOnWriteArrayList是:在添加新的元素时不直接添加在原容器中,而是先把原容器复制一份,再添加到复制出的容器中,添加完毕后将引用指向复制出的容器.1.读操作不再加锁,只对写操作加锁,而且不再给方法加锁,而是将每个"桶"进行加锁(给链表头节点加锁),降低了锁冲突的概率.3).⼀旦触发扩容,就由该线程完成整个扩容过程.这个过程会涉及到⼤量的元素拷⻉,效率会⾮常低.Vector,Stack,HashTable,是线程安全的(不建议⽤),其他的集合类不是线程安全的.④搬运完毕后,将老表删除.
2025-08-30 13:21:13
577
原创 等待多个任务执行完毕 CountDownLatch
每个任务执⾏完毕,都调⽤latch.countDown(),CountDown Latch中计数器自减.当需要等待多个任务完成时,可以调用多次join,也可以使用CountDownLatch.构造CountDownLatch对象,构造函数中的数值为等待多少线程执行完成.调用latch.await()进行等待,当计数器为0时等待完毕,继续执行.等待一段时间后,执行完毕.
2025-08-30 12:53:53
274
原创 信号量 Semaphore
刚开始执行时,大量线程尝试获取资源,但是资源有限,即信号量为0,线程进行等待.当其他线程释放资源后,其他线程得知信号量不为0,进行P操作拿到资源.Semaphore的PV操作中的加减计数器操作都是原⼦的,可以在多线程环境下直接使⽤.acquire方法为P操作,使信号量-1.release方法为V操作,使信号量+1.信号量,⽤来表⽰"可⽤资源的个数".本质上就是⼀个计数器.当信号量为0时,再进行P操作就要等待.
2025-08-30 12:40:17
126
原创 多线程--创建线程Callable
本文介绍了Java中使用Callable接口创建线程并获取返回值的方法。与Runnable不同,Callable允许线程返回结果。文章通过代码示例展示了如何定义Callable任务(计算1到1000的和),并配合FutureTask使用:先将Callable包装为FutureTask,再传入Thread。最后通过FutureTask的get()方法获取计算结果,该方法会阻塞直至任务完成。这种方式解决了Runnable无法返回结果的问题。
2025-08-26 21:01:08
375
原创 CAS简述
CAS,全称Compare and swap,字⾯意思为⽐较并交换,⼀个CAS涉及到以下操作:内存中有数值A,寄存器1中有A,寄存器2中有B1,比较内存中数值是否和寄存器中数值相等2,如果相等,将另一个寄存器的值写入内存3,返回交换是否成功如:比较内存和寄存器1中的值,均为A,故将内存中的A和寄存器2中的B交换,返回true.伪代码示例。
2025-08-26 20:43:49
289
原创 多线程——synchronized补充
执⾏加锁操作,先进⼊内核态.在内核态判定当前锁是否已经被占⽤,如果该锁没有占⽤,则加锁成功,并切换回⽤⼾态.如果该锁被占⽤,则加锁失败.此时线程进⼊锁的等待队列,挂起.等待被操作系统唤醒.经历了⼀系列的沧海桑⽥,这个锁被其他线程释放了,操作系统也想起了这个挂起的线程,于是唤醒这个线程,尝试重新获取锁。如果锁对象因为锁竞争而进入轻量级锁阶段,那么这个锁被释放后再被获取时,不会进入偏向锁阶段。轻量级锁:当锁处于偏向锁阶段,并且有其他线程来竞争这个锁时,锁就会进入轻量级锁阶段(自适应的自旋锁)。
2024-04-12 15:22:50
478
原创 多线程——锁策略
公平锁是指,锁会按照尝试获取这个锁的线程的先后顺序来分配,如果A线程持有这个锁,B、C线程尝试锁,但是B线程尝试获取锁的时间早于C,那么这个锁在被A释放后,乐观锁:是指假设最好的情况,去访问数据时,并不会真正的加锁,而是直接访问,在访问的同时识别是否会发生冲突(可能会造成一些资源的浪费,如占用更多的cpu)。挂起等待锁是指,当一个线程获取锁失败后,会放弃再获取锁,而是等待内核“通知”,收到通知后,再去尝试获取锁。可重入锁指,当在这个锁的代码块内,再次对这个锁对象上锁,不会出现死锁,能够成功的上锁。
2024-04-12 14:59:51
436
原创 多线程案例——线程池
由于进程的创建和销毁的开销过大,所以我们引入了线程。但是,在线程的使用过程中,不断的创建和销毁线程,这个开销不断变大,所以我们需要一个方法来减少线程的创建和销毁的开销。有两种办法来减少这个开销:1.使用纤程/携程 ->更轻量化的线程。
2024-04-10 13:13:36
686
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅