第一种:通过
ODBC
连接数据库
JAVA
语言的跨平台的工作能力(
Write Once ,Run Anywhere
)、优秀的图像处理能力
(
我相信现在没有那种语言可以超过
JAVA
在网络上的图形处理能力
)
、网络通信功能、通过
JDBC
数据库访问技术等等,让我们谁都不可否认
JAVA
语言是
SUN
公司对于计算机界的一个巨大的贡献。笔者可以描述这样一个场景:有一天你上网完全可以不用
IE
或者
NETSCAPE,
上网就像是玩游戏,你可以获得游戏那么精美的图像和互动的感觉,如果你玩过
UO,
也许你就知道那种感觉了,但是
JAVA
做成的东西一定会超过
UO
的,因为不单单是游戏,也不是单单是浏览器,如果你愿意(要你有钱,有时间,有优秀的
JAVA
人才)你可以把所有的这一切用
Java
完全集成出来!!!我不是夸大
JAVA
的功能,大家可以访问一下
http://www.simchina.net
的那个社区程序,你就能找到一种感觉了:相信我没有说什么假话
。好了,不说废话了,现在我向你介绍
JAVA
的数据库访问技术
----JDBC
数据库访问技术(你可千万不要搞成
ODBC
了哟!)。
JDBC
技术事实上是一种能通过
JAVA
语言访问任何结构化数据库的应用程序接口
(API)(Sun
这样说的,我也不知道是不是真的
),
而且现在的
JDBC 3.0
据
Sun
说也能访问
Execel
等电子表格程序
!
JDBC
对于数据库的访问有四种方式,我们这里只是介绍两种:
第一种是通过
ODBC
做为
“
桥
”(Bridge)
对数据库访问,第二种是直接对数据库访问。
我们先来看看第一种
JDBC<-->ODBC
访问的流程:
JDBC Driver Mannager->JDBC<->ODBC
桥
->ODBC->
数据库客户机驱动库
->
数据库服务器
->
返回查询结果,在这种访问中值的我们注意的是虽然
JAVA
是
"Write Once ,Run Anywhere"
,但是如果通过这种访问的话,需要客户端必须设置
ODBC
和有相应的数据库客户机的驱动,当你看了下面的另外一个流程的时候或许你会想:明明下一种更方面,为什么还要有这个东西的产生!呵呵,因为,未必所有的数据库服务器提供商都提供下面的
JDBC
驱动程序(给
JDBC
访问提供相应的接口),所以就有了
JDBC<->ODBC Bridge
。
接着再让我们来看看第二种访问流程:
JDBC Driver Mannager->
局部
JDBC
驱动
->
客户端数据库
->
数据库服务器
->
返回查询结果,这种访问事实上是转换
JDBC
调用为相应的数据库(
Oracle, Sybase, Informix, DB2,
和其他的数据库数据库管理系统)的客户端
API
调用(这么说,不知道大家能不能懂,说简单点就好像
ASP
不是通过
DSN
对数据库访问而是通过
OLEDB
访问,说道这里我还是不知道大家能不能明白我的意思。哎呀,不要扔鸡蛋嘛
!
),这种方式的访问需要相应的数据库提供商提供相应的
JDBC
驱动程序,但是有一种好处,可以独立于
odbc
用于可以随处可
Run
的客户端的浏览器中的
Applet
程序。
我们下面将给大家一个通过
JDBC-ODBC
桥数据库访问的实例,但是在看下面的事例前我想问大家一次
:JDK1.3
装了吗?数据库驱动装了吗(我使用的是
SQLserver
)?你该没有使用
Linux
吧?虽然
java
支持
Linux
,但是老兄我可没有使用
Linux
哟
(
这同
JAVA
的
Write Once ,Run Anywhere
没有关系
)
,由于使用了运行于
Win
下面的
ODBC
,我建议你看看这篇东西
http://www.aspcn.com/showarticle.asp?id=112
,否则你要是有了问题,出不了结果那岂不是要怪我(不过欲加之罪,何患无吃
... ...
),冤枉呀!
哎呀,说了这么多的废话,还是让我们来看看到底
JDBC
的调用吧!既然我们是通过
odbc
访问数据库,所以这个
odbc
是跑不了的,我们先来设置你的
odbc
:打开你的
odbc
数据源
->
选择系统
dsn(Click
加新的
dsn-)->
接下来输入选择数据库类型、输入
dsn
名
:
、选择服务器、连接数据库的方式、输入数据库的登陆用户和密码
->
测试连接,如果测试成功的话,那么你的
dsn
就建立好了,我的
dsn
名为
Sqlserver.
使用的是
sqlserver7.0,
以
“sa”
登陆,密码为空。这些东西都是后面要用道的!
好了下面让我们来看程序代码:
(该代码已经通过运行)
//###########################################################
//
代码开始
//###########################################################
import java.sql.*;
//
加载
java
数据连接包,
java
基本所有的数据库的调用的都在这个东西里面
public class InsertCoffees {
public static void main(String args[]) {
String url = "jdbc:odbc:sqlserver";
//
取得连接的
url
名,注意
sqlserver
是
dsn
名
Connection con;
//
实例化一个
Connection
对象
Statement stmt;
String query = "select * from col_link";
//
选择所有的
Col_link
表中的数据输出
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//
加载
jdbc-odbc
桥驱动
} catch(java.lang.ClassNotFoundException e) {
System.err.print("ClassNotFoundException: ");
//
加载
jdbc-odbc
桥错误
System.err.println(e.getMessage());
//
其他错误
}
try {
con = DriverManager.getConnection(url, "sa", "");
//
数据库连接
stmt = con.createStatement();
//Create
一个声明
stmt.executeUpdate("CREATE TABLE col_link (sitename varchar (20) NULL ,siteurl varchar (50) NULL) ");
//
执行了一个
sql
语句生成了一个表
col_link
的表
stmt.executeUpdate("insert into col_link values('ASP
中华网
','http://www.aspcn.com')");
stmt.executeUpdate("insert into col_link values('
永远到底有多远
','http://xuankong.com')");
//
执行一个
insert into
语句
stmt.executeUpdate("update col_link set siteurl='http://www.aspcn.com/xuankong/xuankongt.jpg' where siteurl='http://xuankong.com'");
//
执行一个
update
语句,更新数据库
ResultSet rs = stmt.executeQuery(query);
//
返回一个结果集
System.out.println("Col_link
表中的数据如下
(
原始数据
)");
//
下面的语句使用了一个
while
循环打印出了
col_link
表中的所有的数据
System.out.println("
站点名
"+" "+"
站点地址
");
System.out.println("---------------"+" "+"----------------");
while (rs.next()) {
String s = rs.getString("sitename");
String f = rs.getString("siteurl");
//
取得数据库中的数据
System.out.println(s + " " + f);
/*String t = rs.getString(1);
String l = rs.getString(2);
System.out.println(t + " " + l);*/
/*jdbc
提供了两种方法识别字段,一种是使用
getXXX(
注意这里的
getXXX
表示取不同类型字段的不同的方法
)
获得字段名,
第二种
*
是通过字段索引,在这里我把第二种方法注释了
*/
/*
你可以访问这个连接获得
getxxx
的用法:
http://java.sun.com/docs/books/tutorial/jdbc/basics/_retrievingTable.html*/
}
stmt.close();
con.close();
//
上面的语句关闭声明和连接
} catch(SQLException ex) {
System.err.println("SQLException: " + ex.getMessage());
//
显示数据库连接错误或者查询错误
}
}
}
//###########################################################
//
代码结束
//###########################################################
在上面这个程序中我想你展示了如何使用
JDBC-ODBC
连接数据库,使用
SQL
语句生成一个表,使用
SELECT
、
INSERT
、
UPDATE
语句取的、插入和更新一个表中的数据,如何通过字段名和字段索引访问数据库中的东东!我希望你能从上面的代码真正的学习到一些东西!
发挥你的想象力,设想一下
JAVA
到底,比如说可以通过数据库做一个不需要
GUI
(图形用户界面)的聊天室,呵呵,感觉起来就像在
DOS
环境下打字的聊天室!哈哈!
最后需要说的是笔者的调试上面程序的环境:
WIN2000 , JDK1.3,MS SQLSERVER
编辑软件
:EDITPLUS 2.01a
(这最后的东西可不是废话,虽然早就了一些专业的
JAVA
开发工具,但是笔者建议
JAVA
初学者使用文本软件开发
JAVA
程序)
第二种:直接用
jdbc
访问数据库
(1)
该实例已经运行通过
jsp
连接
Sql Server7.0/2000
数据库
testsqlserver.jsp
如下:
<%@ page contentType="text/html;charset=gb2312"%>
<%@ page import="java.sql.*"%>
<html>
<body>
<%Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";
//pubs
为你的数据库的
String user="sa";
String password="";
Connection conn= DriverManager.getConnection(url,user,password);
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE);
String sql="select * from test";
ResultSet rs=stmt.executeQuery(sql);
while(rs.next()) {%>
您的第一个字段内容为:
<%=rs.getString(1);%>
您的第二个字段内容为:
<%=rs.getString(2);%>
<%}%>
<%out.print("
数据库操作成功,恭喜你
");%>
<%rs.close();
stmt.close();
conn.close();
%>
</body>
</html>
(2)java
访问
sqlserver
服务器
第一步:安装
jdbc
第二步:设置系统变量
classpath
假设
SQL Server for JDBC
驱动程序安装在
d
:
\jdbc\
,则
classpath
应该设置如下:
classpath
:=
.;…;d:\jdbc\lib; d:\jdbc\lib\mssqlserver.jar; d:\jdbc\lib\msutil.jar; d:\jdbc\lib\msbase.jar;
注意:设置时要在最前面的点号和分号
第三步:编辑
java
程序并且运行
实例
1
如下:
//import com.microsoft.*;
//注意:在java与sql server 连接时不需要这个包,其他书上说这个包是必需的,这个问题有待进一步讨论
import java.sql.*;
import java.net.URL;
class insert
{
public static void main(String[] args)
{
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=northwind";
String query="select * from categories";
String query1="insert categories values(10,'Hanbao','Sweet')";
String query2="insert categories values(11,'Naicha','Coffee taste')";
try
{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
Connection con=DriverManager.getConnection(url,"sa","739555");
Statement stmt=con.createStatement();
stmt.executeUpdate(query1);
stmt.executeUpdate(query2);
stmt.close();
con.close();
}
catch(SQLException ex)
{
}
catch(java.lang.Exception ex)
{
ex.printStackTrace();
}
}
}
实例
2
如下:
//import com.microsoft.*;
//
注意:在
java
与
sql server
连接时不需要这个包,其他书上说这个包是必需的,这个问题有待进一步讨论
import java.sql.*;
import java.net.URL;
class java2sqlserver
{
public static void main(String[] args)
{
String url="jdbc:microsoft:sqlserver://localhost:1433;User=sa;Password=739555;DatabaseName=northwind";
String query="Select * From Categories";
try
{
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
//DriverManager.setLogStream(System.out);
Connection con=DriverManager.getConnection(url);
checkForWarning(con.getWarnings());
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery(query);
dispResultSet(rs);
rs.close();
stmt.close();
con.close();
}
catch(SQLException ex)
{
System.out.println(ex.toString()+"----SQLException caught----");
while(ex!=null)
{
System.out.print("SQLState:"+ex.getSQLState());
System.out.print("Message:"+ex.getMessage());
System.out.print("Vendor:"+ex.getErrorCode());
ex=ex.getNextException();
System.out.println("");
}
}
catch(java.lang.Exception ex)
{
ex.printStackTrace();
}
}
private static boolean checkForWarning(SQLWarning warn)
{
boolean rc=false;
if(warn!=null)
{
System.out.println("----Warning----");
rc=true;
while(warn!=null)
{
System.out.print("SQLState:"+warn.getSQLState());
System.out.print("Message:"+warn.getMessage());
System.out.print("Vendor:"+warn.getErrorCode());
System.out.println("");
warn=warn.getNextWarning();
}
}
return rc;
}
private static void dispResultSet(ResultSet rs) throws SQLException
{
int i;
ResultSetMetaData rsmd=rs.getMetaData();
int numCols=rsmd.getColumnCount();
for(i=1;i<=numCols;i++)
{
if(i>1) System.out.print(", ");
System.out.print(rsmd.getColumnLabel(i));
}
System.out.println("");
boolean more=rs.next();
while(more)
{
for(i=1;i<numCols;i++)
{
if(i<1) System.out.print(", ");
System.out.println(rs.getString(i));
}
System.out.println("");
more=rs.next();
}
}
//System.out.println("Hello World!");
}
以上两个实例笔者已经通过运行
!