自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

IT乐知

it乐知 · 程序员的私房笔记

  • 博客(118)
  • 收藏
  • 关注

原创 mybatis的$和#详解分析

Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘itlezhi’ in ‘where clause’好久之前的mybatis源码阅读还有一点没有完成,今天准备来收个尾,结果一执行测试代码就报错了。01报错分析报错代码与异常信息如下图:第一瞬间我竟然不知道错在哪里了,感觉就是很正常的一句sql啊,我直接把错误信息“Cause: java.sql.SQLSyntaxErrorException: Unknown column ‘itl.

2021-07-16 12:11:12 238 1

原创 【Java面试题第八期】不会还有人不懂Java最基本的异常处理原理吧?

Java 使用面向对象的方式来处理异常,它把程序中发生的每个异常也都分别封装到一个对象来表示的,该对象中包含有异常的信息。Java 对异常进行了分类,不同类型的异常分别用不同的 Java 类表示,所有异常的根类为java.lang.Throwable,Throwable 下面又派生了两个子类:Error 和 Exception,Error 表示应用程序本身无法克服和恢复的一种严重问题,程序只能挂掉,例如,说内存溢出和线程死锁等系统问题。Exception 表示程序还能够克服和恢复的问题,其中又分为系.

2021-03-18 11:17:15 171

原创 【Java面试题第七期】一文回答面试中常见反射问题?

java反射的作用反射机制是在运行时,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意个对象,都能够调用它的任意一个方法。在java中,只要给定类的名字,就可以通过反射机制来获得类的所有信息。1)在运行时判断任意一个对象所属的类。2)在运行时构造任意一个类的对象。3)在运行时判断任意一个类所具有的成员变量和方法。4)在运行时调用任意一个对象的方法。实现Java反射的类1)Class:表示正在运行的Java应用程序中的类和接口。注意: 所有获取对象的信息都需要Class类来实现。.

2021-03-12 15:35:36 262

原创 【Java面试题第六期】你对注解了解多少?

首先注解是什么?Annotation(注解)是 Java 提供的一种对元程序中元素关联信息和元数据(metadata)的途径和方法。 Annatation(注解)是一个接口,程序可以通过反射来获取指定程序中元素的 Annotation对象,然后通过该 Annotation 对象来获取注解中的元数据信息。上面是注解的定义,可以从中总结以下几个关键的点:干什么的:用来在程序中对元素(元素就是Java中的类、方法等)关联其他信息的。是什么:它是一个接口,一个特殊的接口。怎么用:通过反射获取元素中的注解.

2021-03-09 13:03:27 176

原创 【Java面试题第五期】Java中垃圾收集算法有哪些?

​GC这块也是面试的重点,面试长问,实际上如果只一般公司的面试涉及的并不深,最基本的算法还是要了解的,几种收集算法都比较简单,相信大家都知道,这里个大家简单的回顾下。标记-清除这是垃圾收集算法中最基础的,首先标记那些要被回收的对象,然后统一回收。缺点是效率不高,内存碎片多,优点是算法简单。复制算法为了解决效率问题,复制算法将可用内存按容量划分为相等的两部分,然后每次只使用其中的一块,当一块内存用完时,就将还存活的对象复制到第二块内存上,然后一次性清除完第一块内存,下次回收再将第二块上存活对象复制

2021-02-26 20:30:58 89

原创 【Java面试题第四期】使用过哪些JDK命令?

​我们平时使用idea开发,并且项目都是部署到像Tomcat容器上的,所以很少用到JDK自带的一些命令,实际上JDK提供了很多命名用来查看Java程序在运行时的一些信息,这里说一些简单常见的,有兴趣的可以多去了解测试下。jpsjps:Java Virtual Machine Process Status Tool用来查看Java进程 ,相当于Linux下的ps命令,只不过它只列出Java进程。jstatjstat:JVM Statistics Monitoring Tooljstat可以查看J.

2021-02-24 17:32:28 100

原创 【Java面试题第三期】JVM中哪些地方会出现内存溢出?出现的原因是什么?

