📄 java入门(13).htm
字号:
这两个数据库接口使用了同一个设计基础,X/Open SQL Call Level Interface,它简称为CLI。 <BR><BR> 6)b
ODBC比JDBC早很长一段时间。 <BR><BR> 7)b 当然不对,ODBC也是允许访问远程服务器上的数据库的。 <BR><BR> 8)c
是通过真正能够了解数据库结构的,由数据库厂商提供的,专门的ODBC驱动程序来完成的。 <BR><BR> 9)b
对于应用程序而言,它只需直接调用提供的接口就可以了,无须去关心具体的数据库实现。 <BR><BR> 13.2 用JDBC连接数据库
<BR><BR> 传授新知 <BR><BR> 所有的JDBC类和方法都包含在java.sql包中: <BR><BR> 类别 类
<BR><BR> 驱动程序 java.sql.Driver <BR><BR><BR>java.sql.DriverManager
<BR>java.sql.DrivePropertyInfo <BR><BR><BR><BR> 连接 java.sql.Connection
<BR><BR> 语句 java.sql.Statement <BR><BR><BR>java.sql.PreparedStatement
<BR>java.sql.CallableStatement <BR><BR><BR><BR> 结果集 java.sql.ResultSet
<BR><BR> 错误/警告 java.sql..SQLException <BR><BR><BR>java.sql.SQLWarning
<BR><BR><BR><BR> 元数据 java.sql.DatabaseMetaData
<BR><BR><BR>java.sql.ResultSetMetaData <BR><BR><BR><BR> 日期/时间
java.sql.Date <BR><BR><BR>java.sql.Time <BR>java.sql.Timestamp
<BR><BR><BR><BR> 其它 java.sql.Types <BR><BR><BR>java.sql.DataTruncation
<BR><BR><BR><BR> 表13-1 JDBC类一览表
<BR><BR> 在使用JDBC时,每一个驱动程序要被加载之前,都要使用DriverManager进行注册。当需要打开一个连接时,DriverManager根据JDBC的URL选择相应的驱动程序。
<BR><BR> 同样的,JDBC也体现了Java这一网络语言的特点,它也是使用URL进行识别一个数据库的。它的语法格式是:
<BR><BR> jdbc:<子协议>:<与DBMS/Protocol相关的子名字>
<BR><BR> JDBC的URL分三个部分组成:
<BR><BR> 1)指示部分:jdbc。请大家回忆一下,一个常见的WEB页面的URL是以什么开头的?对,http://,这个指示部分用来说明这个URL是什么类别的。
<BR><BR> 2)子协议部分,这个部分用来指出JDBC的子协议,如odbc;
<BR><BR> 3)子名字:数据源的名字,如果数据库是在网络上的,那么就用URL//hostname:port//来表示。
<BR><BR> 例如:jdbc:odbc:;User=<用户名>;PW=<口令>
<BR><BR> 使用JDBC的整个流程如下图所示: <BR><BR><BR> 图13-5 JDBC调用流程图
<BR><BR> 正如上图所示,使用JDBC访问数据库需要经过以下几个步骤: <BR><BR> 1)
首先,程序调用getConnection()方法,获得一个Connection对象; <BR><BR> 2)
然后程序创建一个Statement对象并准备一个SQL语句;这个SQL语句可以是: <BR><BR> a.
被立即执行的语句:Statement对象; <BR><BR> b.被编译的语句:PreparedStatement对象;
<BR><BR> c.存储过程的调用:CallableStatement对象。 <BR><BR> 3)
接着我们就可以执行这个语句(如executeQuery( )、execute( ))等,将得到一个存储结果的ResultSet对象。
<BR><BR> 注意:
<BR><BR> 也有一些语句是完成一些事务工作,如executeUpdate(),更新。它们将不会返回ResultSet对象,因为它们并没有结果。
<BR><BR> 4) 最后,我们就可以使用类似next()等方法对返回的ResultSet对象进行相应的处理。 <BR><BR> 实例说明
<BR><BR> 下面,我们来看一个简单的例子。由于JDBC是用来访问数据库的,所以我们首先来创建一个数据库。为了大家都能够完成这个实验,我们就用Office套件中的Access数据库来完成这个例子。
<BR><BR> 1. 创建Access数据库student.mdb,在这个库中创建一个表student: <BR><BR><BR> 图13-6
数据库student的表结构 <BR><BR> 这个表student的内容如下图所示: <BR><BR><BR> 图13-7
表student的内容 <BR><BR> 2. 当我们建好这个示例数据库student后,我们要为其设置ODBC: <BR><BR> 一些说明:
<BR><BR> 读到这里,可能有些读者会感到奇怪,我们不是在使用JDBC吗?为什么要设置ODBC呢?这是因为有带JDBC驱动程序的数据库没有ODBC那样多?我们在这里使用的数据库系统Access就没有相应的JDBC驱动程序。
<BR><BR> 不过没关系,大家应该记得在JDBC中有一个JDBC-ODBC的桥接器,通过它就可以使用ODBC驱动程序啦。
<BR><BR> 现在应该明白为什么为什么要先设置ODBC了吧! <BR><BR> 设置ODBC的方法很简单: <BR><BR> 1)
首先,我们打开控制面板,双击“ODBC数据源(32位)”按钮,然后选择“系统DSN页”,将出现如下界面: <BR><BR><BR> 图13-8
ODBC设置(1) <BR><BR> 2) 然后,我们单击“添加”按钮,选择“Microsoft Access
Driver”,然后单击“完成”按钮: <BR><BR><BR> 图13-9 ODBC设置(2) <BR><BR> 3)
接着,就会出现一个如下图所示的对话框,我们首先填上
“数据源名”:student,然后单击“选取”按钮,选择我们刚才创建的数据库student.mdb。然后单击“确定“按钮,至此ODBC设置完成:
<BR><BR><BR> 13-10 ODBC设置(3) <BR><BR> 3.
然后,创建一个源程序文件testjdbc.java,其内容如下: <BR><BR> 源程序:testjdbc.java
<BR><BR><BR>import java.sql.*; <BR>public class testjdbc <BR>{ <BR>public
static void main(String args[]) throws SQLException <BR>{ <BR>try <BR>{
<BR>String name,sex,age,chinese,maths,output;
<BR>Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); <BR>Connection
con=DriverManager.getConnection <BR>("jdbc:odbc:student"); <BR>Statement
sta=con.createStatement(); <BR>ResultSet rs=sta.executeQuery <BR>("SELECT
Name,Sex,Age,Chinese,Maths FROM student"); <BR>System.out.println("Name
Sex Age Chinese Maths"); <BR>while(rs.next()) <BR>{
<BR>name=rs.getString(1); <BR>sex=rs.getString(2);
<BR>age=rs.getString(3); <BR>chinese=rs.getString(4);
<BR>maths=rs.getString(5); <BR>output=name+" "+sex+" "+age+" "+chinese+"
"+maths; <BR>System.out.println(output); <BR>} <BR>}
<BR>catch(java.lang.Exception ex) <BR>{ <BR>ex.printStackTrace(); <BR>}
<BR>} <BR>} <BR><BR><BR><BR> 4. 最后,我们使用javac编译,然后执行java
testjdbc,程序输出如下所示: <BR><BR><BR> 图13-11 程序输出图 <BR><BR> 传授新知
<BR><BR> 下面,我们就一起来学习一下这个程序: <BR><BR> 1) <BR><BR><BR>import java.sql.*;
<BR><BR><BR><BR> 我们知道,JDBC的所有类和方法都在java.sql包中实现的,所以当我们的程序中要使用到JDBC时,就要把这个包import进来。否则就会出错的哟。
<BR><BR> 2) <BR><BR><BR>public static void main(String args[]) throws
SQLException
<BR><BR><BR><BR> 这个语句,我想大家应该可以看懂一半,也就是直到throws之前的部分,这是定义了main方法。而后面的throws
SQLException则是说明如果程序遇到SQLException错误时就忽略错误。 <BR><BR> 3) <BR><BR><BR>try
<BR>{ <BR>…… <BR>} <BR>catch(java.lang.Exception ex) <BR>{
<BR>ex.printStackTrace(); <BR>}
<BR><BR><BR><BR> 这个语句,我们曾经在前面一章中做过介绍,也就是在try程序段中,如果遇到catch语句中定义的错误(在这里是java.lang.Exception
ex),就执行catch程序段(在这里就是执行ex.printStackTrace(),打印出相关的错误信息)。 <BR><BR> 4)
<BR><BR><BR>Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
<BR><BR><BR><BR> 这条语句,大家虽然没有见过,但我想大家都能够猜出它的用途来!对,就是初始化并加载JDBC-ODBC驱动程序。
<BR><BR> 在JDBC的程序中使用JDBC-ODBC桥接器,就一定要在最前面加上这么一句。 <BR><BR> 5)
<BR><BR><BR>Connection con=DriverManager.getConnection
<BR>("jdbc:odbc:student");
<BR><BR><BR><BR> 这条语句中,我们定义了一个Connection类的对象con,用来存放getConnection方法返回的数据库连接。
<BR><BR> 大家回想一下图13-5,在最上层,我们是通过“驱动程序管理器”发出一个getConnection方法,以获得一个Connection(数据库连接)。
<BR><BR> getConnection方法的语法格式是: <BR><BR><BR>Connection
getConnection(String url,String user,String password);
<BR><BR><BR><BR> 它可以带上三个参数: <BR><BR> <1>
url:数据库的URL。我们知道JDBC的URL由三个部分组成: <BR><BR><BR> 图13-12 URL分析
<BR><BR> <2> user:用户名。象SQL
Server、Oracle…等大型数据库中,均采用了用户管理,而在Access中并未使用,所以在本例中当然就不用指出相应的用户了;
<BR><BR> <3> password:相应用户的口令,它是与用户名对应的。 <BR><BR> 6)Statement
sta=con.createStatement();
<BR><BR> 我们继续参考图13-5,获得了一个Connection(与数据库的连接)后,我们应该创建一个语句(有三种方法),在我们的程序中使用了最常使用的语句创建方法:createStatement。
<BR><BR> 注意: <BR><BR> 创建语句所引用的方法createStatement是Connection对象的方法!
<BR><BR> 这样,我们就得到了一个Statement(语句)对象sta。 <BR><BR> 7)
<BR><BR><BR>ResultSet rs=sta.executeQuery <BR>("SELECT
Name,Sex,Age,Chinese,Maths FROM student");
<BR><BR><BR><BR> 根据图13-5的指示,接下来,我们要使用Statement对象的方法来执行SQL语句,在本例中,我们使用了一个最常用的executeQuery方法。
<BR><BR> 这个方法所带的参数是一个SQL语句。 <BR><BR> 小知识:SQL语言
<BR><BR> SQL用来组织、管理和检索存储在计算机数据库中的数据。它的英文全称是:“Structured Query
Language”。它是所有的关系型数据库均采用的标准。是一种专门用于数据库操作的语言。它可嵌入到其它语言中(如这里)来实现数据库操作。
<BR><BR> 例如,这里的SELECT Name,Sex,Age,Chinese,Maths FROM
student的意思就是从student表中选择出Name,Sex,Age,Chinese,Maths五个字段。
<BR><BR> SQL语言博大精深,而且十分有用,有兴趣的读者可以去阅读《SQL完全参考手册》(上、下)。在此限于篇幅就不带赘述了。
<BR><BR> 执行了这条SQL语句后,将产生许多输出,这些都将存放在一个ResultSet类的对象rs中。它对应与图13-5就是“结果集”。
<BR><BR> 8) <BR><BR><BR>while(rs.next()) <BR>{ <BR>name=rs.getString(1);
<BR>sex=rs.getString(2); <BR>age=rs.getString(3);
<BR>chinese=rs.getString(4); <BR>maths=rs.getString(5); <BR>output=name+"
"+sex+" "+age+" "+chinese+" "+maths; <BR>System.out.println(output); <BR>}
<BR><BR><BR><BR> 根据图13-5的指示,有了结果集,我们就可以使用next方法、getString方法获取它们。其中next方法是指取下一个记录(一个记录由多个字段组成,在这个例子中共有5个字段:Name,Sex,Age,Chinese,Maths)。而getString则是从当前记录中取出某个字段,它所带的参数就是字段的序号。
<BR><BR> 一些提示: <BR><BR> 刚返回的结果集ResultSet中,记录指针是指向TOP,并未指向任何记录。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -