自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 第五十天学习心得

自动配置类中的默认配置通常由xxx.properties指定,这个properties里的属性名和前缀,就是我们在application.properties里可以配置的内容。SpringBoot通过配置类帮我们自动配置了很多默认内容,这些配置类的名字都是XxxAutoConfiguration,比如DataSourceAutoConfiguration、DispatcherServletAutoConfiguration等。理解了这三个注解的配合,就理解了SpringBoot为什么能"零配置"启动。

2026-09-23 19:43:15 212

原创 第四十九天学习心得

昨天完成了SpringMVC的基础和进阶内容,今天继续深入学习了异常处理、拦截器、日期格式处理,最后还完成了一个重要的实战项目——用聚合工程整合SSM框架。第四,整合SSM的过程虽然繁琐,但理解了每个配置类的作用之后就清晰了。我的理解是,这套机制本质上是SpringMVC在Controller方法外层包了一层代理,当方法抛出异常时,代理捕获异常并交给匹配的异常处理方法。异常处理让代码更干净,拦截器让权限控制更优雅,日期处理解决了实际开发中的常见问题,SSM整合让我看到了企业级项目的完整结构。

2026-09-22 15:15:26 257

原创 第四十八天学习心得

同样的URL `/users`,GET请求是查询,POST请求是新增。同样的URL `/users/1`,GET是查询,PUT是全量更新,PATCH是局部更新,DELETE是删除。上传后访问图片发现404,原因是DispatcherServlet会处理所有请求,`/imgs/xxx.jpg` 也会被当成Controller请求去匹配,找不到就返回404。MultipartFile的常用方法:`getOriginalFilename()` 获取原始文件名,`transferTo()` 把文件保存到指定路径。

2026-09-21 20:18:34 191

原创 第四十七天学习心得

从最简单的单个参数,到数组、实体类、包装类,再到JSON,SpringMVC几乎覆盖了所有场景。这里注册的DispatcherServlet就是SpringMVC的前端控制器,它负责接收所有请求,然后分发给对应的Controller。如果前端传的参数名和Java参数名一样,这个注解可以省略。响应部分也是类似的,响应行是"协议 响应码 消息",比如"HTTP/1.1 200 OK",后面跟响应头和响应体。POST请求的中文乱码是Web开发的老问题,在SpringMVC中的解决方案是注册一个字符编码过滤器。

2026-09-20 19:06:44 234

原创 第四十六天学习心得

System.out.println(pjp.getSignature() + "耗时:" + (end - start) + "ms");关键理解:连接点是"候选",切入点是"选中",切面是"增强逻辑",通知是"具体动作"。核心思想:在层与层之间增加一个**可编程的切面**,将功能性代码(日志、事务、权限)提取到切面中统一处理,业务代码只保留业务逻辑。切入点表达式决定了哪些方法会被增强,分为**粗粒度**(within)和**细粒度**(execution)。**多个参数时,msg必须放最后**。

2026-09-17 19:54:16 235

原创 第四十五天学习心得

而今天最让我印象深刻的,是从"重复代码"的困境出发,一步步引出代理设计模式的过程——**这不是单纯的知识堆砌,而是一次完整的架构思维推演**。FactoryBean是Spring提供的扩展点,`getObject()`返回实际对象,`getObjectType()`返回类型,`isSingleton()`控制是否单例。注意:Spring 6全面迁移到Jakarta EE 9+,`@PostConstruct`和`@PreDestroy`从`javax.*`改为`jakarta.*`包。

2026-09-16 20:09:19 199

原创 第四十四天学习心得

1. 动态SQL是MyBatis的灵魂:`<where>`自动去掉多余的AND,`<set>`自动去掉多余的逗号,`<foreach>`优雅处理IN查询——这些标签体现了MyBatis对开发者体验的极致追求。配置后,`resultType="cn.javasm.entity.User"`可以简写为`resultType="user"`或`resultType="User"`。-- 主键映射 -->基本类型可以写别名(`int`对应`java.lang.Integer`),`#{}`中的名字可以随便写。

2026-09-15 20:31:29 66

原创 第四十三天学习心得