​ ​内存溢出(Out Of Memory)经常简称为OOM,在jvm中主要分为方法区、堆、栈、本地方法栈、程序计数器这几部分,其中程序计数器是唯一不会出现OOM的,也就是说其他区域都会出现OOM。下面来分别说明几个区域出现OOM的情况及特征。1. java堆溢出(heap)Java堆内存主要用来存放运行过程中所有的对象,该区域OOM异常一般会有如下错误信息:java.lang.OutofMemoryError:Java heap space可以通过dump的内存快照就能分析,到底是由于程序.

2021-02-23 15:42:23 1317

原创 【Java面试题第一期】有没有jvm调优经验?调优方案有哪些?

​1. 调优时机:a. heap 内存(老年代)持续上涨达到设置的最大内存值;b. Full GC 次数频繁;c. GC 停顿时间过长(超过1秒);d. 应用出现OutOfMemory 等内存异常;e. 应用中有使用本地缓存且占用大量内存空间;f. 系统吞吐量与响应性能不高或下降。2. 调优原则:a. 多数的Java应用不需要在服务器上进行JVM优化;b. 多数导致GC问题的Java应用,都不是因为我们参数设置错误,而是代码问题;c. 在应用上线之前,先考虑将机器的JVM参数设置到最.

2021-01-15 11:41:16 185

原创 你知道哪几种垃圾收集器,各自的优缺点?

几种垃圾收集器:Serial收集器:单线程的收集器,收集垃圾时,必须stoptheworld,使用复制算法。ParNew收集器:Serial收集器的多线程版本,也需要stoptheworld,复制算法。ParallelScavenge收集器:新生代收集器,复制算法的收集器,并发的多线程收集器,目标是达到一个 可控的吞吐量。如果虚拟机总共运行100分钟,其中垃圾花掉1分钟,吞吐量就是99%。SerialOld收集器:是Serial收集器的老年代版本,单线程收集器,使用标记整理算法。Parallel.

2021-01-12 14:25:46 766

原创 【Java面试题第一期】Java常见异常有哪些?

​java.lang.IllegalAccessError:违法访问错误。当一个应用试图访问、修改某个类的域(Field)或者调用其方法,但是又违反域或方法的可见性声明,则抛出该异常。java.lang.InstantiationError:实例化错误。当一个应用试图通过Java的new操作符构造一个抽象类或者接口时抛出该异常.java.lang.OutOfMemoryError:内存不足错误。当可用内存不足以让Java虚拟机分配给一个对象时抛出该错误。java.lang.StackOverflow.

2021-01-11 12:12:46 110

原创 Mybatis的SqlSession执行sql过程

​上一篇分析了SqlSession执行sql的过程,其中并没有分析sql是从哪里来的,今天就来仔细分析下。Sql来源从上一篇的最后一步执行sql那里倒推sql的来源,源码主要过程如下图:可以看到最后是通过BoundSql直接获取的sql,然后往前倒推最后发现是通过MappedStatement的getBoundSql方法返回的。MappedStatement在之前分析mapper的时候知道一个执行sql对应一个MappedStatement对象,它封装有mybatis中需要执行一条sql的所有信息,

2021-01-08 11:49:58 959 1

原创 Mybatis的SqlSession执行sql过程

​上一篇分析了SqlSession的创建过程,接下来就来到最后一步执行sql的过程了。执行sql总览首先还是来看下目前分析的代码所处的位置,具体的代码如下:之前也说过要使用mybatis操作数据库,在代码里面与mybatis相关的代码只需要三步:创建SqlSessionFactory对象,利用SqlSessionFactory对象创建SqlSession,最后利用SqlSession执行sql。到目前为止已经分析到最后一步,接下来详细分析sql是如果得到并执行的。SqlSession执行部分上图

2020-12-31 11:20:53 469

原创 Mybatis的SqlSession创建过程详解

前面mybatis的初始化过程分析完成,接下来是第二步SqlSession的创建。创建过程总览SqlSession创建过程如下图:创建过程还是比较简单的,首先是之前分析的SqlSessionFactory,在mybatis中提供了两个SqlSessionFactory实现:SqlSessionManager和DefaultSqlSessionFactory,通过前面的分析知道默认返回的是DefaultSqlSessionFactory,至于SqlSessionManager后面再说吧。Defaul

2020-12-14 12:34:41 760

原创 Mybatis初始化过程简单总结

