本文共 3610 字,大约阅读时间需要 12 分钟。
使用JDBC API的一个主要好处就是独立于数据库的编程,因为大部分JDBC应用程序都可以被轻易地转换到不同的数据库。然而,仍然有两个主要的内容与特定的数据库有关,即JDBC Driver类和JDBC URL。
随着JDBC API的升级,数据源技术的引入,可以提高数据库访问的灵活性。本质上,DataSource对象表示一个特殊的数据源。除了将数据库和专门的JDBC驱动程序信息封装到一个单独的,标准化的对象中之外,数据源可以作为Connection工厂,并为设置和获取DataSource对象进行成功操作所需要的特定属性提供方法。DataSource对象可能需要的一些标准属性包括:
n databaseName
n serverName
n portNumber
n username
n password
使用数据源的另一个好处就是和安全有关的敏感信息,如用户名,密码甚至数据库服务器只在一处编码,这可以由系统管理员完成。虽然和DataSource对象的交互可以用图形应用程序完成,但真正看到运行的示例是有指导性的。虽然DataSource对象的概念很简单,但为了在Java应用程序中使用,DataSource对象是使用Java名称和目录接口(JNDI)来引用的。
下面首先介绍下JNDI的相关概念。JNDI是个JAVA API,它包括名称和目录服务器的概念,道理和JDBC与数据库进行通讯的概念差不多。如:硬盘通过与磁道和扇区打交道工作,但用户只关心文件名和目录,文件系统管理名称服务,该服务将给定的文件名和硬盘上特定的位置相关联。另一个简单的示例就是Web,多数用户只关心Web站点的名称,如www.5itjob.com,并不关心底层的IP地址。然而,TCP/IP通讯是通过使用IP地址,而不是人类能看懂的名称进行的。两个表示法之间的转换是通过DNS(域名系统,Domain Name System)完成的。虽然JNDI用自己的方式提供了一个丰富和有用的API,我们的需求却简单得多。简短地说,我们需要知道怎样做四件事:
n 创建名称并将其绑定到一个Java对象
n 查询名称以检索Java对象
n 删除一个名称
n 重新绑定名称到一个新的Java对象
首先要先加载数据源的驱动程序。让环境变量classpath指向下面几个jar文件
2,代码如下:
import java.util.Hashtable;import javax.naming.*;import javax.naming.directory.*;import java.sql.*;import javax.sql.*;import com.microsoft.jdbcx.sqlserver.SQLServerDataSource;public class JNDIServer { // First we define the relevant parameters for this datasource private String serverName = "192.168.0.1"; private int portNumber = 1433; private String login = "student"; private String password = "student"; private String databaseName = "mydb"; private String filePath = "jdbc/mydatasource"; public JNDIServer() { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); try { // 创建初始化上下文环境 Context ctx = new InitialContext(env); // 如果filePath已经绑定过了,那么先解除绑定 ctx.unbind(filePath); // 创建SQLServerDataSource SQLServerDataSource ds = new SQLServerDataSource(); // 设置数据源的参数 ds.setServerName(serverName); ds.setPortNumber(portNumber); ds.setDatabaseName(databaseName); ds.setUser(login); ds.setPassword(password); ds.setDescription("JDBC DataSource Connection"); // 绑定 JDBC 数据源 ctx.bind(filePath, ds); ctx.close(); System.out.println("DataSource Created Success!"); } catch (Exception e) { e.printStackTrace(); } } public static void main(String args[]) { new JNDIServer(); }}
运行成功后,会在控制台打印:DataSource Created Success!
同时在运行该类所在的磁盘根目录下生成".bindings"文件,如下图:
数据源创建好之后,下面开始使用数据源。
代码如下:
import java.util.Hashtable;import javax.naming.*;import java.sql.*;import javax.sql.*;public class UseJNDI { public static void main(String args[]) { Connection con = null; try { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); Context ctx = new InitialContext(env); // 获得数据源对象 DataSource ds = (DataSource) ctx.lookup("jdbc/mydatasource"); // 通过数据源对象获得一个连接 con = ds.getConnection(); // 如果连接不成功,就会出现异常,不会执行下面这个语句 System.out.println("connect success!"); } catch (Exception e) { e.printStackTrace(); } finally { try { if (con != null)// 用完连接后,要关闭释放 con.close(); } catch (Exception e) { e.printStackTrace(); } } }
下面是删除JNDI的引用的代码:
import java.util.Hashtable;import javax.naming.*;import java.sql.*;import javax.sql.*;public class DeleteJNDI { public static void main(String[] args) { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); try { Context ctx = new InitialContext(env); ctx.unbind("jdbc/pubs"); ctx.close(); System.out.println("delete succeed!"); } catch (Exception ex) { System.err.println("ERROR: " + ex.getMessage()); } }}
转载地址:http://vzpbn.baihongyu.com/