如果说之前手写JDBC是"手工打造",那么今天学习的Maven和MyBatis就是"工业化的流水线"——前者解决依赖管理和项目构建,后者简化数据库操作。2. MyBatis体现了"约定优于配置":Mapper代理开发中,只要遵循命名规范(namespace=接口全路径,id=方法名),就能自动映射,不需要写一行实现类代码。MyBatis是一个持久层框架,它的前身是Apache的iBatis,2010年迁移到Google后改名MyBatis,2013年迁移到GitHub。-- 组织/公司 -->

2026-09-14 21:29:32 132

原创 第四十二天学习心得

每次`DriverManager.getConnection()`都会创建新的物理连接,而**创建连接是非常耗时的操作**(TCP握手、身份验证等)。3. 连接池是性能优化的重要一环:从自己手写连接池到理解原理,再到后续学习Druid、HikariCP等成熟框架,这条学习路径让我明白——**框架不是凭空产生的,而是把简单原理做到极致**。**这两步必须同时成功或同时失败**——这就是事务的意义。核心思路:重写`Connection.close()`方法,让它不是真正关闭连接,而是**归还到连接池**。

2026-09-10 21:01:17 182

原创 第四十一天学习心得

setAutoCommit(false)` + `commit/rollback` 是标准模式,务必在`finally`中恢复自动提交并释放资源。1. 框架的本质是封装:像`ResultSetUtils`这样的工具类,通过反射+约定(列名与字段名对应),将重复的"结果集→对象"转换封装成通用方法。在昨天的查询代码中,每次从`ResultSet`取值都要手动调用`getInt()`、`getString()`、`getObject()`等,再逐个`set`到对象中,代码重复度极高。

2026-09-09 21:19:27 33

原创 第四十天心得体会

聚合函数在DQL中已经接触过:`AVG()`、`SUM()`、`MAX()`、`MIN()`、`COUNT()`。各个数据库厂商实现这些接口,提供对应的驱动(Driver)。| `LENGTH()` vs `CHAR_LENGTH()` | 字节长度 vs 字符长度 | `LENGTH('中国')`=6,`CHAR_LENGTH('中国')`=2 || `LPAD()` / `RPAD()` | 左/右填充 | `LPAD('hello',9,'abc')` → `'abchello'` |

2026-09-08 20:48:04 136

原创 第三十九天学习心得

跨列使用会导致部分索引失效:`name` 和 `age` 之间有 `age`,跳过 `age` 直接查 `major`,只有 `name` 走索引。复合索引中,一旦出现 `>`、`<`、`BETWEEN`、`LIKE`(前缀模糊),**范围字段右边的所有条件全部失效**。理论上效率:`count(普通列)` < `count(id)` < `count(1)` ≈ `count(*)`复合索引 `(name, age, major)` 中,查询条件必须包含最左列 `name` 才能使用索引。

2026-09-07 20:15:12 368

原创 第三十八天心得体会

1. 执行顺序决定写法:理解了执行顺序(FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY → LIMIT),就能理解为什么WHERE不能使用聚合函数而HAVING可以。从单表查询到多表连接,从简单的条件筛选到复杂的子查询和自连接,一整天的密集练习让我对"查数据"这件事有了质的飞跃。重要区别:`COUNT(*)`统计所有行,`COUNT(字段)`只统计该字段非NULL的行。比较运算:`=`、`!

2026-09-03 20:26:15 325

原创 第三十七天学习心得

从Java后端开发的角度来看,数据库是数据持久化的核心,也是连接应用程序与数据的桥梁。一整天的学习让我从“什么是数据库”的懵懂状态,逐步过渡到能够独立创建表、操作数据的初步实践阶段。1. 数据类型映射是基础中的基础:Java中的BigDecimal对应MySQL的DECIMAL,这个映射关系直接影响数据的精度和正确性,金额字段尤其重要。| DDL | 数据定义语言 | CREATE、DROP、ALTER、TRUNCATE || DML | 数据操作语言 | INSERT、UPDATE、DELETE |

2026-09-02 21:26:29 231

原创 第三十六天学习心得

反射是在运行时"解剖"已加载的类,而类加载器则决定了类是如何被加载到JVM中的。2. 类的唯一性是多版本共存的挑战:双亲委派保证了类的唯一性,但同时也带来了版本冲突的问题。所有核心类都由同一个BootClassLoader加载,确保了整个JVM中核心类的版本一致性,避免因版本冲突导致的不兼容问题。每个类加载器都有缓存,子加载器加载前先问父加载器"你加载过吗?",父加载器加载过的类子加载器不会重复加载,节省内存空间。这是最顶层的类加载器,没有父加载器。它负责的是JVM最核心的类库,是整个类加载体系的"根"。

2026-09-01 20:06:17 278

原创 第三十五天学习心得

传统的编程方式是在编译时就知道要使用哪个类、调用哪个方法,而反射则是在运行时才"打听"类的细节。如果说之前学习的IO流、多线程、网络编程是"应用层面"的技能,那么反射就是"框架层面"的基石。课堂上的"警察执法"案例很生动——根据警察类型注解的不同值,执行不同的处罚逻辑。1. 反射是框架的基石:之前不明白Spring为什么能在运行时"自动"做那么多事,现在懂了——背后是反射在"打听"类的所有信息。`setAccessible(true)`是反射的核心操作之一——突破访问权限的限制,私有的也能访问。

2026-08-31 20:53:28 347

原创 第三十二天学习心得

今天从最基础的概念开始:IP地址是网络中计算机的唯一标识,端口号用于区分不同的应用程序,套接字(Socket)则是网络传输数据的机制——本质上是一套基于网络的IO。它实现了线程间的数据隔离,每个线程都有自己的ThreadLocal副本,互不干扰。3. 引用类型是GC的底层支撑:理解软引用才能理解缓存框架的底层原理,理解弱引用才能理解ThreadLocal的源码设计。1. UDP和TCP的选择:没有绝对的好坏,取决于场景——视频通话用UDP追求实时性,文件下载用TCP追求完整性。// 任意方法中获取。

2026-08-28 21:30:04 164

原创 第三十一天学习心得

当两个线程的变量位于同一个缓存行时,一个线程修改变量会导致整个缓存行失效,另一个线程必须重新从主内存加载,这就是**伪共享**问题。LongAdder:当线程数量过多时,内部会将累加压力分散到**cell数组**中,最后汇总。适合**高并发**的累加操作,性能优于AtomicInteger。而且它是可循环使用的。每个线程都有自己的**工作内存**(CPU缓存),线程对变量的操作是在工作内存中进行的,不会立即同步到主内存。`Semaphore`用于控制同时访问特定资源的线程数量,是**限流**的经典实现。

2026-08-27 21:56:01 291

原创 第三十天学习心得

模拟张三账户余额2000元,李四转账1000、王五转账2000、妻子取款,通过`FutureTask`包装Callable任务,配合`join()`方法保证线程顺序执行。今天继续深入多线程的学习,内容涵盖了创建线程的第三种方式、线程优先级、守护线程、线程状态、停止线程以及线程池等重要知识点。2. 停止线程时一定要用优雅的方式,`stop()`方法已被废弃,因为它会立即释放锁,可能导致数据不一致。老师强调:**停止线程的最好方式是让线程自然结束**,而不是使用已废弃的stop()方法。

2026-08-26 20:28:04 204

原创 第二十九天学习心得体会

让我印象深刻的是关于**CPU利用率**的讲解。老师举了一个很形象的例子:单线程时CPU利用率为80%,双线程可以达到96%——因为线程在等待硬件I/O时,CPU可以切换到其他线程继续工作,减少了空转。课程开始,老师厘清了**进程**与**线程**的关系:进程是运行中的程序,而线程是进程中的执行单元。方式二的优势在于**解耦**——将线程的任务(Runnable)与线程本身(Thread)分离,更符合面向接口编程的原则。课堂上的**售票案例**让我直观感受到了多线程的安全问题。这是多线程编程的经典模型。

2026-08-25 21:00:36 161

原创 第二十七天,二十八天心得体会

