ibatis原理与源码分析

  //SqlMapClientBuilder的buildSqlMapClient(Reader reader)方法
public static SqlMapClient buildSqlMapClient(Reader reader) {
    return new SqlMapConfigParser().parse(reader);
  }

  //SqlMapConfigParser的parse(Reader reader)方法
  public SqlMapClient parse(Reader reader) {
    try {
      usingStreams = false;
      parser.parse(reader);//此处的parser是NodeletParser
      return state.getConfig().getClient();
    } catch (Exception e) {
      throw new RuntimeException("Error occurred.  Cause: " + e, e);
    }
  }
 在new SqlMapConfigParser()时就预先对配置文件xml的各个节点上要执行哪些事件做了定义(就是一些回调方法),放在NodeletParser对象的一个HashMap属性里,真正调用这些方法是在nodeletParser.parse(reader)里完成的。
执行上述操作后会把配置文件的详细属性存储到该SqlMapConfigParser对象的XmlParserState对象、XmlParserState对象持有的SqlMapConfiguration对象以及(SqlMapConfiguration持有的SqlMapClientImpl和SqlMapExecutorDelegate)。

SqlMapExecutor接口定义了CRUD等方法,SqlMapTransactionManager接口定义了跟事务相关的方法,SqlMapClient接口和SqlMapSession接口都继承了SqlMapExecutor和SqlMapTransactionManager。只是SqlMapClient增加了opensession等方法,SqlMapSession接口只增加了一个方法close()。

SqlMapSessionImpl对象和SqlMapClientImpl对象持有共同的委托对象SqlMapExecutorDelegate delegate.并且利用此委托对象实例化了一个sessionScope对象,然后对增删改查的调用均委托对象执行处理并传入这个跟线程绑定的sessionScope对象.

可在SqlMapConfig.xml里设置settings属性,具体有哪些属性,分别表示什么含义还不清楚。这些属性在ibatis启动后估计都保存在SqlMapExecutorDelegate对象里。
<settings
cacheModelsEnabled="false"
enhancementEnabled="false"
lazyLoadingEnabled="false"
/>

问题:
1,使用SqlMapClient的最佳实践,应该用单例,并发如何处理
2,事务。单个操作不需要手动控制,如果是多个操作,先startTransaction,执行多个操作后commitTransaction,最后还要endTransaction

参考:
1, ibatis源码简析
2, 实现ibatis的动态加载sqlmap配置文件
3, 深入分析 iBATIS 框架之系统架构与映射原理
4, Spring集成ibatis问题

你可能感兴趣的:(ibatis原理与源码分析)