[转]
http://www.blogjava.net/usherlight/archive/2010/02/01/311493.html
IBatis2中提供了3种DataSource的配置:JNDI, Apache DBCP, IBatis自带的SimpleDataSource。但在IBatis3中只提供了两种DataSource: UNPOOLED, POOLED。
如果要实现自定义的DataSource,就需要通过扩展DataSourceFactory。本文就演示一下这个过程。
准备工作:Connection Pool的选择,通过搜索发现目前比较流行的免费数据库连接池主要有3种:Apache DBCP, C3P0, Proxool。
看了一下,Proxool的最新版本是0.9.1(2008-08-23), C3P0的最新版本是0.9.1.2(2007-05-21), DBCP最新版本是1.2.2(2007-04-04)
好像这3个项目都已经挺长时间没有更新了。但是总体评价上C3P0无论从稳定上还是效率上都要好一点。
(具体这3个项目谁更优秀,并不是本文的重点,本文主要是介绍一下如何在IBatis3中自定义数据源)
大致步骤:
1、实现org.apache.ibatis.datasource.DataSourceFactory接口,主要是2个方法
a、public DataSource getDataSource() 如何具体地得到一个数据源
b、public void setProperties(Properties properties) 如何设置数据源的参数属性
2、实现javax.sql.DataSource,这个就是提供给DataSourceFactory的实例
3、在IBatis3中引用新加入的数据源
1. 从代码中可以看出,IBatis3与IBatis2不同,不再通过一个Configuration类来进行数据源属性的设置,而是使用反射机制直接调用数据源的方法来设置参数。
这就要求配置文件中的参数名称必须与数据源类中的方法名匹配.
public class C3p0DataSourceFactory implements DataSourceFactory {
private DataSource dataSource;
public C3p0DataSourceFactory() {
dataSource = new C3p0DataSource();
}
public DataSource getDataSource() {
return dataSource;
}
public void setProperties(Properties properties) {
Properties driverProperties = new Properties();
MetaObject metaDataSource = MetaObject.forObject(dataSource);
for (Object key : properties.keySet()) {
String propertyName = (String) key;
if (propertyName.startsWith(DRIVER_PROPERTY_PREFIX)) {
String value = properties.getProperty(propertyName);
driverProperties.setProperty(propertyName
.substring(DRIVER_PROPERTY_PREFIX_LENGTH), value);
} else if (metaDataSource.hasSetter(propertyName)) {
String value = (String) properties.get(propertyName);
Object convertedValue = convertValue(metaDataSource,
propertyName, value);
metaDataSource.setValue(propertyName, convertedValue);
} else {
throw new DataSourceException("Unkown DataSource property: "
+ propertyName);
}
}
if (driverProperties.size() > 0) {
metaDataSource.setValue("driverProperties", driverProperties);
}
}
@SuppressWarnings("unchecked")
private Object convertValue(MetaObject metaDataSource, String propertyName,
String value) {
Object convertedValue = value;
Class targetType = metaDataSource.getSetterType(propertyName);
if (targetType == Integer.class || targetType == int.class) {
convertedValue = Integer.valueOf(value);
} else if (targetType == Long.class || targetType == long.class) {
convertedValue = Long.valueOf(value);
} else if (targetType == Boolean.class || targetType == boolean.class) {
convertedValue = Boolean.valueOf(value);
}
return convertedValue;
}
private static final String DRIVER_PROPERTY_PREFIX = "driver.";
private static final int DRIVER_PROPERTY_PREFIX_LENGTH = DRIVER_PROPERTY_PREFIX.length();
}
2. 数据源类,其中的一堆setter就是用于设置属性的
public class C3p0DataSource implements DataSource {
private ComboPooledDataSource dataSource;
public C3p0DataSource() {
this.dataSource = new ComboPooledDataSource();
}
public Connection getConnection() throws SQLException {
return dataSource.getConnection();
}
public Connection getConnection(String username, String password)
throws SQLException {
return dataSource.getConnection(username, password);
}
public PrintWriter getLogWriter() throws SQLException {
return dataSource.getLogWriter();
}
public int getLoginTimeout() throws SQLException {
return dataSource.getLoginTimeout();
}
public void setLogWriter(PrintWriter out) throws SQLException {
dataSource.setLogWriter(out);
}
public void setLoginTimeout(int seconds) throws SQLException {
dataSource.setLoginTimeout(seconds);
}
public synchronized void setDriver(String driver) {
try {
dataSource.setDriverClass(driver);
} catch (Exception e) {
}
}
public void setUrl(String url) {
dataSource.setJdbcUrl(url);
}
public void setUsername(String username) {
dataSource.setUser(username);
}
public void setPassword(String password) {
dataSource.setPassword(password);
}
public void setInitialPoolSize(int initialPoolSize) {
dataSource.setInitialPoolSize(initialPoolSize);
}
public void setMaxPoolSize(int maxPoolSize) {
dataSource.setMaxPoolSize(maxPoolSize);
}
public void setMinPoolSize(int minPoolSize) {
dataSource.setMinPoolSize(minPoolSize);
}
public void setPreferredTestQuery(String preferredTestQuery) {
dataSource.setPreferredTestQuery(preferredTestQuery);
}
public void setPoolPingQuery(String poolPingQuery) {
dataSource.setPreferredTestQuery(poolPingQuery);
}
}
3. 在配置文件Configuration.xml中,可以先定义数据源的别称,然后就象POOLED和UNPOOLED一样使用别称来引用数据源。
<Configuration>
...
<typeAlias>
<typeAlias type="com.test.datasource.C3p0DataSourceFactory" alias="C3P0"/>
</typeAlias>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="C3P0">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<property name="poolPingQuery" value="${pingquery}"/>
</dataSource>
</environment>
</environments>
...
<Configuration>
分享到:
相关推荐
本篇文章将详细讲解如何在iBatis中集成c3p0数据库连接池,以及c3p0的基本配置和使用。 iBatis是一个轻量级的持久层框架,它允许开发者将SQL语句直接写在配置文件中,方便灵活。而c3p0则是一个开源的JDBC连接池,它...
标题 "ibatis-2.3.0.677增加对c3p0连接池的支持" 描述了MyBatis框架的一个更新,其中包含了对c3p0数据库连接池的集成。MyBatis是一个轻量级的Java持久层框架,它允许开发者将SQL语句直接嵌入到Java代码中,提供了比...
总结:这个集成框架结合了WebWork的轻量级MVC、iBatis的灵活数据库操作、Spring的全面企业级服务以及C3P0的数据库连接池,为Java开发提供了强大的工具集合,能够构建出高效、稳定且易于维护的企业应用。通过深入理解...
同时,需要在`SqlMapConfig.xml`中配置数据源和事务管理器,以便ibatis能够正确地连接数据库并执行SQL语句。 #### 五、ibatis的jar包 ibatis的运行需要一系列的jar包,包括但不限于: - `commons-dbcp.jar`:...
配置文件以XML格式编写,遵循DTD(Document Type Definition)规范,用于定义ibatis环境的设置和数据源的连接方式。 ```xml <!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" ...
在ibatis框架中,`sqlMapConfig.xml`是一个非常重要的配置文件,它主要用于设置ibatis的全局配置信息,包括数据库连接信息、环境配置以及其它运行时参数等。下面将对这个文件中的关键元素进行详细的解析。 ##### ...
标题中提到的“常用ibatis配置”指的是在使用iBatis这一数据持久层框架中,常见的配置用法和技术点。iBatis(现称为MyBatis)是一个流行的Java持久层框架,它通过使用XML或注解的方式,将SQL语句与对象进行映射,...
### ibatis配置文件信息 #### 一、简介 在Java开发领域中,ibatis(现称为MyBatis)是一款优秀的持久层框架,它通过XML或注解的方式将接口方法与SQL语句绑定起来,实现对象关系映射(ORM)功能。ibatis的主要优势...
2. **全局配置文件设置**:在`mybatis-config.xml`中,需要配置数据库连接信息,例如数据源(DataSource)、环境(Environment)、事务管理器(TransactionManager)和SqlSessionFactory。例如: ```xml ...
在Spring框架中,数据库连接管理是非常关键的一部分,有效的连接池配置可以提高应用的性能和稳定性。本文将深入探讨如何在Spring环境下配置几种常用的数据库连接池,包括HikariCP、Druid和Apache DBCP2。 一、...
总结起来,Ibatis配置文件模板是构建Ibatis项目的基础,`SqlMap.properties`提供数据库连接信息,`SqlMapConfig.xml`负责全局配置,而JavaBean的映射文件则定义了数据库操作与Java对象的对应关系。理解并熟练掌握...
在使用IBatis.net时,首要任务是配置数据库连接。全局配置文件SqlMapConfig.xml是IBatis的入口,用于配置数据源、事务管理器等信息。例如,对于MySQL数据库,可以在SqlMapConfig.xml中添加如下配置: ```xml , ...
2. `src/main/resources`:放置配置文件,如Spring的`applicationContext.xml`和`sqlMapConfig.xml`,以及数据库连接配置等。 3. `src/main/webapp`:Web应用目录,包含静态资源(如HTML、CSS、JavaScript),以及...
动态查询语句配置是Ibatis的一个重要特性,它允许我们在运行时根据业务需求构建灵活多变的SQL语句。这篇博文主要探讨的是如何在Ibatis中设置和使用动态SQL,以便实现更高效、更灵活的数据查询。 首先,我们需要理解...
在这个“osgi数据库连接demo”中,我们将探讨如何在OSGi环境中配置C3P0作为Oracle数据库连接池,并集成iBATIS作为数据访问层。 首先,C3P0是一个开源的JDBC连接池,它提供了一些额外的功能,如自动管理数据库连接、...
根据提供的文件信息,本文将详细解析如何在Spring与ibatis框架整合时,通过特定配置来保留ibatis事务处理机制,并实现对事务的自定义控制。文章将围绕标题、描述及部分代码片段展开讨论。 ### Spring与ibatis整合...
在Spring、iBatis、Hibernate等框架中,DBCP可以通过配置文件或编程方式轻松集成,为应用提供高效、可靠的数据库连接管理。同时,Tomcat服务器也可以通过JNDI配置使用DBCP,为Web应用提供数据库连接服务。
标题 "ibatis配置文件自动加载组件" 涉及的核心技术是MyBatis的自动配置加载功能,这在开发过程中极大地提高了效率,使得开发者无需每次修改XML映射文件后手动重启服务。MyBatis是一个优秀的Java持久层框架,它简化...
总结来说,SpringMVC与iBatis的整合主要涉及数据库连接配置、SqlSessionFactory与SqlSessionTemplate的设置、Mapper接口的扫描以及在Controller中的使用。这个过程使得我们在开发过程中能够充分利用Spring的依赖注入...