自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 11.插件

1.Mybatis插件概述插件机制是为了对MyBatis现有体系进行扩展 而提供的入口。底层通过动态代理实现。可供代理拦截的接口有四个:Executor:执行器StatementHandler:JDBC处理器ParameterHandler:参数处理器ResultSetHandler:结果集处理器这四个接口已经涵盖从发起接口调用到SQl声明、参数处理、结果集处理的全部流程。接口中任何一个方法都可以进行拦截改变方法原有属性和行为。不过这是一个非常危险的行为,稍不注意就会破坏MyBatis核心逻

2021-10-24 22:34:00 146

原创 10.结果集映射

1 ResultSetHandler简介处理Statement执行后产生的结果集,生成结果列表处理存储过程执行后的输出参数public interface ResultSetHandler { // 将Statement执行后产生的结果集(可能有多个结果集)映射为结果列表 <E> List<E> handleResultSets(Statement var1) throws SQLException; <E> Cursor<E&g

2021-10-24 22:33:08 691

原创 8.ParameterHandler

1.JDBC参数处理使用JDBC操作数据库时,以PreparedStatement为例:PreparedStatement statement = connection.prepareStatement(sql);statement.setInt(0, 0);statement.setByte(1, (byte) 0);statement.setBoolean(2, false);statement.setBigDecimal(3, new BigDecimal(25000.98));stat

2021-09-21 23:41:02 363

原创 7.StatementHandler

1.StatementHandler概要MyBatis一个基于JDBC的Dao框架,会话、执行器半点没有提到jdbc,原因是MyBatis把所有跟JDBC相关的操作全部都放到了StatementHandler中。一个SQL请求会经过会话,然后是执行器,最由StatementHandler执行jdbc最终到达数据库。其关系如下图:这里要注意这三者之间比例是1:1:n。也就是说多个SQL操作对应一个会话,和唯一的执行器以及N个StatementHandler。这里的N取决于通过会话调用了多少次Sql(命

2021-09-21 23:39:57 361

原创 9.MetaObject

1.MetaObject功能MetaObject类相当于一个工具类,Mybatis在sql参数设置和结果集映射里经常使用到这个对象。映射是指结果集中的列填充至JAVA Bean属性。这就必须用到反射,而Bean的属性 多种多样的有普通属性、对象、集合、Map都有可能。为了更加方便的操作Bean的属性,MyBatis提供了MeataObject 工具类,其简化了对象属性的操作。其具体功能如下:查找属性:勿略大小写,支持驼峰、支持子属性 如:blog.comment.user_name(需要开启use

2021-09-21 23:39:03 1882

原创 6.二级缓存

1.二级缓存概述前一章节介绍了一级缓存即会话级别的缓存,同一个会话SqlSession才能共享缓存。如果多个 SqlSession 需要共享缓存,则需要开启二级缓存,开启二级缓存后,会使用 CachingExecutor 装饰 Executor,进入一级缓存的查询流程前,先在CachingExecutor 进行二级缓存的查询。二级缓存也称作是应用级缓存,与一级缓存不同的,是它的作用范围是整个应用,而且可以跨线程使用。所以二级缓存有更高的命中率,适合缓存一些修改较少的数据。在流程上是先访问二级缓存,再访问

2021-09-05 00:50:51 1132

原创 5.一级缓存

1.mybatis 缓存概述myBatis中存在两个缓存,一级缓存和二级缓存。一级缓存:也叫做会话级缓存,生命周期仅存在于当前会话,不可以直接关闭。但可以通过flushCache和localCacheScope对其做相应控制。二级缓存:也叫应用级性缓存,缓存对象存在于整个应用周期,而且可以跨线程使用。关于二级缓存将在后续章节,详细说明。文本先聚焦一级缓存。首先来看如何才能命中一级缓存。2.一级缓存的存储形式一级缓存是以Map形式存在的key-value。存在于BaseExecutor的局部变

2021-09-05 00:46:56 362

原创 4.Executor执行器

1.Executor 主体结构Executor是MyBatis执行者接口,执行器的功能包括:基本功能:改、查,没有增删的原因是,所有的增删操作都可以归结到改。缓存维护:这里的缓存主要是为一级缓存服务,功能包括创建缓存Key、清理缓存、判断缓存是否存在。事物管理:提交、回滚、关闭、批处理刷新。Executor 的生命周期和 SqlSession 是一样的,之所以要明确的指出这一点是因为 Executor 中包含了缓存的处理,并且因为 SqlSession 是线程不安全的。对于这个接口MyBat

2021-09-05 00:46:35 797

原创 3.sqlSession

1.SqlSessionFactorySqlSessionFactory是MyBatis的关键对象。SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象类获得,而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。同时SqlSessionFactory也

2021-09-05 00:42:59 660

原创 2.configuration解析

1. 配置文件初始化mybatis 中包含了很多的配置项,具体每一项的讲解 官网 也很详细,对配置项解析后由Configuration 类维护configuration(配置)properties(属性)settings(设置)typeAliases(类型别名)typeHandlers(类型处理器)objectFactory(对象工厂)plugins(插件)environments(环境配置)environment(环境变量)transactionManager(事务管理器)da

2021-09-05 00:42:30 1876

原创 1.mybatis结构总览

1、mybatis简单 demo@Beforepublic void beforeMybatis() throws IOException { String resource = "com/scarecrow/mybatis/config/mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); Properties properties = new Properties()

2021-09-05 00:41:56 214

原创 JAVA并发:未分析知识

原子操作类ForkJoin

2021-01-03 21:11:03 59

转载 JAVA并发:ThreadPoolExecutor

前言现在在实现异步时,基本都是使用线程池来实现,线程池在工作应用的还是比较频繁的,本文将就线程池的使用、相关原理和主要方法源码进行深入讲解学习。线程池的基本使用package com.joonwhee.concurrent;import java.util.ArrayList;import java.util.List;import java.util.concurrent.Callable;import java.util.concurrent.ExecutorService;impor

2021-01-02 23:58:08 137

转载 JAVA并发:ThreadLocal

前言ThreadLocal的作用是提供线程内的局部变量,这种变量在多线程环境下访问时能够保证各个线程里变量的独立性。ThreadLocal无论在项目开发还是面试中都会经常碰到,本文就ThreadLocal的使用、主要方法源码详解、内存泄漏问题展开讨论。1.基本使用package com.joonwhee.imp;/** * demo * @author joonwhee * @date 2018年2月24日 */public class ThreadLocalDemo { publ

2020-12-13 21:42:47 93

转载 HashMap JDK1.8源码分析

前言JDK 1.8 对 HashMap 进行了比较大的优化,底层实现由之前的 “数组+链表” 改为 “数组+链表+红黑树”,本文就 HashMap 的几个常用的重要方法和 JDK 1.8 之前的死循环问题展开学习讨论。JDK 1.8 的 HashMap 的数据结构如下图所示,当链表节点较少时仍然是以链表存在,当链表节点较多时(大于8)会转为红黑树。几个点:先了解以下几个点,有利于更好的理解 HashMap 的源码和阅读本文。1、本文中头节点指的是 table 表上索引位置的节点,也就是链表的头节

2020-12-13 18:49:23 93

转载 JAVA并发:ConcurrentLinkedQueue

概述ConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,采用FIFO的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾;当我们获取一个元素时,它会返回队列头部的元素。用CAS实现非阻塞的线程安全队列。ConcurrentLinkedQueue 的非阻塞算法实现主要可概括为下面几点:使用 CAS 原子指令来处理对数据的并发访问,这是非阻塞算法得以实现的基础。head/tail 并非总是指向队列的头 / 尾节点,也就是说允许队列处于不一致状态。 这个特性把

2020-12-13 00:39:37 1731

转载 数据结构:二叉堆

​ 本篇博客我们介绍另外一种数据结构——堆,注意这里的堆和我们Java语言,C++语言等编程语言在内存中的“堆”是不一样的,这里的堆是一种树,由它实现的优先级队列的插入和删除的时间复杂度都为O(logN),这样尽管删除的时间变慢了,但是插入的时间快了很多,当速度非常重要,而且有很多插入操作时,可以选择用堆来实现优先级队列。1、堆的定义①、它是完全二叉树,除了树的最后一层节点不需要是满的,其它的每一层从左到右都是满的。注意下面两种情况,第二种最后一层从左到右中间有断隔,那么也是不完全二叉树。②

2020-11-27 22:26:29 126

原创 JAVA并发:阻塞队列

在并发编程中,有时候需要使用线程安全的队列。如果要实现一个线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法。使用阻塞算法的队列可以用一个锁(入队和出队用同一把锁)或两个锁(入队和出队用不同的锁) 等方式来实现。非阻塞的实现方式则可以使用循环CAS的方式来实现。下面分析的是阻塞队列。1.什么是阻塞队列阻塞队列是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。支持阻塞的插入方法:当队列满时,队列会阻塞插入元素的线程,直到队列不满。支持阻塞的移除方法:当

2020-11-26 23:31:27 159

原创 JAVA并发: ConcurrentHashMap

文章目录1.并发下的HashMap1.1存在的问题1.2解决办法2.ConcurrentHashMap的使用3.ConcurrentHashMap的源码分析3.1JDK1. .7 7 和 J J8 dk1.8 版本的变化3.2重要成员变量3.3put操作3.3.1initTable数组初始化3.3.2tabAt获取bucket3.3.3addCount存储元素的个数3.3.3.1CounterCells 解释3.3.3.2fullAddCount3.3.3.3sumCount元素的个数3.3.4tran

2020-11-22 23:40:24 2146 1

原创 JAVA并发:并发工具类CountDownLatch、CyclicBarrier、Semaphore使用及源码分析

在 JUC 下包含了一些常用的同步工具类,今天就来详细介绍一下,CountDownLatch,CyclicBarrier,Semaphore 的使用方法以及它们之间的区别。1 CountDownLatch1.1 功能描述CountDownLatch是一个同步工具类,用来协调多个线程之间的同步。它允许一个或多个线程一直等待,直到其他线程的操作执行完毕再执行CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个

2020-10-10 00:06:30 325

原创 JAVA并发: ReentrantLock之Condition

1 Condition的基本使用在前面学习synchronized 的时候,有讲到 wait/notify的基本使用,结合 synchronized可以实现对线程间的通信,JUC并发包里面提供的同样的功能。Condition 是一个多线程协调通信的工具类里面提供了await/signal方法,可以让某些线程一起等待某个条件(condition),只有满足条件时,线程才会被唤醒。1.1 简单案例public class LockConditionDemo { private static R

2020-09-23 23:54:58 494

原创 JAVA并发: ReentrantReadWriterLock读写锁

概述​ 读写锁之前提到锁(如Mutex和Reentrant Lock) 都是排他锁, 这些锁在同一时刻只允许一个线程进行访问, 而读写锁在同一时刻可以允许多个读线程访问,但是在写线程访问时,所有的读线程和其他写线程均被阻塞。读写锁维护了一对锁,一个读锁和一个写锁,通过分离读锁和写锁,使得并发性相比一般的排他锁有了很大提升。​ 除了保证写操作对读操作的可见性以及并发性的提升之外,读写锁能够简化读写交互场景的编程方式。假设在程序中定义一个共享的用作缓存数据结构,它大部分时间提供读服务(例如查询和搜索),

2020-09-20 00:25:38 212

原创 JAVA并发: ReentrantLock独占锁

概述介绍java并发包中的Lock锁的基本使用与实现细节。1 Lock接口lock锁可以实现和synchroinzed关键字类似的同步功能。Synchronized是关键字,内置语言实现,Lock是接口。Lock在使用的时候需要显示的去获取锁与释放锁,缺少比synchroinzed关键字的获取释放锁的便捷性。Synchronized在线程发生异常时会自动释放锁,因此不会发生异常死锁。Lock异常时不会自动释放锁,所以需要在finally中实现释放锁。Lock是可以中断锁,Synchroniz

2020-09-20 00:24:37 203

原创 JAVA并发: cpu缓存、volatile原理与内存模型

1. volatile的应用1.1 volatile的定义Java ,为了确保共享变量能被准确和一致的更新,线程应该确保通过排它锁单独获取这个变量。java语言提供了volatile,在某些情况下比加锁更加方便。如果一个字段被声明为volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。1.2 通过代码演示volatile的使用public class VolatileDemo { private static boolean stop = true; pu

2020-09-20 00:24:03 253

原创 JAVA并发:线程安全与Synchorinzed

1. 什么是线程安全问题线程的合理使用能够提升程序的处理性能,主要有两个方面,第一个是能够利用多核 cpu 以及超线程技术来实现线程的并行执行;第二个是线程的异步化执行相比于同步执行来说,异步执行能够很好的优化程序的处理性能提升并发吞吐量。同时也带来了很多麻烦。如:多线程对于共享变量访问带来的安全性问题一个变量 i,假如一个线程去访问这个变量进行修改,这个时候对于数据的修改和访问没有任何问题。但是如果多个线程对于这同一个变量进行修改,就会存在一个数据安全性问题。对于线程安全性,本质上是管理对于数据状态

2020-09-20 00:23:26 459

原创 JAVA并发:并发的基础

1. 创建线程1.1 Thread类和Runnable接口1.1.1 继承Thread类public class ThreadDemo { static class ChildThread extends Thread { @Override public void run() { System.out.println("childThread"); } } public static void mai

2020-09-20 00:22:16 212

空空如也

空空如也

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

TA关注的人

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