分享
 
 
 

Java的数据库技术【1】

王朝java/jsp·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

序言

数据库,程序员永远要面对的开发环节。其重要性不言而喻。我从学习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();

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有