前面连续多篇文章都是在数据mybatis的初始化过程,目前基本完成,是时候做一个总结了。​总览首先回顾下最上层的测试代码,实际上目前分析的还在测试代码中与mybatis相关的第一步,具体如下图:目前还在构建SqlSessionFactory这行代码,这行代码涉及了很多流程,前面也分析了很多,这里把分析的主要流程总结如下图:上图中只画出了SqlSessionFactory初始化过程以及mapper的加载过程,由于其他比如Configuration的属性、别名、插件、数据源配置、类型映射处理器的初

2020-12-07 15:08:13 165

原创 Mybatis中SqlSource解析流程详解

前面几篇文章都在详细分析mapper的加载过程,但是始终没有看到sql的解析过程,今天来详细分析下。解析sql的位置前面分析到不管是通过注解还是通过xml方式生成mapper,最终都是调用MapperBuilderAssistant类的addMappedStatement方法,这个方法接受的其中一个SqlSource参数,SqlSource类中就是XML文件或者注解方法中映射语句的实现。那么SqlSource对象是在哪里创建的呢?在通过注解实现mapper的流程中是在MapperAnnotation

2020-12-02 11:17:58 411

原创 Mybatis中mapper的xml解析详解

上一篇文章分析了mapper注解关键类MapperAnnotationBuilder,今天来看mapper的项目了解析关键类XMLMapperBuilder。​基础介绍回顾下之前是在分析configuration的初始化过程,已经进行到了最后一步mapperElement(root.evalNode(“mappers”)),这个方法里有两种解析mapper的方法,一种是解析类,一种是解析xml文件,上一篇文章在讲解析类中的注解,今天说到的就是解析xml的流程,关键代码如下:解析mapper有4种情

2020-11-30 23:27:13 1649

原创 Mybatis中mapper相关注解解析类详解

上一篇文章分析发现解读mapper关键是两个类MapperAnnotationBuilder和XMLMapperBuilder,今天先来看MapperAnnotationBuilder。​基础介绍根据MapperAnnotationBuilder和XMLMapperBuilder两个的名字大概也可以猜出来他们的作用,MapperAnnotationBuilder应该是来处理mapper注解的,而XMLMapperBuilder是来处理mapper.xml文件的。接着上一篇通过扫描接口添加mapper

2020-11-23 13:52:30 731

原创 Mybatis对mapper的加载流程详解

今天来分析Configuration初始化的最后一部分mapper的加载。​加载方法mapperElementXMLConfigBuilder配置Configuration的parseConfiguration方法还剩最后一行解析代码:mapperElement(root.evalNode(“mappers”));mapperElement方法源码与详解如下图:从源码可以得出一些结论:mappers节点支持mapper和package两种类型子节点;package子节点只需要name一个属性

2020-11-16 11:27:20 721

原创 Mybatis中类型映射处理器详解

上一篇梳理了Configuration初始化分析,今天继续typeHandlers部分。​数据库厂商标识接上一篇文章分析,下一个解析的是databaseIdProvider节点,这个节点好理解,从字面理解就是数据库提供商的id,也就是mybatis需要访问的数据库是那种数据库。我们都知道mybatis只是一个ORM框架,并不是针对具体的数据库,需要兼容多种数据库,所以mybatis可以根据不同的数据库厂商执行不同的语句,这种多厂商的支持是基于映射语句中的 databaseId 属性。解析在配置文件

2020-11-11 22:06:06 450

原创 Mybatis中别名、插件与数据源配置

上一篇介绍了Configuration的properties和settings,接下来继续。​设置别名别名也是mybatis中最重要的配置之一,可以通过很简单的一个字符串来代替一个Class,它可以减少很多的重复代码,别名类的源码如下图:可以看到它底层数据结构是一个map,并且初始化的时候已经把常见的别名设置到map中了,在前面讲到的Configuration的初始化时,也设置了很多比如JDBC、POOLED、SLF4J、LOG4J等。在mybatis的配置文件中也可以设置别名,别名的配置及解析

2020-11-09 10:14:12 179

原创 Mybatis中Configuration的属性设置

