自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 1、Java的内存区域

运行时数据区域Java虚拟机内存模型包括程序计数器、虚拟机栈、本地方法栈、方法区、堆VM内存分布图:程序计数器程序计数器是一块较小的内存空间,可以看作当前线程所执行的字节码行号指示器。字节码解释器工作的时候就是通过改变这个计数器的值来选取下一条需要执行的字节码的指令,分支、循环、跳转、异常处理、线程恢复等基础功能都需要依赖这个计数器来完成。java虚拟机的多线程是通过线程的轮流切...

2019-03-31 22:47:46 319

原创 9、PriorityQueue分析

待续

2017-12-22 21:03:33 469

原创 8、Deque

Deque简介Deque是Queue的子接口,我们知道Queue是一种队列形式,而Deque则是双向队列,它支持从两个端点方向检索和插入元素,因此Deque既可以支持LIFO形式也可以支持LIFO形式.Deque接口是一种比Stack和Vector更为丰富的抽象数据形式,因为它同时实现了以上两者.Deque接口定义Deque接口定义了在两端访问元素的方法,主要包括insert、remove和exam

2017-12-22 21:02:53 428

原创 7、Queue

Queue集合的作用Queue用于模拟队列这种数据结构。队列通常是指“先进先出(FIFO)”的容器。队列的头部保存在队列中存放时间最长的元素,尾部保存存放时间最短的元素。新元素插入到队列的尾部,取出元素会返回队列头部的元素。通常,队列不允许随机访问队列中的元素。Queue接口与List、Set同一级别,都是继承了Collection接口。LinkedList实现了Queue接 口。Queue接口窄化

2017-12-22 21:02:27 472

原创 6、fail-fast机制

fail-fast简介fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。换句话说,只要是线程不安全的集合都可能,抛出此异常例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationEx

2017-12-22 21:01:46 373

原创 5、ArrayList详解

ArrayList介绍ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。ArrayList 继承了AbstractList,实现了List。它是一个数组队列,提供了相关的添加、删除、修改、遍历等功能。A

2017-12-22 21:01:00 450

原创 4、List接口详解

