首页
Web开发
Windows程序
编程语言
数据库
移动开发
系统相关
微信
其他好文
会员
首页
>
数据库
> 详细
MyBatis源码分析(三)-SqlSession理解
时间:
2015-07-16 12:08:19
阅读:
213
评论:
0
收藏:
0
[点我收藏+]
标签:
SqlSession理解
一、创建SqlSession
1.创建事务
a.事务工厂根据DataSource创建一个事务对象(Connection对象,事务级别,是否自动提交)
b.事务工厂根据Connection创建一个事务对象(事务级别和是否自动提交已经被设置在Connection对象中)
c.系统默认的事务工厂是ManagedTransactionFactory,默认是关闭连接的 private boolean closeConnection = true;
2.创建Executor(statement)对象
a.根据配置文件中的ExecutorType决定创建Executor的类型(SIMPLE【SimpleExecutor】, REUSE【ReuseExecutor】, BATCH【BatchExecutor】)
b.如果配置cacheEnabled=true,则创建executor = new CachingExecutor(executor);
3.返回SqlSession,默认返回的是DefaultSqlSession对象(该对象维护Configuration对象、Executor对象、是否自动提交)
private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
Transaction tx = null;
try {
final Environment environment = configuration.getEnvironment();
final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);
final Executor executor = configuration.newExecutor(tx, execType);
return new DefaultSqlSession(configuration, executor, autoCommit);
} catch (Exception e) {
closeTransaction(tx); // may have fetched a connection so lets call close()
throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e);
} finally {
ErrorContext.instance().reset();
}
}
private SqlSession openSessionFromConnection(ExecutorType execType, Connection connection) {
try {
boolean autoCommit;
try {
autoCommit = connection.getAutoCommit();
} catch (SQLException e) {
// Failover to true, as most poor drivers
// or databases won‘t support transactions
autoCommit = true;
}
final Environment environment = configuration.getEnvironment();
final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
final Transaction tx = transactionFactory.newTransaction(connection);
final Executor executor = configuration.newExecutor(tx, execType);
return new DefaultSqlSession(configuration, executor, autoCommit);
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e);
} finally {
ErrorContext.instance().reset();
}
二.DefaultSqlSession对象,SqlSession对象的使用
(一)在使用DefaultSqlSession之前要现要求Mapper.xml的加载过程
对mapper节点的解析,XMLMapperBuilder对象进行xml文件解析和MapperBuilderAssistant对象将解析后的数据组装成对象交付给Configuration对象
1.传递mapper.xml文件路径、inputstream、Configuration对象
2.XMLMapperBuilder对象的configurationElement(parser.evalNode("/mapper"));解析mpper.xml文件
3.XMLMapperBuilder对象以buildStatementFromContext(context.evalNodes("select|insert|update|delete"));为例进行分析
4.XMLMapperBuilder对象的buildStatementFromContext(List<XNode> list, String requiredDatabaseId),主要是XMLStatementBuilder对象在干活
5.final XMLStatementBuilder statementParser = new XMLStatementBuilder(configuration, builderAssistant, context, requiredDatabaseId);
6.XMLStatementBuilder对象开始干活:statementParser.parseStatementNode();最终将所有的配置信息放到MapperBuilderAssistant对象中,然后由MapperBuilderAssistant把真实的MappedStatement放到Configuration对象中
(二)使用SqlSession的重要一步就是首先要根据ID获取MappedStatement
1.SqlSession session = sqlSessionFactory.openSession();
2.BoundBlogMapper mapper = session.getMapper(BoundBlogMapper.class);//真实是从Configuration对象中进行查找的
3.Blog b = mapper.selectSomething(1);
4.session.close();
MyBatis源码分析(三)-SqlSession理解
标签:
原文地址:http://my.oschina.net/lilloo/blog/479163
踩
(
0
)
赞
(
0
)
举报
评论
一句话评论(
0
)
登录后才能评论!
分享档案
更多>
2021年07月29日 (22)
2021年07月28日 (40)
2021年07月27日 (32)
2021年07月26日 (79)
2021年07月23日 (29)
2021年07月22日 (30)
2021年07月21日 (42)
2021年07月20日 (16)
2021年07月19日 (90)
2021年07月16日 (35)
周排行
更多
数据库进阶
2021-07-29
在 Oracle 数据库中执行 SQL 语句遇到特殊字符的转义方式
2021-07-28
Windows Logstash同步 Sqlserver 到Elasticsearch
2021-07-26
mysql数据库(11):恢复数据
2021-07-26
mysql数据库(9):常用查询的例子
2021-07-26
SQLAlchemy 多对多
2021-07-26
ClickHouse的JDBC连接
2021-07-26
Apache HBase 1.7.1 发布,分布式数据库
2021-07-26
数据库常用架构和同步工作原理
2021-07-26
MySQL数据库设计规范(仅供参考)
2021-07-26
友情链接
兰亭集智
国之画
百度统计
站长统计
阿里云
chrome插件
新版天听网
关于我们
-
联系我们
-
留言反馈
© 2014
mamicode.com
版权所有 联系我们:gaon5@hotmail.com
迷上了代码!