PrintStream`是字节打印流,`PrintWriter`是字符打印流,它们都提供了方便的`print()`和`println()`方法,省去了手动转换的麻烦。课堂练习中,我们用`BufferedReader`包装`InputStreamReader`再包装`System.in`,实现了从控制台读取一行字符串的功能——这让我理解了“包装”的真正含义。获取Stream流的方式多样,集合的`stream()`方法、`Stream.of()`、`Stream.concat()`合并流等。

2026-08-24 20:22:18 182

原创 第25,26天心得体会

File file = new File("D:\\svn\\第一阶段");不会去检查这个路径是否真实存在,仅仅是将当前的路径标记为一个file对象。当且仅当这个文件不存在的时候,创建该文件。如果是目录,并且这个目录中有内容,则不能删除。字符流只能处理纯文本的文件,字节流可以处理所有类型的文件。

2026-08-22 20:18:10 228

原创 二十四天心得体会

put()方法添加数据,entrySet()方法获取所有的键值对,clear()方法清空数据,containsKey()判断map中是否有对应的key,containsValue()判断map中是否有对应的value,还有其他一些方法就不一一列明了。指定的初始容量一定是2的n次方的形式,为了保证索引在数组的范围内,保证重新分配元素时,要么在原来位置,要么在原来位置 + 原来的数组长度。默认的初始容量是11,默认的加载因在是0.75,在构造方法中会创建对应的数组。是无序的,元素位置可能发生改变。

2026-08-20 20:30:55 151

原创 第二十三天心得体会

再者是Set接口,Set接口中的元素不允许重复。扩容时会重复计算,重复排列元素所在的位置。要么在原来的索引处,要么是原来索引 + 原来的数组长度。如果向量增量为0,那么扩容是原来容量翻倍。如果向量增量不为0,就是原来容量 + 向量增量。当数组的长度 * 加载因子 < 元素个数 时,就会进行一次扩容,每次扩容都是数组长度翻倍。默认数组的初始容量是16,默认的加载因子是0.75。HashSet底层是HashMap的实例。指定的数组长度一定是2的n次方的形式。默认的初始容量是10。存储的是不重复的元素。

2026-08-19 20:30:24 152

原创 二十一,二十二天心得体会

昨天是学习的二十一天,由于老师感冒了,我们自习了一天。今天上午讲了一下异常,异常分为运行异常和编译异常。异常和错误有个父类Throwable。然后讲了如何处理异常。下午讲了一下集合。集合的顶级接口是Collection,集合是存放对象的容器,每一个对象称之为元素。一些集合是有序的,一些集合是无序的。一些集合可以放重复元素,一些集合不可以放重复元素。接着讲了一些集合中常用的方法,包括添加元素,清空集合,判断是否包括某个元素等。然后是List接口。List接口的特点:有序的集合,允许元素重复,方法具有索引。

2026-08-18 20:19:13 206

原创 十九,二十天学习心得体会

然后是日期的getTime(),获取当前时间离计算机元年的毫秒值,和他一样作用的还有long l = System.currentTimeMillis()。SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")格式化时间simpleDateFormat.format(date)将日期转换为字符串。要注意是从0开始获取月份,比方说七月就是6.再者就是java中的time,括 LocalDateTime(有日期有时间), LocalDate,LocalTime。

2026-08-16 16:46:48 152

原创 第十八天心得体会

表示之前的字符至少出现1次 ,* 表示之前的字符可有可无,?{n} : 表示这个字符出现恰好是n次 , {n,m} : 表示这个字符至少出现n次,但不超过m次。() 在正则中表示一个捕获组, 捕获组可以看成一个字符进行操作,正则表达式会对捕获组进行自动的编号, \\n 表示引用编号为n的捕获组, 捕获组的编号是从(出现的位置开始计算的。数学类主要讲了一些常用的计算方法,包括最大值,最小值等。接着是数学的子类,BigDecimal用于精确计算的类,要求参数以字符串形式传入,底层会进行按位运算。

2026-08-14 17:19:33 228

原创 第十七天心得体会

getBytes()按照指定的编码转换成字节数组.把字符数组转换成字符串和吧数组转换成字符串类似。字符串的哈希码值是固定不变的。lastIndexOf()获取字符/字符串最后一次出现的索引,从fromIndex开始向前找首次出现的索引。首先是charAt(),它的作用是获取指定索引处的字符。然后是length(),它的作用是 获取字符串的长度, 即 获取的是字符串的字符个数。compareTo() 方法 在比较两个字节数组的时候,是逐位进行比较如果对应位置上的字符比较之后不相等,则返回字符之差。

2026-08-13 20:08:47 165

原创 第十六天心得体会

昨天是全天自习,做了一下共享单车的练习,没什么好说的,今天上午讲了一下这个练习。老师用的是接口实现功能,我用的也是,但我的代码过于繁琐。下午则讲了内部类中剩下的三个,包括局部内部类,成员内部类,静态内部类。接着讲了一下api.API -- Application Programming Interfaces 应用程序接口.先从object讲起,因为object是所有成员的父类。再者是finalize方法,通知gc(垃圾回收)开始工作,开始回收对象,但是gc不一定执行。

2026-08-12 19:45:36 143

原创 第十四天心得体会

上午首先讲了抽象,abstract可以修饰方法和类,修饰的方法称之为抽象方法,修饰的类称之为抽象类。抽象类要被继承,子类要重写抽象类的所有的抽象方法,或者子类也是抽象类。抽象方法可以重载,必须要被重写,所以不能被private/final修饰。接口是功能的集合,在JDK1.8之前,接口中只描述所应该具备的方法(抽象方法),并没有具体的实现。在JDk1.8之后,接口中也可以存在实体方法接口通过编译后也会生成.class。接口不能直接实例化。接口中的抽象方法一定被public abstract修饰,不能更改。

2026-08-10 20:21:31 165

原创 第十三天心得体会

今天是学习的第十三天。今天上午主要看了一下关于人机猜拳的讲课视频。另外把老师上课时的讲课笔记喂给ai,让ai给我出题,考验我的掌握情况。用了一下豆包和deepseek,豆包相对比较严格,deep seek是鼓励式教育。下午把面向对象ai出的题全部做完,显示我对静态方面的掌握程度不够。确实我明白相关概念,但在使用的时候不太会用。这种考察方法是好方法,我会接着用下去。

2026-08-09 17:01:49 9

原创 第十二天心得体会

今天是学习的第十二天。今天和明天都是自习,上午自习先练了一个小时打字。对我而言打字还是小白一样,早知道大学时就多玩电脑游戏了,好歹能更熟悉键盘。然后开始回顾过往课程,感觉之前讲的有些内容已经有点模糊了,所以需要复习一下。下午开始做练习,说实话堕胎的练习有点简单,没用多长时间就解决出来了。确实能感觉到自己的进步。自习剩下的也没什么好说的。明天继续练一个小时打字,再把老师的讲课视频好好看一下。就这样吧,明天也继续加油。

2026-08-08 18:59:09 10

原创 第十一天心得体会

static是java中的关键字,也是一个修饰符,可以修饰变量,方法,代码块,内部类。静态变量是属于类的,不是属于对象的。注意:类是在首次被使用到的时候加载到元空间,类只会加载一次。静态方法在类加载的时候加载到元空间,并没有执行只是存储在元空间中。父子类中可以存在方法签名相同的静态方法,称之为隐藏(hide),隐藏也适用于重写的五个原则。可以修饰数据,方法,类 .final修饰的数据称之为常量。final修饰的成员变量,要求在对象创建完成之前赋值,final修饰的静态变量,要求在类加载完成之前赋值。

2026-08-07 20:42:17 160

原创 第十天心得体会

如一些类中的属性和方法是重复的,可以将这些重复的属性和方法提取到一个新的类中,利用extends关键字让原来的类和新的类产生联系,这种联系就称之为继承。注意:子类通过继承可以继承父类的全部的属性和方法,但是只有一部分属性和方法对子类可见。就是一个类只能有一个父类,但是父类还可以有它的父类,接着讲了一下权限修饰符,包括public,private,protected,以及默认。再者是super的用法。super(参数):调用父类的构造方法 每一个构造方法中默认都有一个super(),调用父类的无参构造。

2026-08-06 21:23:46 150

原创 第九天心得体会

面向对象:强调的是对象,然后由对象去调用功能、面向对象的特点:1是一种更符合人类思考习惯的思想;类对我而言,就是抽象的事物的总成,对象就是其中具体的某一事物。封装是面向对象的三大特征之一,它是面向对象编程语言对客观世界的模拟,客观世界里成员变量都是隐藏在对象内部的,外界无法直接操作和修改。把常用的代码使用方法进行封装,提高了代码的复用性。今天是第九天的学习,上午老师先讲解了一下如何实现幸运抽奖,感觉老师讲起来好简单,没用多长时间就做完了,跟着听也能听懂,但我昨天下手做的时候可不是这样。

2026-08-05 20:33:25 162

原创 第八天心得体会

今天是上课的第八天,讲了一下方法的内容。方法的命名和变量相同,只有一个单词全部小写,有多个单词从第二个单词开始首字母大写。方法应该定义在类中方法外,方法不能嵌套。方法的定义和它的执行顺序是无关的。方法的重载就是在一个类中,允许存在方法名相同,参数列表不同的方法。形式参数:在方法定义时候的()中的参数,简称形参。实际参数:在方法调用时候传递的参数,简称实参。下午则让我们自己自己练习如何实现幸运抽奖整个功能,包括注册,登录,开始抽奖整个功能,这确实不好写,我只能做到看懂样例,让我自己写有难度。

2026-08-04 19:32:04 165

原创 第七天心得体会

今天上午和下午的一部分时间,老师首先把练习题讲了一下。还行,我还能跟得上。紧跟着讲了一下,数组的排序,数组的扩容以及二维数组。数组的排序,老师重点讲了一下冒泡排序法和选择排序法,其实这两个差不多,选择排序法是从索引0的元素开始依次和其他元素比较,如果小就交换,确保索引0的元素是最小值,然后索引1次小。冒泡排序法是相邻元素比较,就是索引0的元素和索引1比较,索引1和索引2比较。数组的扩容实际上是伪扩容,它产生了一个新数组。明天要讲方法以及幸运抽奖,希望我不会掉队。

2026-08-03 19:24:17 25

原创 第五,六天心得体会

我的室友一个上午就把所有练习做完了,我tm就写了一道题。室友看我还没写完,怀疑的问问我是不是光顾着玩了,我说自己是零基础,他说零基础也不应该这么慢,我真是无言以对。我还在写题,室友直接过来手把手教我,说实话根本没听懂,但我也不好意思说。比方说有一道练习题的最后他建议我用增强for循环,我当时根本不知道这个该怎么使用,今天过来上自习重新看了一下老师的讲课视频才搞懂了这个。我先看了一下老师的讲课视频,接着继续看室友教我的那几道题,现在终于能看懂了,但说实话,让我自己写真不一定能写的出来。

2026-08-02 15:44:51 19

原创 第四天心得体会

今天是上课的第四天,情况还行。今天首先讲了一下流程控制语句选择结构中的switch语句,和if语句差不多,然后讲了一下循环结构。for循环,while循环和dowhile循环。值得一提的是dowhile循环至少循环一次。接着讲了一下数组,说白了数组是存放相同数据类型的容器。讲了数组的声明,数组的遍历,数组的最值。据说难点在明天,包括数组的排序,数组的扩容。

2026-07-31 20:32:31 192

原创 学习第三天的心得

首先是运算符,它分为算术运算符,关系运算符,逻辑运算符,赋值运算符,三元运算符,位运算符。算术运算符中值得一提的是字符串的相加其实是拼接,任何类型和字符串相加都是字符串。还有值得一提的是自增自减运算符,符号在前,先运算,再执行其他操作,符号在后,先执行其他操作再运算。赋值运算符和关系运算符就不说了,主要讲一下逻辑运算符,包括&,全对才对,|,一对即对。取反是~i=-i-1。然后是流程控制语句,今天只讲了一下顺序结构和选择结构的一部分,顺序结构没什么好说的。写好的代码一直报错,提示我有if,找不到else。

2026-07-30 21:04:56 156

空空如也

空空如也

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

TA关注的人

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