原创作品,可以转载,但是请标注出处地址: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数据源模块之托管数据源的更多相关文章

  1. Mybatis源码解析,一步一步从浅入深(七):执行查询

    一,前言 我们在文章:Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码的最后一步说到执行查询的关键代码: result = sqlSession.selectOne(command.ge ...

  2. mybatis源码-解析配置文件(三)之配置文件Configuration解析

    目录 1. 简介 1.1 系列内容 1.2 适合对象 1.3 本文内容 2. 配置文件 2.1 mysql.properties 2.2 mybatis-config.xml 3. Configura ...

  3. Mybatis源码解析,一步一步从浅入深(四):将configuration.xml的解析到Configuration对象实例

    在Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码中我们看到了XMLConfigBuilder(xml配置解析器)的实例化.而且这个实例化过程在文章:Mybatis源码解析,一步一步从浅 ...

  4. Mybatis源码解析(一) —— mybatis与Spring是如何整合的?

    Mybatis源码解析(一) -- mybatis与Spring是如何整合的?   从大学开始接触mybatis到现在差不多快3年了吧,最近寻思着使用3年了,我却还不清楚其内部实现细节,比如: 它是如 ...

  5. Mybatis源码解析(二) —— 加载 Configuration

    Mybatis源码解析(二) -- 加载 Configuration    正如上文所看到的 Configuration 对象保存了所有Mybatis的配置信息,也就是说mybatis-config. ...

  6. Mybatis源码解析,一步一步从浅入深(一):创建准备工程

    Spring SpringMVC Mybatis(简称ssm)是一个很流行的java web框架,而Mybatis作为ORM 持久层框架,因其灵活简单,深受青睐.而且现在的招聘职位中都要求应试者熟悉M ...

  7. Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码

    在文章:Mybatis源码解析,一步一步从浅入深(一):创建准备工程,中我们为了解析mybatis源码创建了一个mybatis的简单工程(源码已上传github,链接在文章末尾),并实现了一个查询功能 ...

  8. Mybatis源码解析(四) —— SqlSession是如何实现数据库操作的?

    Mybatis源码解析(四) -- SqlSession是如何实现数据库操作的?   如果拿一次数据库请求操作做比喻,那么前面3篇文章就是在做请求准备,真正执行操作的是本篇文章要讲述的内容.正如标题一 ...

  9. 【MyBatis源码解析】MyBatis一二级缓存

    MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级),尤其是对于一些相 ...

  10. Mybatis源码解析-DynamicSqlSource和RawSqlSource的区别

    XMLLanguageDriver是ibatis的默认解析sql节点帮助类,其中的方法其会调用生成DynamicSqlSource和RawSqlSource这两个帮助类,本文将对此作下简单的简析 应用 ...

随机推荐

  1. Lab keepalived

    [root@node1 keepalived]#cat keepalived.conf ! Configuration File for keepalived global_defs { notifi ...

  2. unic

    在线考试 答题剩余时间0小时51分18秒 考生须知 1.本次考试结束后,剩余补考次数:2次 2.考试时间为60分钟,超时系统自动交卷 3.本次考试满分100分(5*20道),60分通过考试 1. (单 ...

  3. 探寻TP-Link路由器的登录验证

    提示:该案例仅供学习使用,切勿滥用!!! 查找路由器连接地址 查找ip $ ifconfig enp2s0: flags=<UP,BROADCAST,RUNNING,MULTICAST> ...

  4. 跨域资源共享(CROS)

    跨域资源共享(CROS) 同源策略(Same Origin Policy, SOP) 同源策略允许运行在页面的脚本可以无限制的访问同一个网站(同源)中其他脚本的任何方法和属性.当不同网站页面(非同源) ...

  5. Django积木块八——三级联动

    三级联动 前端需要的效果,省之后市之后现,创建model,查询所有的省的信息,json传到前面,之后通过省的id找到对应的市,是用异步实现的. # model class Sheng(models.M ...

  6. Charles配置抓取HTTPS请求的Android配置

    关于android手机在mac版charles上抓不到包这个问题困扰了很久,查阅了很多资料,发现是android7.0系统安全策略问题. Charles抓包正常流程1.在手机上配置证书 点击后:直接在 ...

  7. Kali 2017 使用SSH进行远程登录 设置 ssh 开机自启动

    一.配置SSH参数 修改sshd_config文件,命令为: vi /etc/ssh/sshd_config 输入“ /Pass ”回车搜索 找到#PasswordAuthentication no的 ...

  8. R_展示变量之间关系的图形

    #绘制普通矩阵散点图 plot(dataframe) #绘制带有拟合直线,最佳拟合曲线和直方图的矩阵散点图 library(car) attach(dataframe) scatterplotMatr ...

  9. Android使用ViewPager+PhotoView实现图片查看器

    可实现功能效果说明: 可实现多张图片点击放大,手指控制,左右滑动,多张图片点击任意位置定位显示任意位置图片:无动画,可自己加 效果图:                             核心代码 ...

  10. python 字典详细使用

    1. 字典 字典是无序.可变序列. 定义字典时,每个元素的键和值用冒号分隔,元素之间用逗号分隔,所有的元素放在一对大括号“{}”中. 字典中的键可以为任意不可变数据,比如整数.实数.复数.字符串.元组 ...