




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ibatis3 出来也很久了 但一直觉得不如旧版好用 发现 spring 对 ibatis 的支持相比 hibernate 也简 单得多 于是简单分析了下 ibatis 的源码 我们知道应用程序里面使用 ibatis 简单点就如下几句 com ibatis sqlmap client SqlMapClient sqlMap null java io Reader reader mon resources Resources getResourceAsReader sql config xml sqlMap SqlMapClientBuilder buildSqlMapClient reader 我们从 SqlMapClientBuilder buildSqlMapClient 着手 SqlMapClientBuilder 中 new 了一个 SqlMapConfigParser 类来解析输入流信息 并最终实例化一个 SqlMapClient 返回 public static SqlMapClient buildSqlMapClient Reader reader return new SqlMapConfigParser parse reader 1 SqlMapConfigParser 类的解析类的解析 废话不多 贴代码 public class SqlMapConfigParser protected final NodeletParser parser new NodeletParser private XmlParserState state new XmlParserState private boolean usingStreams false public SqlMapConfigParser addSqlMapConfigNodelets public SqlMapClient parse Reader reader try usingStreams false parser parse reader return state getConfig getClient catch Exception e throw new RuntimeException Error occurred Cause e e private void addSqlMapConfigNodelets parser addNodelet sqlMapConfig end new Nodelet public void process Node node throws Exception state getConfig finalizeSqlMapConfig 当调用 parse 时 主要执行了两步操作 parser parse reader 和 return state getConfig getClient 前者解析 xml 文档并将解析结果存储到 state 中 后者根据解析结果生成一个 SqlMapClient 实例返回 那 NodeletParser 和 XmlParserState 是怎么关联起来的呢 我们看到 SqlMapConfigParser 的构造函数中调用了一系列 add 方法 这些方法主要向成员变量 NodeletParser parser 中添加一些回调处理类 当 NodeletParser 中解析 完成后调用这些回调方法将结果存储 到 XmlParserState state 以及 state 持有的 config 对象中 实际上 XmlParserState 持有一个 SqlMapConfiguration config 对象 并且此 config 早已生成好 SqlMapClientImpl 对象 最后将解析结果设置进去 SqlMapConfiguration 对象生成了最主要两个类 SqlMapExecutorDelegate 和 SqlMapClientImpl 的 实例 代码如下 public class SqlMapConfiguration private static final Probe PROBE ProbeFactory getProbe private ErrorContext errorContext private SqlMapExecutorDelegate delegate private TypeHandlerFactory typeHandlerFactory private SqlMapClientImpl client private Integer defaultStatementTimeout public SqlMapConfiguration errorContext new ErrorContext delegate new SqlMapExecutorDelegate typeHandlerFactory delegate getTypeHandlerFactory client new SqlMapClientImpl delegate registerDefaultTypeAliases 2 实现类实现类 SqlMapClientImpl SqlMapClientImpl 对象一般系统只生成一个 那么此对象是怎么处理线程安全的呢 首先我主要看一下源码中最主要的几个接口 SqlMapSession SqlMapClient SqlMapExecutor SqlMapTransactionManager UML 描述如下 SqlMapExecutor 定义了 CRUD 等方法 SqlMapTransactionManager 定义了跟事务相关的方法 SqlMapClient 接口和 SqlMapSession 接口都继承了 SqlMapExecutor SqlMapTransactionManager 只是 SqlMapClient 增加了 opensession 等方法 SqlMapSession 接口只增加了一个方法 close 然后看实现类 SqlMapClientImpl 我们看到此类此有一个委托类 SqlMapExecutorDelegate 和一个 ThreadLocal 对象 public SqlMapExecutorDelegate delegate protected ThreadLocal localSqlMapSession new ThreadLocal public SqlMapClientImpl SqlMapExecutorDelegate delegate this delegate delegate public Object insert String id Object param throws SQLException return getLocalSqlMapSession insert id param protected SqlMapSessionImpl getLocalSqlMapSession SqlMapSessionImpl sqlMapSession SqlMapSessionImpl localSqlMapSession get if sqlMapSession null sqlMapSession isClosed sqlMapSession new SqlMapSessionImpl this localSqlMapSession set sqlMapSession return sqlMapSession 显然 ThreadLocal 是存放各个线程的 session 然后看 SqlMapClientImpl 的 insert 方法 此方法实际上调用了 session 实现类 SqlMapSessionImpl 的 insert 方法 那么 SqlMapSessionImpl 类是怎么处理的呢 SqlMapSessionImpl 实现了 SqlMapSession 跟 SqlMapClientImpl 有共同的实现接口 SqlMapExecutor SqlMapTransactionManager 看源码可知此类与 SqlMapClientImpl 持有共同的委托对象 SqlMapExecutorDelegate delegate 并且利用此委托对象实例化了一个 sessionScope 对象 然后对增删改查的调用均委托对象执行处理并传入这个跟线程绑定的 sessionScope 对象 public class SqlMapSessionImpl implements SqlMapSession protected SqlMapExecutorDelegate delegate protected SessionScope sessionScope protected boolean closed public SqlMapSessionImpl SqlMapClientImpl client this delegate client getDelegate this sessionScope this delegate beginSessionScope public Object insert String id Object param throws SQLException return delegate insert sessionScope id param SessionScope 类 由源码可知此类主要保存了了执行会话一些有关的东西 public class SessionScope private static long nextId private long id Used by Any private SqlMapClient sqlMapClient private SqlMapExecutor sqlMapExecutor private SqlMapTransactionManager sqlMapTxMgr private int requestStackDepth Used by TransactionManager private Transaction transaction private TransactionState transactionState Used by SqlMapExecutorDelegate setUserProvidedTransaction private TransactionState savedTransactionState Used by StandardSqlMapClient and GeneralStatement private boolean inBatch Used by SqlExecutor private Object batch private boolean commitRequired private Map preparedStatements 3 委托类委托类 SqlMapExecutorDelegate 此类持有各种根据 xml 解析得来的 sql 信息 由前面介绍的 SqlMapConfigParser 中的回调类置入 还持有一个事务管理器 TransactionManager txManager 和一个 sql 执行类 SqlExecutor sqlExecutor 以及一些类型工厂 代码如下 public class SqlMapExecutorDelegate private static final Probe PROBE ProbeFactory getProbe private boolean lazyLoadingEnabled private boolean cacheModelsEnabled private boolean enhancementEnabled private boolean useColumnLabel true private boolean forceMultipleResultSetSupport private TransactionManager txManager private HashMap mappedStatements private HashMap cacheModels private HashMap resultMaps private HashMap parameterMaps protected SqlExecutor sqlExecutor private TypeHandlerFactory typeHandlerFactory private DataExchangeFactory dataExchangeFactory public List queryForList SessionScope sessionScope String id Object paramObject int skip int max throws SQLException List list null 根据传入的 id 获取具体的 MappedStatement 对象 每个 MappedStatement 对象对应 xml 中的一个 id 存放每个执行块的具体信息传入出参数和 sql 执行语句 MappedStatement ms getMappedStatement id 获得 sessionScope 中的事务对象 Transaction trans getT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年上海市疾病预防控制中心(上海市预防医学科学院)初级岗位公开招聘考前自测高频考点模拟试题及答案详解(名校卷)
- 2025安康市石泉县幼儿园招聘(2人)考前自测高频考点模拟试题及答案详解(考点梳理)
- 2025北京市大兴区教育委员会所属事业单位第二批招聘教师251人考前自测高频考点模拟试题带答案详解
- 2025北京市海淀区育鹰小学招聘5人模拟试卷及完整答案详解
- 2025年阜阳颍上县人民医院公开招聘社会化用人48人考前自测高频考点模拟试题及1套参考答案详解
- 2025年河北秦皇岛昌黎第一中学招聘教师若干名模拟试卷及1套完整答案详解
- 2025年甘肃省平凉市灵台县粮油购销储备有限责任公司招聘会计人员模拟试卷及1套完整答案详解
- 2025年德州武城县公开招聘省属公费师范毕业生(36名)考前自测高频考点模拟试题带答案详解
- 2025河南洛阳市偃师区第一批公益性岗位招聘40人考前自测高频考点模拟试题及参考答案详解1套
- 2025广西城轨工程建设有限公司招聘20人考前自测高频考点模拟试题及答案详解1套
- 中医围手术期护理
- 2025年辽宁高考地理试卷真题答案详解讲评课件(黑龙江吉林内蒙古适用)
- 演员签约剧组合同协议
- 《决策分析法DEMATEL课件》
- 装修公司投资协议书
- 大学英语四级考试大纲
- 数字技术赋能下的小学语文课堂创新实践
- 中药塌渍操作方法
- 中科低碳新能源技术学院(能源工程系) 氢能技术应用专业:新版人才培养方案
- 道路工程材料第7版 课件5 水泥混凝土
- 幼儿园秋季预防病
评论
0/150
提交评论