MyBatis SqlSession 源码深度剖析
SqlSession是 MyBatis 中最重要的接口之一,它定义了数据库会话的基本操作:执行 SQL、获取 Mapper 代理、事务控制等。本文将结合源码,深入剖析SqlSession的创建、内部实现、核心方法以及其与Executor、Configuration等组件的协作关系。
一、SqlSession 接口定义
publicinterfaceSqlSessionextendsCloseable{// 泛型查询方法:返回单个对象<T>TselectOne(Stringstatement);<T>TselectOne(Stringstatement,Objectparameter);// 查询列表<E>List<E>selectList(Stringstatement);<E>List<E>selectList(Stringstatement,Objectparameter);<E>List<E>selectList(Stringstatement,Objectparameter,RowBoundsrowBounds);// 查询并存入 Map<K,V>Map<K,V>selectMap(Stringstatement,StringmapKey);<K,V>Map<K,V>selectMap(Stringstatement,Objectparameter,StringmapKey);<K,V>Map<K,V>selectMap(Stringstatement,Objectparameter,StringmapKey,RowBoundsrowBounds);// 游标查询(大数据量)<CextendsCursor<T>>CselectCursor(Stringstatement);<CextendsCursor<T>>CselectCursor(Stringstatement,Objectparameter);<CextendsCursor<T>>CselectCursor(Stringstatement,Objectparameter,RowBoundsrowBounds);// 带结果处理器(自定义处理每行数据)voidselect(Stringstatement,Objectparameter,ResultHandlerhandler);voidselect(Stringstatement,ResultHandlerhandler);voidselect(Stringstatement,Objectparameter,RowBoundsrowBounds,ResultHandlerhandler);// 增删改intinsert(Stringstatement);intinsert(Stringstatement,Objectparameter);intupdate(Stringstatement);intupdate(Stringstatement,Objectparameter);intdelete(Stringstatement);intdelete(Stringstatement,Objectparameter);// 事务控制voidcommit();voidcommit(booleanforce);voidrollback();voidrollback(booleanforce);// 获取 Mapper 动态代理对象<T>TgetMapper(Class<T>type);// 获取当前会话的配置ConfigurationgetConfiguration();// 获取连接ConnectiongetConnection();// 清空本地缓存(一级缓存)voidclearCache();// 关闭会话voidclose();}可以看出,
SqlSession封装了几乎所有数据库交互的基础方法,是 MyBatis 面向开发者提供的最直接的 API。
二、SqlSession 的创建过程
SqlSession由SqlSessionFactory创建,通常使用DefaultSqlSessionFactory实现。
2.1 SqlSessionFactory.openSession()
// DefaultSqlSessionFactory.java@OverridepublicSqlSessionopenSession(){returnopenSessionFromDataSource(configuration.getDefaultExecutorType(),null,false);}privateSqlSessionopenSessionFromDataSource(ExecutorTypeexecType,TransactionIsolationLevel