List简介list:集合中的元素按照索引的位置排序,集合中的元素可以重复,可以为null,允许按照对象在集合中的索引位置检索对象,遍历的顺序和放入的顺序是一致的。List接口的定义List的定义如下:public interface List<E> extends Collection<E> { //省略了Collection接口中已有的方法/*** 添加集合到指定的位置*/

2017-12-22 20:56:54 368

原创 3、Iterator、Iterable详解

Iterator概述如何判断当前迭代器的位置,及如何移动?java的迭代器是无法将随机访问的,也就是说不可以根据输入的数字来跳转到指定的位置,迭代器到达任何一个位置都需要经过next或者可能存在的previous方法实现,只能一个一个的移动。 是迭代器并不是指向一个元素的,而是指向元素之间的。迭代器初始化之后再0号元素之前,迭代到尾之后是在最后一个元素之后,期间任何一点都是指向两个元素之间的位置

2017-12-22 20:55:16 704

原创 2、Collection架构

概要collection是个接口,它有2个分支:List和Set。list为有序的队列,set为不可重复的集合。 collection定义了集合的基本操作,AbstractCollection抽象类实现了collection的大部分功能。Collection中有一个iterator()方法,它的作用是返回一个Iterator接口。通常,我们通过Iterator迭代器来遍历集合。不同的集合有不同的实

2017-12-22 20:54:46 261

原创 1、集合框架概述

概念与作用(1.8.0_144)java中的集合类:是一种工具类,就像是容器,储存任意数量的具有共同属性的对象。在编程时,常常需要集中存放多个数据,当然我们可以使用数组来保存多个对象。但数组长度不可变化,一旦初始化数组时指定了数组长度,则这个数组长度是不可变的,如果需要保存个数变化的数据,数组就有点无能为力了;而且数组无法保存具有映射关系的数据。集合框架的体系结构 Java的集合类主要由两个接口

2017-12-22 20:53:45 339

原创 Java 8 Optional的正确姿势

调用一个方法得到了返回值却不能直接将返回值作为参数去调用别的方法。我们首先要判断这个返回值是否为null,只有在非空的前提下才能将其作为其他方法的参数。这正是一些类似Guava的外部API试图解决的问题。新版本的Java,比如Java 8引入了一个新的Optional类。Optional类的Javadoc描述如下: 这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回t

2017-12-21 22:58:14 23978 6

原创 8、线程的中断机制

中断线程 线程的thread.interrupt()方法是中断线程,将会设置该线程的中断状态位,即设置为true,中断的结果线程是死亡、还是等待新的任务或是继续运行至下一步,就取决于这个程序本身。线程会不时地检测这个中断标示位,以判断线程是否应该被中断(中断标示值是否为true)。判断线程是否被中断 判断某个线程是否已被发送过中断请求,请使用Thread.currentThread().i

2017-12-21 21:52:31 299

原创 7、多线的异常处理

在普通的单线程程序中,捕获异常只需要通过try … catch … finally …代码块就可以了。那么,在并发情况下,比如在父线程中启动了子线程,如何正确捕获子线程中的异常,从而进行相应的处理呢?常见错误很简单嘛,直接在父线程启动子线程的地方try … catch一把就可以了,其实这是不对的。原因分析让我们回忆一下Runnable接口的run方法的完整签名,因为没有标识throws语句,所以方法

2017-12-21 21:52:10 369

原创 6、ThreadLocal线程变量

定义并发应用的一个关键地方就是共享数据。这个对那些扩展Thread类或者实现Runnable接口的对象特别重要。如果你创建一个类对象,实现Runnable接口,然后多个Thread对象使用同样的Runnable对象,全部的线程都共享同样的属性。这意味着,如果你在一个线程里改变一个属性,全部的线程都会受到这个改变的影响。Java中的ThreadLocal类可以让你创建的变量只被同一个线程进行读和写操作

2017-12-21 21:51:51 341 1

原创 5、守护线程

定义在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程、后台线程)只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。User和Daemon两者几乎没有区别,唯一的不同之处就在于虚拟机的离开:如果 User Thread已经全部退出运行了,只剩下Daemon Threa

2017-12-21 21:51:15 271

原创 4、基本的线程同步

monitor他们是应用于同步问题的人工线程调度工具。讲其本质,首先就要明确monitor的概念,Java中的每个对象都有一个监视器,来监测并发代码的重入。在非多线程编码时该监视器不发挥作用,反之如果在synchronized 范围内,监视器发挥作用。当某代码并不持有监视器的使用权时(如图中5的状态,即脱离同步块)去wait或notify,会抛出java.lang.IllegalMonitorSta

2017-12-21 21:50:56 300

原创 3、线程的调度

1. 线程睡眠 Thread.sleep(long millis)方法,使线程转到阻塞状态。millis参数设定睡眠的时间,以毫秒为单位。当睡眠结束后,就转为就绪(Runnable)状态。sleep()使当前线程进入停滞状态,所以执行sleep()的线程在指定的时间内肯定不会执行;由于sleep()方法是Thread类的方法,因此它不能改变对象的机锁。所以当在一个Synchronized方法中

2017-12-21 21:49:48 284

原创 2、线程的创建

线程的创建Java 提供了三种创建线程的方法: - 通过实现 Runnable 接口; - 通过继承 Thread 类本身; - 通过 Callable 和 Future 创建线程。我们将使用第二种方法来制作一个简单的程序,它能创建和运行10个线程。每一个线程能计算和输出1-10以内的乘法表。通过实现 Runnable 接口来创建线程创建一个名为Calculator的类,这个类要实现Runna

2017-12-21 21:49:22 325

原创 1、线程的基本概念

多线程线程与进程进程: 一个计算机程序的运行实例,包含了需要执行的指令;有自己的独立地址空间,包含程序内容和数据;不同进程的地址空间是互相隔离的;进程拥有各种资源和状态信息,包括打开的文件、子进程和信号处理。 线程: 表示程序的执行流程,是CPU调度执行的基本单位;线程有自己的程序计数器、寄存器、堆栈和帧。同一进程中的线程共用相同的地址空间,同时共享进进程锁拥有的内存和其他资源。#

