- 浏览: 685988 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (297)
- J2SE (78)
- swt/飞信 (20)
- mysql/mssql (17)
- 设计模式 (5)
- windows (18)
- 闲言碎语 (19)
- struts 1.x (6)
- JVM (6)
- tomcat/jetty (8)
- jquery/javascript (15)
- web前端 (6)
- J2EE (0)
- PHP (6)
- 算法设计 (17)
- 数据结构 (3)
- C/C++ (6)
- linux (19)
- 程序打包 (8)
- eclipse/myeclipse (10)
- 其他杂项 (13)
- 应聘 (9)
- spring/spring mvc (4)
- Maven/Ant (2)
- ERROR (1)
- nosql/hbase (1)
- hibernate (3)
- Solr/Lucene (1)
最新评论
-
乔木1937:
太感谢了,看到你的文章终于解决这个问题了!
[转载]通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。错误:“Connection refused: connect。 -
xianweisi:
竟然还有马
精简JRE - 实例Swing计算器 with 精简JRE(续) -
Javkburd:
我刚也遇到这个问题,然后也把默认端口改成了1433,只差最后没 ...
[转载]通过端口 1433 连接到主机 localhost 的 TCP/IP 连接失败。错误:“Connection refused: connect。 -
yeshaoting:
kingbinchow 写道 最近的爪哇岛 没有什么货进项呀 ...
jQuery方法区别(四)click() bind() live() delegate()区别 -
kingbinchow:
最近的爪哇岛 没有什么货进项呀!
jQuery方法区别(四)click() bind() live() delegate()区别
11. 利用反射机制建立数据库连接
解析数据库数据源配置文件(.xml),利用反射机制将配置文件中设置的数据源参数设置到 Class 类实例中,然后将该 Class 类实例强制转换成对应的数据源类。
1. 自定义数据源配置文件data-source-config.xml
简单提出一些约束条件。这些约束在解析该数据源配置文件时用到。
<?xml version="1.0" encoding="UTF-8"?>
<!-- quote from struts-config.xml -->
<!--
数据源配置文件几点约束:
1. <data-sources>节点下定义了一套数据源<data-source>[JDBC 2.0 Standard Extension]
2. 节点拼写大小写敏感,目前有且只有三级节点
3. 只允许有一个根节点<data-sources>
4. 出现多个 id 的<data-source>节点,以第一个为准
数据源查找方式:
1. <data-source>节点数 < 1, 即节点数为0
未设置数据源,报错
2. 默认数据源方式
<data-source>节点未设置 id 属性值或 id 属性值为null的<data-source>
3. 指定数据源方式
匹配<data-source>节点 id 属性值
-->
<data-sources>
<data-source type="org.apache.commons.dbcp.BasicDataSource">
<set-property property="driverClassName" value="com.mysql.jdbc.Driver" />
<set-property property="url" value="jdbc:mysql://localhost:3306/mydb" />
<set-property property="username" value="root" />
<set-property property="password" value="root" />
<set-property property="maxActive" value="30" />
<set-property property="maxIdle" value="10" />
<set-property property="maxWait" value="1000" />
</data-source>
</data-sources>
2. 解析配置文件
利用 XML 解析工具包解析配置文件。本文采用 jdom 来解析配置文件。
全局变量:
/**
* Copyright (c) 2011 Trusted Software and Mobile Computing(TSMC)
* All right reserved.
*
* Created on Aug 19, 2011 6:37:38 PM
* http://jarg.iteye.com/
* Author: Jarg Yee <yeshaoting@gmail.com>
*/
/** 配置文件路径 */
private static final String CONFIG = "data-source-config.xml";
/** 默认配置数据源 id 属性值 */
private static final String DEFAULT_ID = "null";
/** 配置文件节点属性名 */
private static final String ATT_TYPE = "type";
private static final String ATT_ID = "id";
private static final String ATT_PROPERTY = "property";
private static final String ATT_VALUE = "value";
private static final String ATT_REF = "ref";
/** 配置文件节点名 */
private static final String NODE_DATA_SOURCES = "data-sources";
private static final String NODE_DATA_SOURCE = "data-source";
private static final String NODE_SET_PROPERTY = "set-property";
/** 反射机制获取方法名前缀 */
private static final String PREFIX_SET = "set";
private static final String PREFIX_GET = "get";
/** 二种基本类型 */
private static final String TYPE_INT = "int";
private static final String TYPE_LONG = "long";
2.1 初始化配置文件
加载自定路径的配置文件,该路径是相对于类加载目录的路径。
Eclipse C/S项目中相对于classpath和bin目录,Eclipse B/S项目中相对于classpath和WebRoot/classes目录。
关键代码:
/**
* 初始化配置
* */
private void initConfig(String config)
{
InputStream in = this.getClass().getClassLoader().getResourceAsStream(config);
SAXBuilder builder = new SAXBuilder();
try
{
Document doc = builder.build(in);
root = doc.getRootElement();
}
catch (Exception e)
{
System.out.println("配置文件" + config + "丢失");
e.printStackTrace();
}
}
2.2 选择数据源节点
循环获取数据源节点<data-source>属性 id 值与传入的数据源节点 id 值匹配,获取对应的数据源节点。
关键代码:
/**
* 需要加上 "" ,否则无法与null匹配成功
* 不知道什么原因
* */
for(int i=0; i<dataSources.size(); i++)
{
Element element = dataSources.get(i);
if(id.equals("" + element.getAttributeValue(ATT_ID)))
{
dataSourceElement = element;
}
}
2.3 创建、设置、获取数据源实例
[创建数据源实例] 先获取数据源type属性值(声明数据源类完全限定名称),通过这个完全限定名称字符串创建 Class 类实例。
[设置数据源实例] 再获取当前数据源节点<datab-source>下所有属性设置节点<set-property>;
然后获取每个属性设置节点<set-property>的name、value属性值,根据name值获取字段类型。
不同类型值转换过程通过getMatchValue()方法来实现,其用途是:
a. 利用反射机制获取对应的setter方法的方法getMethod(),需要setter方法参数类型
b. value属性值读出来的是String类型(可以看作是Object类型),需要转换成setter方法对应的类型值。
例如:org.apache.commons.dbcp.BasicDataSource.BasicDataSource 中setMinIdle()方法:
public synchronized void setMinIdle(int minIdle)
[获取数据源实例] 最后,通过invoke()方法完成setter方法调用,将属性设置节点<set-property>属性值通过相应的setter方法设置到 Class 类实例相应的属性中。将 Class 类实例强制转换成 DataSource(所有数据源类的父类),返回。
关键代码:
/**
* 设置数据源数据
* @param dataSourceElement Element - 选择的数据源节点
* @throws Exception
* */
private DataSource newInstance(Element dataSourceElement) throws Exception
{
String type = dataSourceElement.getAttributeValue(ATT_TYPE);
if(type == null)
{
throw new Exception("未定义数据源类型");
}
Class<?> clazz = Class.forName(type);
Object obj = clazz.newInstance();
List<Element> properties = dataSourceElement.getChildren(NODE_SET_PROPERTY);
for(int i=0; i<properties.size(); i++)
{
Element property = properties.get(i);
String name = property.getAttributeValue(ATT_PROPERTY);
if(name == null)
{
throw new Exception("未定义属性名");
}
String value = property.getAttributeValue(ATT_VALUE);
if(value == null)
{
throw new Exception("未定义属性值");
}
/** 为了获取参数类型 */
Field field = clazz.getDeclaredField(name);
Class<?> fieldType = field.getType();
String methodName = getMethodName(PREFIX_SET, name);
Method method = clazz.getMethod(methodName, fieldType);
method.invoke(obj, getMatchValue(fieldType, value));
}
return (DataSource)obj;
}
/**
* 获取与字段类型相匹配的值
* */
private Object getMatchValue(Class<?> fieldType, String value)
{
/**
* 目前只有二类基本类型转换
* */
if(fieldType.getName().equals(TYPE_INT))
{
return Integer.parseInt(value);
}
else if(fieldType.getName().equals(TYPE_LONG))
{
return Long.parseLong(value);
}
else
return value;
}
2.4 建立数据库连接
通过上一步返回的数据源javax.sql.DataSource(这是一个接口)实例调用getConnection()方法建立数据库连接。
关键代码:
/**
* 获取指定数据源的数据库
* @throws Exception
* */
protected static Connection getConnection(DataSourceConfig dataSourceConfig, String id)
throws Exception
{
return dataSourceConfig.getDataSource(id).getConnection();
}
2.5 提供获取数据库连接用户接口
封装具体的数据库内部实现,将相关方法权限设置为 protected 。
利用getConnection(String id)获取指定数据源的数据库连接。
关键代码:
/**
* 获取指定数据源的数据库连接
* 不支持自定义用户名,密码方式
* @param id String
* */
public Connection getConnection(String id)
{
Connection conn = null;
try
{
conn = DataSourceConfig.getConnection(dataSourceConfig, id);
}
catch (Exception e)
{
e.printStackTrace();
}
return conn;
}
- ex2.rar (1011.9 KB)
- 下载次数: 4
发表评论
-
Java - Convert String to enum
2012-11-17 22:03 1912http://stackoverflow.com/que ... -
[ERROR]Premature end of file
2012-09-28 11:41 3350[ERROR]Premature end of file ... -
测试java.util.Map.Entry
2012-07-18 16:13 1021/** * Copyright (c) 201 ... -
关于eclipse启动出错问题的解决办法
2012-06-09 09:31 1485转自:http://blog.csdn.net/jkpt ... -
Myeclipse中把java代码导成UML类图
2012-05-18 14:53 2371MyEclipse 中选择window,在 Open ... -
[转载]java synchronized详解
2012-05-15 17:18 868http://www.cnblogs.com ... -
[转载]Java 根据 HashMap 的 value 进行排序
2012-05-08 09:58 952转载:http://www.oschina.net/co ... -
JAVA实时屏幕监控
2012-04-29 16:13 3324JAVA实时屏幕监控 说明: 本程序会运 ... -
[JAVA实时屏幕监控]JAVA使用Internet代理设置
2012-04-29 14:50 1387JAVA使用Internet代理设置 描述:首先 ... -
[JAVA实时屏幕监控]JAVA通过注册表获取Internet代理设置
2012-04-29 14:47 2338JAVA通过注册表获取Internet代理设置 ... -
[JAVA实时屏幕监控]JAVA发送邮件
2012-04-29 14:28 2507JAVA发送邮件 描述:利用commons-em ... -
[JAVA实时屏幕监控]JAVA屏幕截图
2012-04-29 14:19 1318JAVA屏幕截图 /** * 产生截图 ... -
[JAVA实时屏幕监控]Java使用代理服务器
2012-04-24 13:36 2490/** * Copyright (c) 2012 T ... -
java.util.ConcurrentModificationException解决办法
2012-04-23 10:47 1583java.util.ConcurrentModi ... -
[转载]java.util.ConcurrentModificationException
2012-04-23 09:20 976java.util.ConcurrentModif ... -
整数转换成字节型数组
2012-04-22 13:16 6017整数转换成字节型数组 描述: 整数(in ... -
java.lang.NoClassDefFoundError: javax/mail/Message解决方法
2012-04-18 10:33 1269缺少activation.jar 和 mail.jar ... -
设置javax.swing.JFrame窗口外观
2012-03-29 15:34 0设置javax.swing.JFrame窗口外 ... -
设置javax.swing.JFrame窗口外观
2012-03-29 15:34 0设置javax.swing.JFrame窗口 ... -
Java图形界面外观包substance.jar
2012-03-29 15:33 0一直以来都认为用Swing做出来的程序 ...
相关推荐
在Hibernate中,类反射机制扮演着关键角色,尤其是在初始化SessionFactory和建立数据库连接的过程中。 首先,让我们了解反射的基本使用。在Java中,`Class`类代表了运行时的类信息,我们可以使用`Class.forName()`...
2. 建立连接:通过`DriverManager.getConnection()`方法建立数据库连接,通常需要提供URL、用户名和密码。 3. 创建Statement:`Connection`对象的`createStatement()`方法创建`Statement`对象,用于执行SQL语句。 ...
在“反射连接数据库”的场景中,我们利用反射机制动态地创建对象并调用其方法,以实现与MySQL数据库的交互,从而避免硬编码SQL语句,提高代码的灵活性和可维护性。 首先,我们需要理解Java JDBC(Java Database ...
2. 数据库连接:使用JDBC建立数据库连接,获取Connection对象。 3. 数据库操作:创建Statement或PreparedStatement对象,执行SQL,处理ResultSet。 4. 反射应用:根据XML映射信息,使用反射动态地实例化对象,设置...
通过JDBC,我们可以建立数据库连接,执行SQL语句,然后将结果集转换为Java对象,以便于填充到Excel表格中。 **文件列表解析**: 1. **poi-ooxml-schemas-3.9-20121203.jar**:包含OOXML(Office Open XML)的模式...
在实现上,我们可以使用反射机制动态地加载不同的数据库驱动,以支持Oracle、MySQL和SQL Server。反射是Java语言的一个强大特性,允许在运行时检查类的信息并调用私有方法。在连接数据库时,我们可以根据需要连接的...
频繁地建立和断开数据库连接不仅效率低下,还可能导致性能瓶颈。为了解决这一问题,引入了数据库连接池的概念。连接池能够预先创建并维护一定数量的数据库连接,供应用程序按需使用。尽管市场上存在多种现成的连接池...
- 在构造函数中,首先通过反射机制加载指定的 JDBC 驱动,然后通过 `DriverManager.getConnection()` 方法创建数据库连接。 - 如果在加载驱动或创建连接过程中出现异常,则捕获异常并输出错误信息“数据库连接失败...
2. **建立数据库连接**:使用`DriverManager.getConnection()`方法,传入数据库URL、用户名和密码,获取`Connection`对象。 3. **预编译SQL语句**:创建`PreparedStatement`对象,通过`Connection.prepareStatement...
1. **数据库连接**:DLL通常会提供一个类,如`DBConnection`,用于管理到SQL Server数据库的连接。这个类可能包含`Open()`、`Close()`方法,以打开和关闭数据库连接,以及`ConnectionString`属性,用于设置连接字符...
接下来,以MySQL数据库为例,我们需要建立一个数据库连接池,如C3P0或HikariCP,以便高效地管理和复用数据库连接。同时,需要设计一个SQL语句生成器,它可以解析实体类和方法参数,生成对应的SQL。 在Windows 10...
通过反射机制实例化指定的数据库驱动类,这是建立数据库连接的前提条件。 ##### 4. 建立连接 ```java public boolean creatConnection() { try { con = DriverManager.getConnection(url, userName, password); ...
在Java JDBC中,通常我们会先加载数据库驱动的Class,然后通过反射调用`DriverManager.getConnection()`方法建立数据库连接。 "JspLoginDemo"和"JspLoginDemoByModel1"可能是两个基于JSP的登录示例,其中一个可能...
以下是建立数据库连接的示例代码: * Oracle 数据库(thin 模式):`String url="jdbc:oracle:thin:@localhost:1521:orcl";` * SQL Server 数据库:`String url="jdbc:microsoft:sqlserver://localhost:1433;...
这行代码的作用是通过反射机制加载Oracle JDBC驱动。需要注意的是,如果类路径(classpath)中不存在该驱动程序,则会抛出`ClassNotFoundException`异常。 2. **使用`DriverManager.registerDriver()`方法**: ```...
1. **数据库连接**:首先,我们需要建立与数据库的连接。这通常通过JDBC(Java Database Connectivity)来完成。在这个例子中,`DBSession.getConnection()` 方法用于获取数据库连接。 2. **查询元数据**:为了获取...
在`main`方法中,通过调用`ConnectDB.connect()`方法来尝试建立数据库连接,并根据返回的结果判断连接是否成功: ```java if (ConnectDB.connect() == null) { System.out.println("数据库驱动失败"); } else { ...
#### 二、建立数据库连接 成功加载驱动后,下一步是使用`DriverManager`类的`getConnection()`方法来建立与数据库的实际连接。这个方法接受三个参数:URL、用户名和密码。URL用于指定数据库的具体位置和类型,格式...
这通常涉及到Java的反射机制和数据库操作技术。 首先,Java反射机制是Java语言提供的一种强大的功能,允许程序在运行时检查和修改自身的结构和行为。在本场景中,它被用来动态获取Bean类的属性(字段)和方法,这些...