- 博客(28)
- 收藏
- 关注
原创 Spring Data
是MyBatis为了接入Spring框架而提供的一个Bean,主要用于管理MyBatis的SqlSession,并且它是线程安全的。自动配置的过程中,Spring Boot 会根据应用程序配置文件(application.yml)中的数据库相关配置,如数据库URL、用户名、密码等信息,来创建一个 DataSource 对象(默认提供的是HikariDataSource)。 SqlSession是MyBatis框架中的一个核心概念,它是对JDBC连接的封装,简化了数据库操作。
2024-12-19 20:29:32
1030
原创 设计模式介绍
设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。六大原则开闭原则(开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。里氏代换原则(里氏代换原则面向对象设计的基本原则之一。
2024-11-25 09:34:42
825
原创 Mybatis
1、定义不同:#{} 预处理:而 ${} 是直接替换2、使用不同:#{} 适用于所有类型的参数匹配;但 ${} 只适用于数值类型。3、安全性不同:#{} 性能高,并且没有安全问题;但 $ {} 存在 SQL 注入的安全问题。4、使用场景不同:当传递的是一个 SQL 关键字 的时候,只能 使用 ${}。当传递的是一个字段,总之,就是需要获取到参数类型 与 内容,只能使用 #{}。(PS:数字类型,#{} 和 ${} 都是可以使用的!5、 ${} 不能用于 模糊匹配查询;
2024-11-15 18:38:47
1014
原创 Maven基础
Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具,是一个项目管理和构建自动化工具,使用它来管理项目中的jar包;管理jar冲突问题公共代码重复利用高效的项目开发需要高效的项目管理工具maven能处理从创建、编译、测试、部署各个环节的项目管理。
2024-11-15 18:24:59
901
原创 Java进阶 - 性能分析(Async-profiler)
我们一般用 ./profiler.sh -d 30 -f profile.svg 3456 这个就行了。-d 表示采样时间多少秒, -f是输出到文件,3456是被采样java进程id。看下example就可以了,常用的都在example里面。这里对输出文件,建议命名为XXXX.svg,这个直接可以在浏览器打开,看到火焰图。Async-profiler工具是非常好用的开源的采集Java函数调用栈的工具。中间过程如果出现没有安装的组件,安装完以后再重新编译就行了。执行:./profile.sh。
2024-11-13 20:50:38
348
原创 Java进阶 - 并发编程
对象头:Java对象头一般占有2个机器码(在32位虚拟机中,1个机器码等于4字节,也就是32bit,在64位虚拟机中,1个机器码是8个字节,也就是64bit),但是如果对象是数组类型,则需要3个机器码,因为JVM虚拟机可以通过Java对象的元数据信息确定Java对象的大小,但是无法从数组的元数据来确认数组的大小,所以用一块来记录数组长度。另外,在JDK1.6又引入了自适应自旋,这个就比较智能了,自旋时间不再固定,由前一次在同一个锁上的时间以及锁的拥有者的状态来决定。
2024-11-13 20:45:04
1056
原创 Java进阶 - 多线程
比如:任务1产生的结果,可以直接作为任务2的入参,参与任务2的计算,以此类推。它提供了一种方便的方式来处理异步任务的结果。方便线程并发数的管控,因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换(cpu切换线程是有时间成本的(需要保持当前执行线程的现场,并恢复要执行线程的现场);CompletableFuture是多个任务只要有一个任务执行完成,则返回的CompletableFuture执行get方法时会抛出异常,如果都是正常执行,则get返回执行完成任务的结果。
2024-11-12 20:44:03
1000
原创 Java进阶 - AOP
因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法. 里面有三个常用的方法,基于这3个方法,可以轻松打印:被切的类名、方法名、方法参数值、方法参数类型等。AspectJ是一个面向切面的框架,是目前最好用,最方便的AOP框架,和Spring中的aop可以集成在一起使用,通过Aspectj提供的一些功能实现aop代理变得非常方便。):是一个可以加入额外代码运行的特定位置,一般指方法之间的调用,可以在不修改原代码的情况下,添加新的代码,对现有代码进行升级维护和管理。
2024-11-11 12:11:59
1058
原创 Java进阶 - 注解
Validated是@Valid 的一次封装,是Spring提供的校验机制使用。如果@Import的参数是实现了ImportSelector接口的类,Spring会调用ImportSelector接口的selectImports()方法,根据返回的类名数组将相应的类注册为Bean。注解通常使用在控制层的方法上,用于将Controller的方法返回的对象,通过Springmvc提供的HttpMessageConverter接口转换为指定格式的数据如:json、xml等,通过Response响应给客户端。
2024-11-08 10:27:03
965
原创 Java进阶 - 反射
Type体系中类型的包括:原始类型(Class)、参数化类型(ParameterizedType)、数组类型(GenericArrayType)、类型变量(TypeVariable)、基本类型(Class);这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。而解剖使用的就是Class类中的方法.所以先要获取到每一个字节码文件对应的Class类型的对象,public Method[] getDeclaredMethods():获取所有的成员方法,包括私有的(不包括继承的);
2024-11-07 15:36:44
903
原创 Java进阶 - 泛型
就泛型类而言,类实例化时才能传递真正的类型参数,由于静态方法的加载先于类的实例化,也就是说类中的泛型还没有传递真正的类型参数时,静态方法就已经加载完成。泛型保证了类型的安全性(在获取集合中的元素时,也不需要进行强制类型转换,程序会自动进行隐式转换,这就保证了数据的安全性),也提高了代码的执行效率。泛型可以在编译时对类型进行安全检测(如果元素的类型与要求的不一致,在编译阶段就会检测出有错误,不需要进入到运行阶段才能发现类型不一致)。泛型类:在类的定义时使用泛型,为某些变量和方法定义通用的类型;
2024-11-07 15:30:24
440
原创 Java8新特性 - Stream (流操作)
groupingBy与toMap都是将聚合元素进行分组,区别在于toMap结果是 1:1 的 k-v 结构,groupingBy的结果是 1:n的 k-v 结构。流进行了终止操作后,不能再次使用。Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。并行流处理元素的顺序不是固定的,因为元素的处理是在多个线程中并行进行的。并行流就是 Stream 的一个分支,它利用多核处理器的优势,可以实现真正的多线程环境下的并行执行。
2024-11-07 15:19:49
1348
原创 Java8新特性 - 函数式接口(Functional Interface)
接受一个 Function 作为参数,并返回一个新的 Function,该新函数首先应用当前函数,然后将结果传递给参数函数。函数式接口是一个只有一个抽象方法的接口,最开始的时候也叫做 SAM 类型的接口(Single Abstract Method)。,该方法接受一个参数 t(类型为 T),并返回一个结果(类型为 R),我们可以理解为根据一个数据类型 T ,经过一系列的操作后得到类型 R。”是不可违背的宗旨,所以 Lambda 表达式是对象,而不是函数,他们必须要依附于一类特别的对象类型:函数式接口。
2024-11-07 15:07:41
994
原创 Java8新特性
在 Lambda 表达式中,我们可以访问外部的显示或者隐式的 final 类型变量,何为隐式的 final 呢?虽然类型推断机制允许省略Lambda表达式的参数类型,但有时候显式声明参数类型可以增强代码的可读性和处理复杂的泛型情况,这个时候我们还是将参数类型写上会显得更加友好。当 Lambda 表达式的主体中只有一个执行方法的调用时,我们可以不使用 Lambda 表达式,而是选择更加简洁的方法引用,这样可读性更高一些。编译器可以根据上下文推断 Lambda 表达式的参数类型,从而可以省略参数类型的声明。
2024-11-07 15:02:42
318
原创 JAVA基础 - Junit
JUnit是一个回归测试框架(regression testing framework),也是白盒测试,因为程序员知道被测试的软件如何完成功能和完成什么样的功能。Junit是一套框架,继承TestCase类,就可以用Junit进行自动测试了。所有测试方法调用前执行一次,在测试类没有实例化之前就已被加载,需用static修饰。所有测试方法调用后执行一次,在测试类没有实例化之前就已被加载,需用static修饰。每一个测试方法调用前必执行的方法。每一个测试方法调用后必执行的方法。将一个方法标记为测试方法。
2024-11-07 14:49:04
416
原创 JAVA基础 - 工具类
它采用独创的算法,将parse的速度提升到极致,超过所有json库,包括曾经号称最快的jackson。例如,在处理JSON对象到Java对象的映射时,如果JSON对象包含泛型列表或其他复杂数据结构,TypeReference可以帮助明确指定反序列化的类型,从而确保数据被正确地映射到Java对象中。例如,在使用Jackson库时,可以通过ObjectMapper的readValue方法,并传入一个TypeReference子类实例,来实现对泛型对象的反序列化。用于表示 JSON 数组。
2024-11-07 14:42:44
817
原创 JAVA基础 - HTTP调用
是Apache Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,相比传统JDK自带的URLConnection,增加了易用性和灵活性,既提高了开发的效率,也方便提高代码的健壮性。它简化了与http服务的通信方式,统一了RESTFul的标准,封装了http连接,只需要传入url及其返回值类型即可。它的设计原则与许多其他Spring的模板类(例如JdbcTemplate)相同,为执行复杂任务提供了一种具有默认行为的简化方法。创建请求方法的实例,并指定请求URL。
2024-11-07 14:34:07
396
原创 JAVA基础 - 比较
当元素的类型没有实现Comparable接口而又不方便修改代码,或者实现了Comparable接口的排序规则不适合当前的操作,可以考虑使用 Comparator 的对象来排序。Comparable接口只有一个compareTo(obj)方法,比如String类等就实现了Comparable接口,重写了compareTo(obj)方法。如果当前对象this大于形参对象obj,则返回正整数;如果当前对象this小于形参对象obj,则返回负整数;如果当前对象this等于形参对象obj,则返回零。
2024-11-07 14:31:36
193
原创 JAVA基础 - 判空
简单理解,就是对某种类型<T>的封装即可,要么为该对象本身,要么为Null。调用这个方法,在Optional为空时会根据传入的lambda表达式生成一个Optional方法,注意:该方法需要jdk9+使用该方法,如果满足条件或者为空,那么就返回当前对象本身,否则返回一个空Optional。和of方法一样的,只不过当传入的值为null时返回一个空的Optional。该方法和get一样,只不过当Optional为空时会返回一个默认值。这个方法会在Optional为空时调用传入的lambda生成一个值。
2024-11-07 14:30:37
615
原创 JAVA基础 - 异常处理
这些错误是不可查的,因为它们在应用程序的控制和处理能力之外,而且绝大多数是程序运行时不允许出现的状况。也就是说,你代码还没运行呢,编译器就会检查你的代码,会不会出现异常,要求你对可能出现的异常必须做出相应的处理。Throwable有两个重要的子类:Exception(异常)和Error(错误),二者都是Java异常处理的重要子类,各自都包含大量子类。除了RuntimeException与其子类,以及错误(Error),其他的都是检查异常(绝对的大家族)。返回关于发生的异常的详细信息。
2024-11-07 14:28:46
559
原创 JAVA基础 - 流和文件
一个目录其实就是一个 File 对象,它包含其他文件和文件夹。如果创建一个 File 对象并且它是一个目录,那么调用 isDirectory() 方法会返回 true。需要注意的是当删除某一目录时,必须保证该目录下没有其他文件才能正确删除,否则将删除失败。方法创建一个文件夹,成功则返回true,失败则返回false。失败表明File对象指定的路径已经存在,或者由于整个路径还不存在,该文件夹不能被创建。可以通过调用该对象上的 list() 方法,来提取它包含的文件和文件夹的列表。
2024-11-07 14:27:24
234
原创 JAVA基础 - 集合
通过实现List接口,具备了列表操作的能力;Vector (向量) 可以实现可增长的对象数组,当容量不够时,会自动扩容,如果在创建Vector时定义了每次增长的容量大小,那么每次会按照规定的大小进行扩容,如果没有规定,则每次扩容为原来的2倍,和Arraylist一样,扩容时每次先创建一个新的数组,随后将原来的数组拷贝过去完成扩容。Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,Vector中的方法都使用了synchronized关键字以确保所有的操作都是线程安全的。
2024-11-06 10:02:32
797
原创 JAVA基础 - 日期时间
用于格式化日期和时间的类,此处所谓格式化,就是字面意思,统一格式,即它允许你将日期和时间按照指定的格式转换成字符串,也可以将对应格式的字符串解析成日期和时间对象。当 Java 8 引入 java.time 包时,它引入了一些新的日期和时间 API,这些 API 旨在提供更强大、更易于使用、线程安全且具有本地化支持的日期和时间处理方式。Date是一个“万能接口”,它包含日期,时间,还有毫秒数,在新的java8中,日期和时间被明确划分为LocalDate和LocalTime,LocalDateTime。
2024-11-05 20:41:57
913
1
原创 JAVA基础 - 数据类型
需要注意的是,自动装箱和自动拆箱虽然方便了开发和编码,但在一些特定的场景下也可能导致性能问题。是Java 8 引入的一种较为新的字符串拼接类,需要将多个字符串拼接成一个以某个特定字符分隔、前后缀的字符串时,比较方便和简洁。它是线程安全的,但不适合复杂的字符串操作,可能会导致过多的内存分配和垃圾回收。append() 方法 其实他们的本质是一样的,都是继承自AbstractStringBuilder,效率最高,大批量的数据处理最好选择这两种方法。,代码简洁方便,加号“+” 更符合我们的编码和阅读习惯;
2024-11-05 20:33:58
461
原创 JAVA基础 - JVM(虚拟机)
1、增加java虚拟机中的XX:MetaspaceSize和XX:MaxMetaspaceSize参数的大小,其中XX:MetaspaceSize是初始元数据区域大小,XX:MaxMetaspaceSize是最大元数据区域大小。Java8废弃了永久代,替代的是元空间(MetaSpace),元空间与永久代上类似,都是方法区的实现。3个区域随线程而生、随线程而灭,因此这几个区域的内存分配和回收都具备确定性,就不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。
2024-11-05 20:28:07
1088
原创 JAVA基础 - 基本概念
transient是短暂的意思。因此,在浅拷贝的对象中,引用类型的变量指向的依旧是原始对象中的引用。在静态内部类中只能访问外部类中的静态成员,创建静态内部类对象时,不需要先创建外部类对象。因此,在深拷贝的对象中,引用类型的变量指向的是全新的对象。Object中的clone()会识别你要复制的是哪一个对象,然后为此对象分配空间,并进行对象的复制,将原始对象的内容一一复制到新对象的存储空间中。因此,构造代码块的执行是在构造方法之前的,即使在构造方法中进行实例变量的赋值,构造代码块中的代码也会先于这些操作执行。
2024-11-05 20:18:42
668
原创 JAVA基础 - 开发规范
正例:优先推荐入参为String的构造方法,或使用BigDecimal的valueOf方法,此方法内部其实执行了Double的toString,而Double的toString按double的实际能表达的精度对尾数进行了截断。【强制】应用中不可直接使用日志系统(Log4j、Logback)中的API,而应依赖使用日志框架 (SLF4J、JCL--Jakarta Commons Logging)中的API,使用门面模式的日志框架,有利于维护和各个类的日志处理方式统一。写的是数字的21,还是Long型的2。
2024-11-05 20:12:19
631
原创 Maven入门
Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具,是一个项目管理和构建自动化工具,使用它来管理项目中的jar包;管理jar冲突问题公共代码重复利用高效的项目开发需要高效的项目管理工具maven能处理从创建、编译、测试、部署各个环节的项目管理。
2024-02-07 16:53:06
910
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人