2017-12-21 21:47:11 536

原创 35、MapperMethod映射器方法.

MapperMethod:映射器方法映射器方法是最底层的被调用者,同时也是binding模块中最复杂的内容。它是MyBatis中对SqlSession会话操作的封装,那么这意味着什么呢?意味着这个类可以看做是整个MyBatis中数据库操作的枢纽,所有的数据库操作都需要经过它来得以实现。 我们单独使用MyBatis时,有时会直接操作SqlSession会话进行数据库操作,但是在SSM整合之后,这个数

2017-06-27 23:08:28 1303

原创 34、SqlSource解析

SqlSourceBuilder主要是用来构建SQLSource的,不管是动态SQL还是静态SQL,最后都是调用这个类生成静态sql字段parameterProperties支持的配置项private static final String parameterProperties = "javaType,jdbcType,mode,numericScale,resultMap,typeHandler

2017-06-27 23:07:51 1705

原创 33、SQL解析基础

BoundSqlBoundSql只是一个简单的java对象,有两个属性比较重要 - sql:从解析时可以看出这个sql不是配置文件中的sql,这个sql已经经过了处理(如:占用位符的处理、动态语句的解析if、foreach等待) - parameterObject:客户端执行sql时传入的参数 - parameterMappings: sql中的参数映射对应#{id,jdbcType=INTE

2017-06-27 23:07:21 835

原创 32、解析MetaObject

MetaObjectMetaObject类相当于一个工具类,Mybatis在sql参数设置和结果集映射里经常使用到这个对象。下面来详细分析一下这类。字段 /** *原始的对象 */ private Object originalObject; /** * 原始对象的包装 */ private ObjectWrapper obj

2017-06-27 23:06:52 2825

原创 31、propertise解析之通用标记解析器与标记处理器

GenericTokenParser通用标记解析器这里的通用标记解析器处理的是SQL脚本中#{parameter}、${parameter}参数,根据给定TokenHandler(标记处理器)来进行处理,TokenHandler是标记真正的处理器,而本篇的解析器只是处理器处理的前提工序——解析,本类重在解析,而非处理,具体的处理会调用具体的TokenHandler的handleToken()方法来完

2017-06-27 23:06:21 459

原创 30、SQL片段的解析

