- 博客(42)
- 收藏
- 关注
原创 设计模式:装饰者模式
假设现在有鸟和猫,它们都有飞翔fly()行为,代码如下Flyable接口Bird类Cat类测试类执行结果很简单的一个多态实现。现在我们要进行功能扩展,我们要对各个类的飞翔时间进行统计,即获得fly()方法的执行时间,要怎么实现呢?最简单的方式是对原fly()方法进行修改,可是这违背了OCP原则。我们可以通过子类继承父类的方式,对父类的行为进行扩展。Bird子类Cat子类测试类执行结果要怎么解决这个问题呢?装饰者模式可以很好的解决该问题。
2024-08-11 17:19:31
528
原创 第九章 连接池
第四步:关闭连接仍然调用Connection的close()方法,但是这个close()方法并不是真正的关闭连接,只是将连接归还到连接池,让其称为空闲连接对象。以上这些属性是连接池中较为常见的一些属性,不同的连接池在实现时可能还会有其他的一些属性,不过大多数连接池都包含了以上几个属性,对于使用者来说需要根据自己的需要进行灵活配置。一次完整的数据库操作,大部分时间都耗费在连接对象的创建。另外,连接对象只能从连接池中获取,如果没有空闲的连接对象,只能等待,这样连接对象创建的数量就得到了控制。
2024-08-11 13:34:02
231
原创 第八章 DAO
DAO是:Data Access Object,翻译为:数据访问对象。一种JavaEE的设计模式,专门用来做数据增删改查的类。在实际的开发中,通常我们会将数据库的操作封装为一个单独的DAO去完成,这样做的目的是:提高代码的复用性,另外也可以降低程序的耦合度,提高扩展力。例如:操作用户数据的叫做UserDao,操作员工数据的叫做EmployeeDao,操作产品数据的叫做ProductDao,操作订单数据的叫做OrderDao等。/*** Author: 老杜@动力节点*/
2024-08-11 13:33:02
330
原创 第六章 JDBC调用存储过程
其中,第一个参数为连接字符串,按照实际情况修改;第二个参数为用户名,按照实际情况修改;第三个参数为密码,按照实际情况修改。其中,第一个参数为调用存储过程的语句,按照实际情况修改;第二个参数是需要设定的参数。其中,第一个参数是要注册的参数在调用语句中的位置,第二个参数是输出参数的类型。上述代码中,可以根据实际情况适当修改存储过程名、参数传递方式、参数类型等内容。其中,第一个参数是参数在调用语句中的位置,第二个参数是实际要传入的值。其中,第一个参数是输出参数在调用语句中的位置。
2024-08-11 13:31:02
256
原创 第五章 JDBC事务
事务是一个完整的业务,在这个业务中需要多条DML语句共同联合才能完成,而事务可以保证多条DML语句同时成功或者同时失败,从而保证数据的安全。例如A账户向B账户转账一万,A账户减去一万(update)和B账户加上一万(update),必须同时成功或者同时失败,才能保证数据是正确的。
2024-08-11 13:30:11
306
原创 第四章 SQL注入
SQL注入问题说的是:用户输入的信息中含有SQL语句关键字,和程序中的SQL语句进行字符串拼接,导致程序中的SQL语句改变了原意。原因是:用户提供的信息中有SQL语句关键字,并且和底层的SQL字符串进行了拼接,变成了一个全新的SQL语句。,也就是说:用户提供的信息中即使含有SQL语句的关键字,那么这个信息也只会被当做一个值传递给SQL语句,用户提供的信息不再参与SQL语句的编译了,这样就解决了SQL注入问题。如果以上的SQL语句能够查询到结果,说明用户名和密码是正确的,则登录成功。
2024-08-11 13:28:35
221
原创 第三章 JDBC的查询
ResultSet 是 JDBC (Java 数据库连接) API 提供的接口,它用于表示 SQL 查询的结果集。ResultSet 对象中包含了查询结果的所有行,可以通过 next() 方法逐行地获取并处理每一行的数据。它最常用于执行 SELECT 语句查询出来的结果集。ResultSet 的遍历是基于 JDBC 的流式处理机制的,即一行一行地获取结果,避免将所有结果全部取出后再进行处理导致内存溢出问题。在使用 ResultSet 遍历查询结果时,一般会采用以下步骤:需要注意的是,在使用完 ResultS
2024-08-11 13:27:21
737
原创 第二章 JDBC的增删改
URL 是统一资源定位符 (Uniform Resource Locator) 的缩写,是互联网上标识、定位、访问资源的字符串。它可以用来指定互联网上各种类型的资源的位置,如网页、图片、视频等。URL 通常由协议、服务器名、服务器端口、路径和查询字符串组成。协议是规定了访问资源所采用的通信协议,例如 HTTP、HTTPS、FTP 等;服务器名是资源所在的服务器主机名或 IP 地址,可以是域名或 IP 地址;服务器端口是资源所在的服务器的端口号;路径是资源所在的服务器上的路径、文件名等信息;
2024-08-11 13:25:14
660
原创 第一章 JDBC概述
JDBC(Java DataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句。
2024-08-11 13:21:54
228
原创 第十一章 MySQL优化
覆盖索引我们在讲解索引的时候已经提到过了,覆盖索引强调的是:在select后面写字段的时候,这些字段尽可能是索引所覆盖的字段,这样可以避免回表查询。A事务和B事务,开启A事务后,通过A事务修改表中某条记录,修改后,在A事务未提交的前提下,B事务去修改同一条记录时,无法继续,直到A事务提交,B事务才可以继续。慢查询日志文件可以将查询较慢的DQL语句记录下来,便于我们定位需要调优的select语句。当存储引擎是InnoDB时,表的行级锁是针对索引添加的锁,如果索引失效了,或者不是索引列时,会提升为表级锁。
2024-08-08 21:40:06
570
原创 第九章 存储引擎
MySQL存储引擎决定了数据在磁盘上的存储方式和访问方式。不同的存储引擎实现了不同的存储和检索算法,因此它们在处理和管理数据的方式上存在差异。MySQL常见的存储引擎包括InnoDB、MyISAM、Memory、Archive等。每个存储引擎都有自己的特点和适用场景。例如,InnoDB引擎支持事务和行级锁定,适用于需要高并发读写的应用;MyISAM引擎不支持事务,但适用于读操作较多的应用;Memory引擎数据全部存储在内存中,适用于对读写速度要求很高的应用等等。
2024-08-08 21:37:54
752
原创 第八章 存储过程
存储过程可称为过程化SQL语言,是在普通SQL语句的基础上增加了编程语言的特点,把数据操作语句(DML)和查询语句(DQL)组织在过程化代码中,通过逻辑判断、循环等操作实现复杂计算的程序语言。换句话说,存储过程其实就是数据库内置的一种编程语言,这种编程语言也有自己的变量、if语句、循环语句等。在一个存储过程中可以将多条SQL语句以逻辑代码的方式将其串联起来,执行这个存储过程就是将这些SQL语句按照一定的逻辑去执行,所以一个存储过程也可以看做是一组为了完成特定功能的SQL 语句集。
2024-08-08 21:36:46
626
原创 第七章 DBA
给本地用户授权:grant [权限1,权限2...] on 库名.表名 to '用户名'@'localhost';授权语法:grant [权限1,权限2...] on 库名.表名 to '用户名'@'主机名/IP地址';给外网用户授权:grant [权限1,权限2...] on 库名.表名 to '用户名'@'%';注意:撤销权限时 “数据库名.表名” 不能随便写,要求和授权语句时的 “数据库名.表名” 一致。revoke 权限 on 数据库名.表名 from '用户'@'IP地址';
2024-08-08 21:35:28
209
原创 第六章 事务
事务是一个最小的工作单元。在数据库当中,事务表示一件完整的事儿。一个业务的完成可能需要多条DML语句共同配合才能完成,例如转账业务,需要执行两条DML语句,先更新张三账户的余额,再更新李四账户的余额,为了保证转账业务不出现问题,就必须保证要么同时成功,要么同时失败,怎么保证同时成功或者同时失败呢?就需要使用事务机制。也就是说用了事务机制之后,在同一个事务当中,多条DML语句会同时成功,或者同时失败,不会出现一部分成功,一部分失败的现象。
2024-08-08 21:34:31
736
原创 第三章 表相关
varchar 的最大实际长度由最长的行的大小和使用的字符集确定,而实际占用的空间为字符串的实际长度加 1。如果采用以上两张表存储数据,对于学生表来说,sno这个字段的值是不能随便填的,这个sno是学校编号,必须要求这个字段中的值来自学校表的sno。以上的删除属于DML的方式删除,这种删除的数据是可以通过事务回滚的方式重新恢复的,但是删除的效率较低。当我们对表中的数据进行增删改的时候,称它为DML语句。表名后面的小括号当中的字段名如果省略掉,表示自动将所有字段都列出来了,并且字段的顺序和建表时的顺序一致。
2024-08-08 21:29:25
905
原创 第二章 DQL
from ...1where ...2重点掌握一个完整的DQL语句执行顺序。从一张表中查询数据称为单表查询。从两张或更多张表中联合查询数据称为多表查询,又叫做连接查询。什么时候需要使用连接查询?比如这样的需求:员工表中有员工姓名,部门表中有部门名字,要求查询每个员工所在的部门名字,这个时候就需要连接查询。select语句中嵌套select语句就叫做子查询。select语句可以嵌套在哪里?where后面、from后面、select后面都是可以的。
2024-08-08 21:27:48
761
原创 第一章 初始化数据
nameagegender张三20男李四22女以上就是数据库表格的直观展示形式。表格英文单词table。表是数据库存储数据的基本单元,数据库存储数据的时候,是将数据存储在表对象当中的。为什么将数据存储在表中呢?因为表存储数据非常直观。任何一张表都有行和列:行:记录(一行就是一条数据)列:字段(name字段、age字段、gender字段)每个字段包含以下属性:字段名:name、age、gender都是字段的名字。
2024-08-08 21:25:12
571
原创 可重复读的幻读问题
产生原因:第一次使用快照读,后面使用了当前读。解决办法:针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读。针对当前读(select ... for update 等语句),是通过 next-key lock(记录锁+间隙锁)方式解决了幻读。
2024-08-04 11:37:05
862
原创 第十五章 Java新特性
纵观Java这几年的版本变化,在Java被收入Oracle之后,Java以小步快跑的迭代方式,在功能更新上迈出了更加轻快的步伐。基于时间发布的版本,可以让Java研发团队及时获得开发人员的反馈,因此可以看到最近的Java版本,有很多语法层面简化的特性。同时,Java在支持容器化场景,提供低延迟的GC方面(ZGC等)也取得了巨大的进步。孵化器(Incubator)阶段:这是新特性最早的开发和试验阶段,此时新特性只能作为一个单独的模块或库出现,而不会包含在Java SE中。
2024-07-28 11:49:01
340
原创 第十四章 Stream API
从JDK1.8开始,Java语言引入了一个全新的流式Stream API,StreamAPI把真正的函数式编程风格运用到Java语言中,使用StreamAPI可以帮我们更方便地操作集合,允许开发人员在不改变原始数据源的情况下对集合进行操作,这使得代码更加简洁、易读和可维护。使用Stream API对集合数据进行操作,就类似于使用SQL执行的数据库查询,也可以使用Stream API来并行执行的操作。简而言之,Stream API提供了一种高效且易于使用的处理数据的方式。
2024-07-28 11:47:07
228
原创 第十三章 Lambda表达式
Java从诞生之日起就一直倡导“一切皆对象”,在Java语言中面向对象(OOP)编程就是一切,但是随着Python和Scala等语言的崛起和新技术的挑战,Java也不得不做出调整以便支持更加广泛的技术要求,即Java语言不但支持OOP还支持OOF(面向函数编程)。JDK1.8引入Lambda表达式之后,Java语言也开始支持函数式编程,但是Lambda表达式不是Java语言最早使用的,目前C++、C#、Python、Scala等语言都支持Lambda表示。面向对象的思想。
2024-07-28 11:46:03
275
原创 第十二章 网络编程
网络编程是指利用计算机网络实现程序之间通信的一种编程方式。在网络编程中,程序需要通过网络协议(如 TCP/IP)来进行通信,以实现不同计算机之间的数据传输和共享。我们开发的网络应用程序位于应用层,TCP和UDP属于传输层协议,在应用层如何使用传输层的服务呢?在应用层和传输层之间,则是使用套接Socket来进行分离。套接字就像是传输层为应用层开的一个小口,应用程序通过这个小口向远程发送数据,或者接收远程发来的数据。
2024-07-28 11:45:04
220
原创 第十一章 注解
什么是注解?注解是JDK1.5才引入的。注解可以标注在 类上,属性上,方法上 等。注解可以做到在不改变代码逻辑的前提下在代码中嵌入补充信息。注解与注释注释:给程序员看的,编译器编译时会忽略注释。注解:给编译器看的,或给其它程序看的,程序根据有没有这个注解来决定不同的处理方式。注解的重要性框架是如何实现的:框架 = 反射 + 注解 + 设计模式。自定义注解使用 @interface 来定义注解。默认情况下注解可以出现在类上、方法上、属性上、构造方法上、方法参数上等......
2024-07-28 11:43:43
385
原创 第十章 反射机制
Java反射机制是指在运行时动态获取类的信息或动态调用对象的方法、修改属性等操作。主要核心就是Class类、Constructor类、Field类、Method类等API。反射机制主要应用于框架开发、动态代理、ORM框架、JDBC驱动等方面。通过反射机制,程序员能够获得在编译期间不被知晓的类、属性、方法等信息。但是反射机制的性能较低,常常被认为是一种牺牲性能换取灵活性的实现方式。
2024-07-28 11:42:58
299
原创 第九章 多线程
什么是进程?什么是线程?它们的区别?进程是指操作系统中的一段程序,它是一个正在执行中的程序实例,具有独立的内存空间和系统资源,如文件、网络端口等。在计算机程序执行时,先创建进程,再在进程中进行程序的执行。一般来说,一个进程可以包含多个线程。线程是指进程中的一个执行单元,是进程的一部分,它负责在进程中执行程序代码。每个线程都有自己的栈和程序计数器,并且可以共享进程的资源。多个线程可以在同一时刻执行不同的操作,从而提高了程序的执行效率。
2024-07-28 11:42:07
263
原创 第八章 IO流
什么是IO流?水分子的移动形成了水流。IO流指的是:程序中数据的流动。数据可以从内存流动到硬盘,也可以从硬盘流动到内存。Java中IO流最基本的作用是:完成文件的读和写。IO流的分类?根据数据流向分为:输入和输出是相对于内存而言的。输入流:从硬盘到内存。(输入又叫做读:read)输出流:从内存到硬盘。(输出又叫做写:write)根据读写数据形式分为:字节流:一次读取一个字节。适合读取非文本数据。例如图片、声音、视频等文件。(当然字节流是万能的。什么都可以读和写。字符流:一次读取一个字符。
2024-07-28 11:40:41
182
原创 第六章 常用类
将当前字符串中所有的target替换成replacement,返回一个新的字符串。从当前字符串的fromIndex下标开始往左搜索,获取当前字符串中str字符串的最后一次出现处的下标。从当前字符串的fromIndex下标开始往右搜索,获取当前字符串中str字符串的第一次出现处的下标。获取当前字符串中str字符串的最后一次出现处的下标。获取字符串常量池中的字符串,如果常量池中没有,则将字符串加入常量池并返回。判断字符串是否为空字符串,如果length()是0就是空字符串。
2024-07-28 11:37:29
314
原创 第五章 异常
自定义异常两步:* 第一步:编写了类继承RuntimeException或者Exception* 第二步:提供两个构造方法,一个无参数的,一个带有String参数的。并且在构造方法中调用super(String)*/System.out.println("用户["+name+"]的信息正在保存....");throw new IllegalNameException("无效名字异常,名字长度应该在[6-12]位之间");
2024-07-28 11:36:16
196
原创 第四章 数组
若有某个趋势函数f(n)【f(n)代表了时间复杂度的趋势】,使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。推算过程:假设该循环的执行次数为x次(也就是i的取值为2x),就满足了循环的结束条件,即满足了2x等于n,通过数学公式转换后,即得到了x = log2n,也就是说最多循环log2n次以后,这个代码就结束了,因此这个代码的时间复杂度为:O(log2n)。(二)例如,在T(n)=4n2+2n+2中,T(n)的数量级函数f(n)=n2。
2024-07-28 11:34:18
416
原创 第三章 面向对象
元空间中存储的是类的原信息,字节码等。元空间是Java8之后引入的,元空间可以看做是JVM规范中方法区中的实现所有使用运算符new的对象,都存储在堆内存中。
2024-07-28 11:32:57
339
原创 第二章 Java基础语法
③解决了负数溢出问题:在原码中,负数的表示范围比正数少1,这样在进行减法运算时容易出现负数溢出的情况,而在补码中,负数的表示范围与正数相同,可以避免负数溢出的问题。②解决了0的正负问题:在原码中,0有两个表示,+0和-0,这样会导致计算结果不唯一,而在补码中,0只有一种表示,即全0,可以避免这个问题。例如,将二进制数0b101100右移2位,即为0b1011,相当于将44除以2的2次方(即4),得到11。②两者之间的关系是,1 byte = 8 bit,即8个比特(bit)组成一个字节(byte)。
2024-07-28 11:31:32
558
原创 第一章 Java开发环境搭建
将HelloWorld.java文件在当前目录下生成docs目录,里面有帮助文档,提取出了HelloWorld.java中的author以及version,编码方式utf-8。rd abc,删除当前路径下的abc目录。以下命令可以提取生成帮助文档。.class不是二进制文件。JDK:java运行工具包。JRE:java运行环境。JVM:java虚拟机。
2024-07-28 11:28:07
422
原创 Java代码执行顺序
static {System.out.println("Demo5类开始初始化步骤了!");//1,//2,11之后完成//7,14//9,16");//12//13,16之后完成static {System.out.println("Cat5类开始初始化步骤了!");//3//4,10之后完成//11static {System.out.println("Dog5类开始初始化步骤了!");//5//6,9之后完成//8,10,15。
2024-06-30 12:13:58
248
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人