序言
数据库,程序员永远要面对的开发环节。其重要性不言而喻。我从学习vb,delphi,再到java,数据库的技术接踵而至,odbc,ado,bde,jdbc,jdo,hibernate,还有好多吧。记得图形化编程中,多半使用控件开发,比如datasource,非常方便。而Java什么都是class的风格,在数据库上依然体现得淋漓尽致。 我从今天开始要边学这些数据库技术,边写些笔记。今天推出最熟悉的JDBC
一 JDBC(Java DataBase Connectivity)
在面向对象的数据库面前,JDBC是不是老了?我们今天还有必要学习JDBC吗?作为新人的你也许会这么问。首先,关系型数据库的资格和辈分在江湖上无人能撼动,就算它吃老本儿也要些许年,而我们现在要用数据库,这是事实。其次JDBC在访问关系型数据库的技术中,是出色的一个家伙。因为它不仅可以支持我们经常用到的那些种类繁多的数据库(即与供应商无关),而且还可以实现跨平台开发(即与平台无关)。 最重要的是,JDBC开发很简单,也很普遍。 不同的数据库厂商为JDBC提供了特定的驱动,因此,我们开始jdbc的第一步就是面对Driver的开发。
JDBC Drever--DriverManager
装载: 1 使用 -Dproperty=value参数传递命令行选项给Java应用程序 Java -Djdbc.drivers=jdbc.odbc.JdbcOdbcDriver queryDB
2 使用Class类的静态方法forName() Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver“); Class.forName(”COM.imaginary.sql.msql.MsqlDriver”); //mSQL
注册: Oracle Driver例子 Class.forName(“oracle.jdbc.driver.OracleDriver“); java.sql.DriverManager.registerDriver(new oracle.jdbc.driverOracleDriver());
打开: Connection DriverManager.getConnection(url,userid,password); con.close(); url的一般形式:jdbc:适当子协议://驱动程序特定的组件(机器名、端口、数据库名称); jdbc:适当子协议:@驱动程序特定的组件(机器名、端口、数据库名称);
获取数据: String sql=“select * from onetable“; Statement statement=con.createStatement(); ResultSet results=statement.executeQuery(sql); statement.colse();
获取动态SQL数据:: Stringsql=select name from idtable where id=?”; PreparedStatement prepStatement=con.prepareStatement(sql); prepStatement.setString(1,a_id); ResultSet rs=prepStmt.executeQuery();
RowSet独立处理问题: String sql=“select * from onetable“; RowSet rs=new CachedRowSet(); //JDBCRowSet 需要和数据库永久连接,CachedRowSet不需要 rs.setCommand(sql); rs.setUrl(url); rs.setUsername(userid); rs.setPassword(password); rs.execute(); ... rs.close();
结果集ResultSet 是否可以滚动: 由DatabaseMetaData对象决定所用的JDBCs是否支持可滚动ResultSet,它的一个方法supportsReseltSetType用来测试: DatabaseMetaData dbMD=connection.gtMetaData(); Boolean okiedoie=md.supportsResultSetType(ResultSet.TYPE_SCROLL_SENSITIVE); if (okiedoie){ Statement statement=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); } TYPE_SCROLL_SENSITIVE表示ResultSet可滚动并对其它对象引起的数据库变化敏感 CONCUR_UPDATABLE表示ResultSet可以在结果集中被更新
JDBC元数据 元数据是关于数据的数据。 DatebaseMetaData对象能够提供关于特定数据库的结构的信息。 ResultSetMetaData
JDBC数据源 使用Driver方式开发时,url是写死的,给维护带来许多不便。为了解决这一问题,JDBC2.0采用了利用JNDI映射实际数据源--DataSource的方式。
在接触数据源之前,先来介绍一下JNDI吧。
JNDI全称 Java Naming and Directory Interface。是为标准化对目录和命名服务的访问而设计的。 这些服务包括:NIS/NIS+,LDAP(Lightweight Directory Access Protocol),RMI(Java Remote Method Invocation)的reiregistry,CORBA Common Object Service(COS)名字服务 NDS、DNS、Windows注册表等等
命名服务(naming service)是计算机系统中的一个基本功能。命名服务是将名字和计算机中的一个对象相关联,通过名字可以方便地找到对应的对象。例如,计算机中的文件系统就包含了一个命名服务,你可以通过文件名找到对应的文件对象。 目录服务(directory service)是命名服务的延伸,目录服务不只保存对象和对象名的匹配,而且保存这个对象的各种属性,你可以对这些属性进行查询、修改、增加、删除操作。
JNDI结构包括两组API: JNDI API(Application Programming Interface),Java应用程序通过JNDI API访问各种命名目录服务。 JNDI SPI(Service Provider Interface),JNDI SPI使得各种命名目录服务透明地加入到JNDI结构中。
JNDI Context Context是一系列命名到对象绑定的集合,它提供了解析(即返回对象的查找操作)。其他操作包括:名称的绑定和取消绑定,列出绑定的名称。注意到一个上下文对象的名称可以绑定到有同样的命名约定的另一个上下文对象。这称之为子上下文。Context提供以下主要接口访问命名服务: bind(Name name, Object obj) 建立一个命名到一个对象的匹配关系,也叫绑定 lookup(String name) 通过命名查找其对应的对象 rebind(Name name, Object obj) 重新绑定一个命名到对象,覆盖原来的绑定 unbind(Name name) 解除这个命名到其匹配对象的绑定关系 ... ... 为了用名称从命名服务或目录中取得或解析对象,使用Context的lookup方法: Object obj=contxt.lookup(name)。
JDBC数据源--DataSource
配置数据源(Tomcat为例) server.xml: <Context path= docBase= debug= reloadable=> <Resource name=JNDI名 auth=Container或Application type= 类名/> <!--Container-容器管理 Application-Web应用管理--> <ResoureParams name=JNDI名 >
<parameter> <name>username</name> <value>Eric Han</value> </parameter> ... </ResoureParams> </Context>
web.xml: <resource-ref> <descrtiption>引用资源说明</descrtiption> <res-ref-name>引用资源的JNDI名</res-ref-name> <res-type>引用资源的类名</res-type> <res-auth>管理者</res-auth><!--Container-容器管理 Application-Web应用管理--> </resource-ref>
访问数据源 Context ctx=new InitialContext(); DataSource ds=(DataSource)ctx.lookup(”jdbc/one_mapping”); Connection con=ds.getConnection(); 
|