Java
2020-12-25 14:19:40 0 举报
AI智能生成
mybatis
作者其他创作
大纲/内容
集合
Collection
List
Vector
LinkedList
ArrayList
Set
SortedSet
TreeSet
HashSet
LinkedHashSet
Map
HashMap
LinkedHashMap
SortedMap(接口)
TreeMap
HashTable
Properties
ConcurrentHashMap
线程安全,1.7使用分段锁 1.8使用CAS+Synchronized
WeakHashMap
java基础
异常(Throwable)
Error(非检查时异常)
VritualMachineError
ThreadDeath
Exception
RunTimeException(非检查时异常)
NullPointException
ClassCastException
ArithmeticException
ArrayIndexOutOfBoundsException
非运行时异常
IOException
SQLException
用户自定义异常
分支主题
分支主题
Spring
事务
数据库事务的特征
原子性、一致性、隔离性、持久性
Mysql数据隔离级别
Read uncommttied 会导致 脏读、不可重复读、幻读
Read committed 会导致 不可重复读、幻读
Repeatable read 会导致 幻读
Serializable 最高隔离级别
事务的传播行为
支持当前事物
PROPAGATION_REQUIRED
如果有事务就支持当前事务,如果没有则开启一个事务
PROPAGATION_SUPPORTS
如果有事务,就支持该事务,没有则已非事务执行
PROPAGATION_MANDATORY
如果有事务,就支持该事务,没有则抛异常
不支持当前事物
PROPAGATION_REQUIRES_NEW
它会开启一个新的事务。如果一个事务已经存在,则先将这个存在的事务挂起。
内层事务和外层事务就像两个独立的事务,一旦内层事务提交了,外层事务不能对其回滚
内层事务和外层事务就像两个独立的事务,一旦内层事务提交了,外层事务不能对其回滚
PROPAGATION_NOT_SUPPORTED
总是非事务地执行,并挂起任何存在的事务
PROPAGATION_NEVER
总是非事务地执行,如果存在一个活动事务,则抛出异常。
其他情况
PROPAGATION_NESTED(嵌套事务)
如果一个活动的事务存在,则运行在一个嵌套的事务中
外层事务失败,会回滚内层事务
内层事务的失败并不会引起外层事务的回滚
子主题
mybatis
核心组件
SqlSessionFactoryBuilder(session工厂的构建器) 根据mybatis的xml配置生成DefaultSqlSessionFactory
Configuration的初始化
Environment
ExecutorType
mapperRegistry
SqlSessionFactory
实现类
DefaultSqlSessionFactory调用opensession方式创建sqlsession
执行器的类型
事务隔离级别
是否自动提交
SqlSessionManager
Sqlsession
DefaultSqlsession
SqlsessionManage
Executor
CachingExecutor
BaseExecutor
SimpleExecutor
ReuseExecutor
BatchExecutor
StatementHandler(mybatis的核心接口)
作用:1.创建Statement对象
2.为SQL 语句绑定实参
作用:1.创建Statement对象
2.为SQL 语句绑定实参
BaseStatementHandler 抽象类,主要实现了公共的方法
parameterHandler为sql的参数赋值
resultSetHandler 实现类为DefaultResultSetHandler
作用:1、处理Statement执行后产生的结果集,生成结果列表
2、处理存储过程执行后的输出参数
作用:1、处理Statement执行后产生的结果集,生成结果列表
2、处理存储过程执行后的输出参数
SimpleStatementHandler 实现类,主要对应JDBC中的Statement接口,用于简单SQL的处理;
PreparedStatementHandler 实现类,主要对应JDBC中的PreparedStatement,处理预编译SQL的接口;
RoutingStatementHandler 直接实现类,上述三个实现类的路由类,没有实际操作,只是负责上面三个StatementHandler的创建及调用。
整体架构
接口层
sqlsession
数据处理层
配置解析,解析mybatis配置信息和mapper.xml
解析工具(BaseBuilder)
XMLConfigBuilder
XMLMapperBuilder
MapperBuilderAssistant
XMLStatementBuilder
子主题
解析器(XPathParser)
Document(Document 对象代表整个 XML 文档,是一棵文档树的根,可为我们提供对文档数据的最初(或最顶层)的访问入口。)
validation(设置解析器在解析文档的时候是否校验文档,在创建DocumentBuilderFactory实例对象时进行设置。)
entityResolver(解析mybatis的xml文档,默认加载文件头联网的xml地址)
XPath(解析xml的语言)
variables(配置参数集合)
mapper节点的解析
parameterMap
resultMap
sql
select|insert|update|delete
参数映射
MapperMethod
SqlCommand(sql命令,包括调用sql的对应接口全类名和sql类型)封装了SQL标签的类型 insert update delete select
MethodSignature一个内部类 封装了方法的参数信息 返回类型信息等
convertArgsToSqlCommandParam(MethodSignature的内部方法,对mapper接口的参数进行
解析,如果是多个则包装成map类型)
解析,如果是多个则包装成map类型)
sql解析
prepareStatement(将参数的值赋值到boundSql中的sql占位符中)
sql执行
ResultSetWrapper rsw = getFirstResultSet(stmt) 调用JDBC 拿到结果集ResultSet 并且封装到ResultSetWrapper中
结果集映射
handleResultSet 根据规则(resultMap)处理,将结果集转化成Object并保存到multipleResults
* 核心流程 1.handleRowValues 处理结果集
* 2.multipleResults.add 添加结果集到集合中
* 核心流程 1.handleRowValues 处理结果集
* 2.multipleResults.add 添加结果集到集合中
基础支持层
RoctetMq
异步线程
创建线程池的方式
newCachedThreadPool 创建一个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程。
newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。
newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。
newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。
自定义线程池 ThreadPoolExecutor
参数
核心线程数、最大线程数、最长存活时间、存活时间的单位、阻塞队列、线程工厂、拒绝策略
拒绝策略
AbortPolicy 一直抛出异常
DiscardPolicy 抛弃这个线程
DiscardOldestPolicy 在线程池未关闭的情况下,他是丢弃队列中等待时间最久的任务,然后把当前任务加入到队列中等待执行
CallerRunsPolicy 由调用者线程去执行这个任务
创建线程的几种方式
继承Thread/Thread内部用lamda表达式
实现runnable接口
带返回结果 实现Callable接口 Future是一个接口,是无法生成一个实例的,所以又有了FutureTask。FutureTask实现了RunnableFuture接口,RunnableFuture接口又实现了Runnable接口和Future接口。所以FutureTask既可以被当做Runnable来执行,也可以被当做Future来获取Callable的返回结果。
锁
锁分类
1.乐观锁/悲观锁
2.公平锁/非公平锁
3.可重入锁
4.独享锁/共享锁
5.互斥锁/读写锁
6.偏向锁/轻量级锁/重量级锁(锁的状态)
7.分段锁(锁的设计)
8.自旋锁
2.公平锁/非公平锁
3.可重入锁
4.独享锁/共享锁
5.互斥锁/读写锁
6.偏向锁/轻量级锁/重量级锁(锁的状态)
7.分段锁(锁的设计)
8.自旋锁
死锁的条件
互斥条件:一个资源每次只能被一个进程使用。
占有且等待:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
不可强行占有:进程已获得的资源,在末使用完之前,不能强行剥夺。
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
占有且等待:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
不可强行占有:进程已获得的资源,在末使用完之前,不能强行剥夺。
循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
redis
基本数据类型
String
底层使用SDS
List
linkedlist、ziplist
Hash
ziplist、dict
Set
intset(所有的元素都是整数)/dict
SortSet
dict+skipList 数据较少时用zipList
基本数据结构
SDS
链表(linkedlist)
字典(dict)
跳跃表(skipList)
整数集合(intSet)
压缩列表(zipList)
0 条评论
下一页