上一篇介绍了Configuration的属性,今天就看看属性的设置过程。​回顾前面两篇文章最后都讲到最后是通过parse方法调用的parseConfiguration来设置Configuration的属性的,具体源码如下图:可以看到parseConfiguration方法中几乎每一行代码都是调用一个方法,那么接下来我们就来一行一行的分析parseConfiguration代码。propertiesElement方法分析首先第一行执行的是propertiesElement(root.evalNod

2020-11-05 11:47:34 1372 1

原创 mybatis的Configuration详解

上一篇介绍了mybatis中SqlSessionFactory的创建过程,今天来学习它默认实现中的唯一属性Configuration。​回顾还是最开始的mybatis源码环境中的测试代码如下图:利用mybatis查出数据只用三步:创建SqlSessionFactory、通过SqlSessionFactory创建SqlSession、SqlSession执行selectOne方法。上一篇文章梳理了SqlSessionFactory创建过程的源码,发现它返回的是它的默认实现类DefaultSqlSe

2020-11-03 10:58:42 672

原创 数据结构跳表原理学习

前面学习很多类的源码过程中,底层基本都是数组和链表,今天学习第三种结构跳表(SkipList)。​跳表解决的问题一个有序的数组如果我们要判断一个数据是否存在可以通过二分查找法非常快速的判断出来,但是如果是一个有序的链表结构,因为不知道链表两个节点之间的数量,就不能通过二分查找法实现了。那么就只能通过从头开始遍历查询,但是这种查询是最慢的方式,那么就需要通过其他方法来实现了,而跳表就能够解决这个问题。跳表出现过程链表不能快速判断数据是否存在的原因在于不能使用像二分查找法这种算法,不能实现的原因是找

2020-10-21 09:48:04 181

原创 Java并发ConcurrentLinkedQueue源码学习与总结

今天来学习Java中支持并发的链表队列ConcurrentLinkedQueue。ConcurrentLinkedQueue特点重点说在前面,先直接说根据源码总结出来的重点,然后再来分析,ConcurrentLinkedQueue主要特写如下:底层数据结构是基于链表的无边界的队列,采用的是FIFO(先进先出)原则排序,使用CAS方式实现线程安全。属性与构造介绍ConcurrentLinkedQueue的属性与构造函数如下图:​属性就两个head、tail,由这两个属性来组成Concurrent

2020-10-20 09:16:42 74

原创 ConcurrentHashMap的JDK7与JDK8对比学习

ConcurrentHashMap是面试的重点,尤其是jdk7与8的对比,这里进行总结对比学习。

2020-09-30 09:48:31 226

原创 一文总结常见阻塞队列

​今前面已经学习了主要的阻塞队列,今天对它们整体来一次梳理。类总结图先看下所有阻塞队列类在类图中的位置和继承结构,常见阻塞队列如下图:上图已经把前面总结的阻塞队列的继承体系梳理出来了,之前学习的时候总是发现每个类继承一个类又实现了一个接口,然后父类的接口又继承或者实现,看上去很复杂。通过这个总结类图看上去就很简单了。上图中对每个类都进行了简单的总结,接下来详细说明他们的作用。​抽象类与接口功能介绍首先是最顶层接口Iterable,它有一个属性Iterator,用来迭代元素,Collectio

2020-09-28 12:43:50 165

原创 双向链表的阻塞队列LinkedBlockingDeque

今天学习阻塞队列中的最后一个类LinkedBlockingDeque。​LinkedBlockingDeque简介LinkedBlockingDeque与LinkedBlockingQueue功能很相似,不过LinkedBlockingQueue底层是单向链表,LinkedBlockingDeque是双向链表。所以LinkedBlockingDeque提供了更多的以First、Last结尾的方法,可以指定从队列的头部或者尾部获取、添加数据,而LinkedBlockingQueue只能把数据加到尾部,从

2020-09-25 11:15:42 180

原创 阻塞队列的综合体LinkedTransferQueue

LinkedTransferQueue在某些实现可以看作是ConcurrentLinkedQueue、SynchronousQueue、LinkedBlockingQueue的超集,可以作为一个对比学习。LinkedTransferQueue简介LinkedTransferQueue是一个由链表结构组成的无界阻塞队列,它实现了TransferQueue接口。TransferQueue接口继承了BlockingQueue,主要扩展了两个方法tryTransfer、transfer。BlockingQue

2020-09-23 09:32:42 107

原创 不存储元素的同步队列SynchronousQueue

今天学习一个比较特别的队列SynchronousQueue,直译过来叫同步队列,可用于线程间交换数据却不用存储数据。​功能说明要理解SynchronousQueue首先就是要知道它的作用,只有知道这个类存在的目的和提供的功能,再能再读源码的时候不迷路。我们在之前的学习中,如果线程间要交换数据一般都是用一个通过公共变量或者一个同步阻塞队列,生产者线程设置变量或者往队列中put值,消费者线程则读取变量或者从队列中take。而SynchronousQueue则不需要存储线程间交换的数据,它的作用更像是一

2020-09-21 08:44:31 185

原创 定时任务实现的关键DelayQueue延迟队列

之前学习定时任务线程池(ScheduledThreadPoolExecutor)时发现它主要依赖线程池和它的静态内部类DelayedWorkQueue实现。而DelayedWorkQueue就是一种延迟队列,今天学习是并发包提供的延迟队列(DelayQueue)。​延迟队列说明延迟队列提供的功能是在指定时间点才能获取队列元素的功能,队列最前面的元素是最优先执行的元素。列举一下使用场景可能能够更加好理解,比如缓存系统的设计,缓存中的对象,指定了过期时间,到了过期时间就需要从缓存中移出;在比如任务调度系

2020-09-18 08:50:03 462

原创 二叉堆与优先级队列学习

今天准备学习优先级阻塞队列PriorityBlockingQueue,但是它是用二叉堆实现的,所以必须先学习二叉堆。

2020-09-16 08:42:55 80

原创 阻塞队列LinkedBlockingQueue源码学习与对比

前上一篇详细学习了ArrayBlockingQueue,今天学习LinkedBlockingQueue源码并与之对比。

2020-09-14 09:10:22 177

原创 简单总结阻塞队列ArrayBlockingQueue源码

前面Java并发这块的锁、并发工具、原子类、线程池都已经学习完了,接下来是队列的学习。

2020-09-11 08:54:10 108

原创 可能不知道的java中分阶段任务执行

前面学习了线程池相关的知识,它主要提供异步执行任务,而今天学习的不仅能够异步执行任务,还能把需要分阶段的任务进行分阶段执行。

2020-09-09 08:43:41 237

原创 一文总结线程池框架结构体系

前面几篇文章分析了线程的主要实现,今天来整体总结以下他们。​

2020-09-07 08:15:57 138

原创 三分钟弄清楚定时任务ScheduledExecutorService实现

现在项目中基本不会自己定义一个ScheduledExecutorService来执行定时任务。都是用第三方框架比如xxl-job之类的,不过了解最基本的定时任务原理还是很有必要的。​ScheduledExecutorService简单示例我们先来看最简单的使用,代码如下图:ScheduledThreadPoolExecutor是ScheduledExecutorService的实现,能做一些基本的定时任务功能。比如上图的例子,可以延迟3秒后每隔5秒执行任务。实现起来比较简单。基础源码分析首先

2020-09-04 10:30:26 399

原创 Java异步任务优化CompletionService

上一篇详细介绍了Future与Callable,而CompletionService则对它们的优化。​

2020-09-02 08:17:17 173 1

原创 有返回结果的异步任务Futrue与Callable

上一篇讲解了线程池execute方法详细执行过程,execute接受Runnable参数但没有返回执行结果,在需要有执行结果的地方就不太适用了。​异步任务有返回值如果出现一个计算量稍大用时较长而后面需要结果的情况,可以先把这个任务提交到另外的线程异步执行,主线程仍然继续做运行等到需要计算结果的时候再来获取,但是提供异步计算Runnable或者说线程Thread都不返回结果。但Java中提供了Future与Callable来实现可以获取异步执行结果的一套框架,在上一篇文章中线程池的execute方法没

2020-08-31 08:21:18 345

原创 三分钟弄懂线程池执行过程

线程池是如何运转的我一直不清楚,今天来根据源码梳理下。

2020-08-28 12:47:58 1133

原创 java中任务的分而治之框架ForkJoin

当一个任务在非常庞大的时候都会尝试拆分任务,而Java7中提供了一种任务拆分的框架ForkJoin。

2020-08-26 11:19:19 205

空空如也

空空如也

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

TA关注的人

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