sqlFragment可以翻译为sql片段,它的存在价值在于可复用sql片段,避免到处重复编写。sqlFragment的解析过程sqlFragment存储于Configuration内部。protected final Map<String, XNode> sqlFragments = new StrictMap<XNode>("XML fragments parsed from previous

2017-06-27 23:05:43 691

原创 29、ParamNameResolver参数解析

处理接口形式的入参在使用MyBatis时,有两种使用方法。 - 一种是使用的接口形式, - 另一种是通过SqlSession调用命名空间。这两种方式在传递参数时是不一样的,命名空间的方式更直接ParamNameResolver主要用来处理接口形式的参数,最后会把参数处放在一个map中map的key为参数的位置,value为参数的名字字段 private static final String

2017-06-27 23:05:07 1737

原创 28、参数容器ParameterMapping介绍和解析

ParameterMappingParameterMapping的对应的xml内容<parameter property="" resultMap="" javaType="" typeHandler="" jdbcType="" mode="" scale=""></parameter>字段public class ParameterMapping { private Configurati

2017-06-27 23:04:25 4628

原创 27、ResultMap解析

ResultMap的解析入口由前面的文章分析,mapper文件的解析都是有XMLMapperBuilder完成的。 public void parse() { if (!configuration.isResourceLoaded(resource)) {//是否加载过此资源 configurationElement(parser.evalNode("/m

2017-06-27 23:03:56 1099

原创 26、Result解析之ResultMap(结果集)介绍

ResultMapResultMap(org.apache.ibatis.mapping.ResultMap)类——结果映射。它是结果集中的字段与类中属性的映射关系的集合,也就是结果集与类的映射关系。字段public class ResultMap { private Configuration configuration; //ResultMap的id private St

2017-06-27 23:02:59 2085

原创 25、Result解析之ResultMapping介绍

ResultMapping字段映射 一个ResultMapping实例对应ResultSet中一个字段到javaBean中一个属性的映射关系字段public class ResultMapping { private Configuration configuration; /** * 字段名 */ private String property;

2017-06-27 23:00:52 3607

原创 24、映射器注册器MapperRegisty

mapper文件入口加载mapper配置文件的入口在XMLConfigBuilder类中的mapperElement方法mapperElement方法 private void mapperElement(XNode parent) throws Exception { if (parent != null) { for (XNode child : par

2017-06-27 23:00:12 569

原创 23、Mapper解析之基于注解的总体过程

mapper文件入口加载mapper配置文件的入口在XMLConfigBuilder类中的mapperElement方法mapperElement方法 private void mapperElement(XNode parent) throws Exception { if (parent != null) { for (XNode child : par

2017-06-27 22:59:04 923

原创 22、动态 SQL

动态 SQL MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。if动态 SQL 通常要做的事情是有条件地包含 where 子句的一部分。比如:<select id="findA

2017-06-27 22:57:51 358

原创 21、参数的传递

参数传递mybatis的parameterType标签可以可定义传入的数据类型传入的类型分为以下几类 1. 基本数据类型(包括包装类型、String类型、Date类型) 2. List(Set)、Map 3. 实体类型传入单个参数的示例Dao层的方法 Author selectByPrimaryKey(Integer id);对应的mapper <select id="selectBy

2017-06-27 22:56:29 509

原创 20、结果集映射之一对多关联映射

多对一多个博客对应一个作者 作者public class Author { private Integer id; private String username; private String password; private String email; private String bio; private String favouriteSection

2017-06-27 22:55:41 611

原创 19、结果集映射之多对一关联映射

多对一多个博客对应一个作者 作者public class Author { private Integer id; private String username; private String password; private String email; private String bio; private String favouriteSection

2017-06-27 22:54:41 377

原创 18、结果集映射的简单使用

简单的ResultMap配置对应的Author实体类,此实体类已经进行过别名注册package com.lf.entity;import lombok.Data;import lombok.NoArgsConstructor;import lombok.ToString;@Data@ToString@NoArgsConstructorpublic class Author { pr

2017-06-27 22:54:03 559

原创 17、通用枚举类型处理(二)

问题要是我们一个项目特别大,有几十个甚至是上百个枚举呢,那怎么办,难道我要一个个在typeHandler里面去加,加一百几十行?!个人觉得非常麻烦,影响我们的开发速度,so,能不能实现我们想要的像扫描下枚举的所在的包目录就可以注册的枚举做自动转换呢?具体怎么实现?typeHandler的注册流程具体过程参考15切入点由Cosnfiguration对象得到typeHandlerRegistry管理器,

2017-06-26 23:44:21 901

原创 16、通用枚举类型处理(一)

官方介绍若想映射枚举类型 Enum,则需要从 EnumTypeHandler 或者 EnumOrdinalTypeHandler 中选一个来使用。比如说我们想存储取近似值时用到的舍入模式。默认情况下,MyBatis 会利用 EnumTypeHandler 来把 Enum 值转换成对应的名字。注意 EnumTypeHandler 在某种意义上来说是比较特别的,其他的处理器只针对某个特定的类,而它不同,

2017-06-26 23:43:25 2434

原创 15、处理枚举类型

官方介绍若想映射枚举类型 Enum,则需要从 EnumTypeHandler 或者 EnumOrdinalTypeHandler 中选一个来使用。比如说我们想存储取近似值时用到的舍入模式。默认情况下,MyBatis 会利用 EnumTypeHandler 来把 Enum 值转换成对应的名字。注意 EnumTypeHandler 在某种意义上来说是比较特别的,其他的处理器只针对某个特定的类,而它不同,

2017-06-26 23:41:59 669

空空如也

空空如也

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

TA关注的人

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