浩哥解析MyBatis源码(七)——DataSource数据源模块之托管数据源
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6675700.html
1 回顾
之前介绍的非池型与池型数据源都是MyBatis自己定义的内部使用的数据源,在我们单独使用MyBatis框架架构系统的时候会使用到,但是这种情况不多见,因为MyBatis最常见的使用方式是与Spring进行整合使用,这时我们在项目中一般不会使用MyBatis内置的池型数据源,而是使用外部的C3P0或者DBCP之类的第三方数据源jar包,在整合第三方数据源的时候,我们就需要使用到MyBatis中专门提供的一个数据源工厂----JndiDataSourceFactory。
2 JNDI数据源
JNDI数据源只提供了一个JNDI数据源工厂:JndiDataSourceFactory,这个数据源的作用与事务模块中MANAGED类型的事务一致,也属于托管型,它用于在使用诸如与Spring容器整合的场合,在这种场合下,我们一般不会使用MyBatis提供的池型连接来进行数据库访问,而是使用较为专业的dbcp或c3p0来完成数据库访问,这时为了便于使这些外部定义的数据源整合到MyBatis的环境中,就需要使用这个JNDI数据源工厂来进行获取,这就是与外部数据源对接的接口。
也可以这么理解,这里只定义了数据源工厂,真正的数据源由外部来提供,这还是纯种的抽象工厂模式。
而MyBatis现在最流行的用法就是与Spring进行整合,所有这个类是使用最为频繁的,但是所有的是在均在源码中进行,对用户是完全透明的。这里我们单单解析这个数据源工厂,至于整合之后的情况以后讨论。
1 package org.apache.ibatis.datasource.jndi;
2 import java.util.Map.Entry;
3 import java.util.Properties;
4 import javax.naming.Context;
5 import javax.naming.InitialContext;
6 import javax.naming.NamingException;
7 import javax.sql.DataSource;
8 import org.apache.ibatis.datasource.DataSourceException;
9 import org.apache.ibatis.datasource.DataSourceFactory;
10 /**
11 * JNDI数据源工厂
12 * 这个数据源的实现是为了使用如 Spring 或应用服务器这类的容器, 容器可以集 中或在外部配置数据源,然后放置一个 JNDI 上下文的引用。
13 */
14 public class JndiDataSourceFactory implements DataSourceFactory {
15
16 public static final String INITIAL_CONTEXT = "initial_context";
17 public static final String DATA_SOURCE = "data_source";
18 //和其他数据源配置相似, 它也可以通过名为 “env.” 的前缀直接向初始上下文发送属性。 比如:
19 //env.encoding=UTF8
20 public static final String ENV_PREFIX = "env.";
21
22 private DataSource dataSource;
23
24 @Override
25 public void setProperties(Properties properties) {
26 try {
27 InitialContext initCtx = null;
28 Properties env = getEnvProperties(properties);
29 if (env == null) {
30 initCtx = new InitialContext();
31 } else {
32 initCtx = new InitialContext(env);
33 }
34
35 if (properties.containsKey(INITIAL_CONTEXT)
36 && properties.containsKey(DATA_SOURCE)) {
37 Context ctx = (Context) initCtx.lookup(properties.getProperty(INITIAL_CONTEXT));
38 dataSource = (DataSource) ctx.lookup(properties.getProperty(DATA_SOURCE));
39 } else if (properties.containsKey(DATA_SOURCE)) {
40 dataSource = (DataSource) initCtx.lookup(properties.getProperty(DATA_SOURCE));
41 }
42
43 } catch (NamingException e) {
44 throw new DataSourceException("There was an error configuring JndiDataSourceTransactionPool. Cause: " + e, e);
45 }
46 }
47
48 @Override
49 public DataSource getDataSource() {
50 return dataSource;
51 }
52
53 private static Properties getEnvProperties(Properties allProps) {
54 final String PREFIX = ENV_PREFIX;
55 Properties contextProperties = null;
56 for (Entry<Object, Object> entry : allProps.entrySet()) {
57 String key = (String) entry.getKey();
58 String value = (String) entry.getValue();
59 //和其他数据源配置相似, 它也可以通过名为 “env.” 的前缀直接向初始上下文发送属性。 比如:
60 //env.encoding=UTF8
61 if (key.startsWith(PREFIX)) {
62 if (contextProperties == null) {
63 contextProperties = new Properties();
64 }
65 contextProperties.put(key.substring(PREFIX.length()), value);
66 }
67 }
68 return contextProperties;
69 }
70
71 }
在这个工厂类中,很简单的定义了一个继承自DataSourceFactory的获取数据源的方法getDataSource()方法,用于获取外部创建的数据源实例。
再然后就是同样继承自DataSourceFactory的设置属性的方法,与非池型数据源工厂中类似,JNDI型数据源也可以通过前缀的方式设置一些数据源的属性来传递到数据源中,用来设置数据源的基本信息,所有有设置属性一方法存在。
在这个工厂中定义了一个上下文概念,JNDI数据源就是通过在外部数据源上覆盖一个上下文,即将数据源添加到某个上下文中,将这个上下文传递到工厂,由工厂从上下文中获取这个数据源,并通过getDataSource()被获取。
研究够了这个就可以明白如何进行针对MyBatis来整合的程序的开发。只要针对这个工厂来开发就行。
至此,有关数据源的解析就结束了,数据源模块与之前解析的事务模块为组装Environment环境的两个重要的唯二的模块,而Environment又是构建Configuration配置类的首要模块。
之后我们要接着解析Configuration构建所需的其他模块内容。
(未完待续哦!)
浩哥解析MyBatis源码(七)——DataSource数据源模块之托管数据源的更多相关文章
- 浩哥解析MyBatis源码(四)——DataSource数据源模块
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6634880.html 1.回顾 上一文中解读了MyBatis中的事务模块,其实事务操作无非 ...
- 浩哥解析MyBatis源码(十)——Type类型模块之类型处理器
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6715063.html 1.回顾 之前的两篇分别解析了类型别名注册器和类型处理器注册器,此二 ...
- 浩哥解析MyBatis源码(五)——DataSource数据源模块之非池型数据源
1 回顾 上一篇中我解说了数据源接口DataSource与数据源工厂接口DataSourceFactory,这二者是MyBatis数据源模块的基础,包括本文中的非池型非池型数据源(UnpooledDa ...
- 浩哥解析MyBatis源码(六)——DataSource数据源模块之池型数据源
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6675674.html 1 回顾 上一文中解读了MyBatis中非池型数据源的源码,非池型也 ...
- 浩哥解析MyBatis源码(八)——Type类型模块之TypeAliasRegistry(类型别名注册器)
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6705769.html 1.回顾 前面几篇讲了数据源模块,这和之前的事务模块都是enviro ...
- 浩哥解析MyBatis源码(二)——Environment环境
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6625612.html 本应该先开始说Configuration配置类的,但是这个类有点过于 ...
- 浩哥解析MyBatis源码(十一)——Parsing解析模块之通用标记解析器(GenericTokenParser)与标记处理器(TokenHandler)
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6724223.html 1.回顾 上面的几篇解析了类型模块,在MyBatis中类型模块包含的 ...
- 浩哥解析MyBatis源码(十二)——binding绑定模块之MapperRegisty
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6758456.html 1.回顾 之前解析了解析模块parsing,其实所谓的解析模块就是为 ...
- 浩哥解析MyBatis源码(九)——Type类型模块之类型处理器注册器(TypeHandlerRegistry)
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/6709157.html 1.回顾 上一篇研究的是类型别名注册器TypeAliasRegist ...
随机推荐
- 初识html5——试试博文编辑器
1.html5简介 HTML5 将成为 HTML.XHTML 以及 HTML DOM 的新标准. HTML 的上一个版本诞生于 1999 年.自从那以后,Web 世界已经经历了巨变. HTML5 仍处 ...
- FineUIMvc随笔 - 动态创建表格列
声明:FineUIMvc(基础版)是免费软件,本系列文章适用于基础版. 用户需求 用户希望实现动态创建表格列,在 WebForms 中,我们通过在 Page_Init 中创建列来实现: 但是在 MVC ...
- mysql uodate select子查询
UPDATE user SET pwd='123' WHERE id in ( SELECT id from user WHERE username = 'zx' ); 报错[Err] 1093 ...
- maven lean install 的时候出错 Failed to clean project
问题解决1 : 这种情况是属于 本地有多个 java 线程,关掉其中不用的,或者 都关闭就可以了. 问题解决 2 : Caused by: org.springframework.beans.f ...
- 面向对象 "一"
1:面向对象不是所有情况都适用. 2面向对象编程 a:定义类 calss Foo: 注意顶一个类的时候首字母必须是大写 def (方法一)(self,bb) pass b:根据创建对象,创建和Foo实 ...
- find、findIndex、indexOf、lastIndex、includes 数组五种查询条件方法介绍
find() 方法返回数组中满足提供的测试函数的第一个元素的值. 语法: arr.find(callback[, thisArg]) findIndex()方法返回数组中满足提供的测试函数的第一个元素 ...
- 基于Asp.Net Core Mvc和EntityFramework Core 的实战入门教程系列-4
来个目录吧: 第一章-入门 第二章- Entity Framework Core Nuget包管理 第三章-创建.修改.删除.查询 第四章-排序.过滤.分页.分组 第五章-迁移,EF Core 的co ...
- 软件测试之fault、error和failure的理解
(1) Identify the fault : The first element of the array is not looped. "for(int i=x.length-1;i ...
- 每天一个Linux命令 5
命令名称:touch 功能描叙:创建空文件 格式:touch 文件名 范例:$touch japan.list(当前路径创建) $touch /root/japan.list(指定路径创建) $t ...
- 3631: [JLOI2014]松鼠的新家
3631: [JLOI2014]松鼠的新家 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 707 Solved: 342[Submit][Statu ...