JAVA中文站社区门户R?y'uZb 自测练习 JAVA中文站社区门户9n xH'qS;S'f
JAVA中文站社区门户Ej0k8JQe 1) Java语言提供的访问、操作数据库的统一接口称为__________。 JAVA中文站社区门户`b t1\ bbl
K4f;y%Fj3i a.ODBC b.JDBC c.DBAP JAVA中文站社区门户5G3|M)D_'E
G%J Z1br%_)@ 2) Java语言中提供的这个数据库接口包含在__________包中。 JAVA中文站社区门户0kn^xcq
6d$TFm fB"| a.java.odbc b.java.jdbc c.java.sql d.java.dbap
&h},wE0?+[5Nv9p
JAVA中文站社区门户 Q7a'H4d/u 3) Java数据库程序通常是在网络上运行的,那么JDBC类一般位于_________。 JAVA中文站社区门户EV"]3n1K%A0T
JAVA中文站社区门户#H{6{U,h D qm a.客户端 b.服务器端 c.两端都有其中一部分
"x O!D\#wE:e_
j_\ Xh 4) JDBC可以通过____________来使用数据库的ODBC驱动程序。 JAVA中文站社区门户3g
w1eB,{
JAVA中文站社区门户cV8H:S6q-Nd"x-T a.jdbcodbc.dll b.ODBC模拟器 c.没有条件,可以直接使用 JAVA中文站社区门户!WOisKm4v
R'zu%D8PqvVB 5) ODBC与JDBC有一个共同的设计基础,它是______________。 JAVA中文站社区门户@;ECEj ^
JAVA中文站社区门户;V,{"KR#v1Nc a.SQL标准 b.CLI JAVA中文站社区门户 lS-vD/p*W!_i
JAVA中文站社区门户
F4I,~U%tZ"k 6)__________发布时间更早。 JAVA中文站社区门户5c:X+S_D_
#G-xKc-a+f
k a.JDBC b.ODBC c.DBAP JAVA中文站社区门户g/AD&a6X-r!o,R3l}
WhlC(J 7)使用ODBC访问数据库,数据库只能够在主机上。__________
0rvKt9Ud;} cS
A6P)m:sh_ a.对 b.不对 JAVA中文站社区门户#|b6Ov0a8Y
JAVA中文站社区门户 gDJM;h2xg/W
x 8)在ODBC模型中,最终是通过________来操作数据库的。 JAVA中文站社区门户ON1e#vo"ol!~I
)c(Z6oc[ a.ODBC接口 b.驱动程序管理器 c.数据库的ODBC驱动程序 JAVA中文站社区门户/n D;qiY;ev
0[}6x&qv 9)而在JDBC模型中,在应用程序中,我们是通过_________来使用数据库的。
$QpL$`nbwWKA
e
JAVA中文站社区门户A9Y-HM0I9~'Ce a.JDBC-ODBC桥接器 b.JDBC接口 c.ODBC驱动程序
5tgWsR6r
JAVA中文站社区门户d5SVeD5EO3p 练习答案 JAVA中文站社区门户Q3D:Y%gr+U(MH?
q"y]~'Pc 1)b 当然是JDBC,Java DataBase Connectivity。另外,并不存在一种名为DBAP的数据库接口API。 JAVA中文站社区门户!h@!q
i.o
e#m6V:w"xN| 2)c 首先不可能会是java.odbc,也不会是java.dbap,也许你最想选择的可能会是java.jdbc,可是Java类的命名者却使用了数据库圣经的名字(SQL)命名了。 JAVA中文站社区门户0c!s)h&U"ap/jv
_N r y&}*Ub m 3)a 通常是在客户端。
O'^n1d$g(|
.D OO:W)Uj(b$ID 4)a 使用JDBC-ODBC的转换器,这个转换器的文件名就是jdbc-odbc.dll。
RE"{(ENK W-H
JAVA中文站社区门户|viJ\/A
h 5)b 这两个数据库接口使用了同一个设计基础,X/Open SQL Call Level Interface,它简称为CLI。 JAVA中文站社区门户BKr2JOG*i
JAVA中文站社区门户
iQM7g:[ cK+k'@] 6)b ODBC比JDBC早很长一段时间。 JAVA中文站社区门户3y@j9Omt
JAVA中文站社区门户`%w w` x 7)b 当然不对,ODBC也是允许访问远程服务器上的数据库的。
D|'P+E-A
JAVA中文站社区门户*Pe!g-Z HRUa t 8)c 是通过真正能够了解数据库结构的,由数据库厂商提供的,专门的ODBC驱动程序来完成的。
ITNt P X
0~*vJl [$r$S#[-rgn m 9)b 对于应用程序而言,它只需直接调用提供的接口就可以了,无须去关心具体的数据库实现。
$q+y'ew&K"M7k
sUe['~4HJ g"P 13.2 用JDBC连接数据库
e,dc/kK2Y`u
JAVA中文站社区门户p0l:P4T;rN/o 传授新知 JAVA中文站社区门户D_;| DF
JAVA中文站社区门户V$E5{^n l7Xj&I 所有的JDBC类和方法都包含在java.sql包中: JAVA中文站社区门户4nhq:IYb&[.W
JAVA中文站社区门户,S$m9C%avM 类别 类 JAVA中文站社区门户nR5`3C d/}+l l/]:v
JAVA中文站社区门户!yV
s
a.P 驱动程序 java.sql.Driver
j `hR`vm&B7Z
;\qc:d.^Ew}S
n:q!B']_nWjava.sql.DriverManager JAVA中文站社区门户 g ~U/FJdpJ2?-r+p
java.sql.DrivePropertyInfo JAVA中文站社区门户+c9T&u9p~s
JAVA中文站社区门户+{!b5o-J'\'j^D JAVA中文站社区门户/@
_J}N,`
JAVA中文站社区门户m#wnl4fWR)p 连接 java.sql.Connection
c
FS9I!nh FUL5B
.jKa^| H;A0@n&DR 语句 java.sql.Statement
Qx*Z'^[;T.S5cc
JAVA中文站社区门户jgIs!S9X)\S7NJAVA中文站社区门户3}
N,i&{1Jz)f0xv
java.sql.PreparedStatement JAVA中文站社区门户&}9Qp
G6t+w\M
java.sql.CallableStatement
c6R[yFgK)Eb
%pQR']o
+fs9H.W~H
{ j9q
s4g5a&v3U2i'C,K 结果集 java.sql.ResultSet
.~{-rOp+E*U6~&o
&i:x g?z)H2Y,I/Xm 错误/警告 java.sql..SQLException JAVA中文站社区门户ST&bBR
G sp
JAVA中文站社区门户2^aR5Q`,qWQ0^;P
CE-Cl+}jjava.sql.SQLWarning JAVA中文站社区门户pJcCmd&G
JAVA中文站社区门户/A6NG#Xhj3vn
HH)F\(u.q
JAVA中文站社区门户x7q(S x+?#gq xz/A#C 元数据 java.sql.DatabaseMetaData
n,PY'_/W3~[m+f0t
B\
o![$N,b$En7I
:p[!n_hjava.sql.ResultSetMetaData
"P$rs+H
hH@%?
e
Q1H
JAVA中文站社区门户H)F+E1F7Y
$CZ5oG'z
N%e8~fgj_6l!S};g 日期/时间 java.sql.Date
4i
Ma2I-~,OQ
JAVA中文站社区门户rB!I4O(EU%BJAVA中文站社区门户dg1nJUK"OX
java.sql.Time JAVA中文站社区门户~)F4Sx,zbK7_)v
java.sql.Timestamp
4u)??|'[V
JAVA中文站社区门户+]&{@E K2G JAVA中文站社区门户4?#g3XZc6c&B
JAVA中文站社区门户.m_&v1@4CeX$?#a K 其它 java.sql.Types
qsFEA;`%u I/^
JAVA中文站社区门户B@,I"R0wZOJAVA中文站社区门户[*Rp/pmdA
I
java.sql.DataTruncation
#]rfx t.Zf @Q
.gT?Q;dH JAVA中文站社区门户z4Z1sI"y@7M1b
}2x+K0Sksb 表13-1 JDBC类一览表
YL#eba%z9gG
[S U+C[g b 在使用JDBC时,每一个驱动程序要被加载之前,都要使用DriverManager进行注册。当需要打开一个连接时,DriverManager根据JDBC的URL选择相应的驱动程序。 JAVA中文站社区门户1DX2yv^,eC
sA}%H%H,YEJF 同样的,JDBC也体现了Java这一网络语言的特点,它也是使用URL进行识别一个数据库的。它的语法格式是:
2fB"oO2],y#Bl1C:L(e1w
JAVA中文站社区门户/r4a8z%vu8bad jdbc:<子协议>:<与DBMS/Protocol相关的子名字>
T/{ r
VJ
8D"~2ba2Nt"X JDBC的URL分三个部分组成: JAVA中文站社区门户9B9W ^%FP$hux
3V!s,YH+r"LJ1a e8U 1)指示部分:jdbc。请大家回忆一下,一个常见的WEB页面的URL是以什么开头的?对,http://,这个指示部分用来说明这个URL是什么类别的。 JAVA中文站社区门户9p;X9]5fzS
JAVA中文站社区门户ojp,D?8z(^ 2)子协议部分,这个部分用来指出JDBC的子协议,如odbc; JAVA中文站社区门户(Rla/\7kj)LH7NK~
)G)MT6v@%QL6Fh:N 3)子名字:数据源的名字,如果数据库是在网络上的,那么就用URL//hostname:port//来表示。
8|*e M[sH U
JAVA中文站社区门户,O2i!c/`_)G 例如:jdbc:odbc:;User=<用户名>;PW=<口令> JAVA中文站社区门户 M.t g1`#sL b
'Cj H
]3wW 使用JDBC的整个流程如下图所示: JAVA中文站社区门户t+G s/k,}.b
JAVA中文站社区门户 c&^T a8U0kUO
nIW/bC\2Y@Y 图13-5 JDBC调用流程图 JAVA中文站社区门户+Trp(P2dZ&E)}
JAVA中文站社区门户ggr9lmr-Q;D 正如上图所示,使用JDBC访问数据库需要经过以下几个步骤: JAVA中文站社区门户
~'b;yz{^CK?S
JAVA中文站社区门户 Ar6kH0~ ?"hE 1) 首先,程序调用getConnection()方法,获得一个Connection对象; JAVA中文站社区门户d`+y%Gt4w2][4Jj
]NEq(zh+R 2) 然后程序创建一个Statement对象并准备一个SQL语句;这个SQL语句可以是: JAVA中文站社区门户y/\.Vn3N7[9@&T*R^
JAVA中文站社区门户1w%nyzy?zcc$Q a. 被立即执行的语句:Statement对象; JAVA中文站社区门户"]!k8bJ_2a
JAVA中文站社区门户$Gh;e:_,R^+h!{Q b.被编译的语句:PreparedStatement对象; JAVA中文站社区门户:o*ts J:C/Q
#]owP ^ c.存储过程的调用:CallableStatement对象。
5?'Z{5sx"_\5B$k
r
JAVA中文站社区门户Qns-\v J@ 3) 接着我们就可以执行这个语句(如executeQuery( )、execute( ))等,将得到一个存储结果的ResultSet对象。
4e3d{u,Cj
JAVA中文站社区门户6R$`?di7{/lH~ 注意: JAVA中文站社区门户uV UE a.[HK.W
j
JAVA中文站社区门户xFM&T_,P~ 也有一些语句是完成一些事务工作,如executeUpdate(),更新。它们将不会返回ResultSet对象,因为它们并没有结果。
5a5k
A? r]T
{NO)_sd6m 4) 最后,我们就可以使用类似next()等方法对返回的ResultSet对象进行相应的处理。 JAVA中文站社区门户JbT]vIqg
'\Qv#C%{%Tg 实例说明
-H%a%} EP'W(]
JAVA中文站社区门户9vi.h-T7`7e 下面,我们来看一个简单的例子。由于JDBC是用来访问数据库的,所以我们首先来创建一个数据库。为了大家都能够完成这个实验,我们就用Office套件中的Access数据库来完成这个例子。
bM#sW0X/^q
JAVA中文站社区门户&`\!^8_+D
SR 1. 创建Access数据库student.mdb,在这个库中创建一个表student:
Gc.vmeFl_
5x z*w@QstJAVA中文站社区门户ne[X&g+VB*Q
图13-6 数据库student的表结构 JAVA中文站社区门户} @Y8Zv
6i7w `h:A8V!|X 这个表student的内容如下图所示:
{BO?9Mo
cL9eiA:O:{9R!vJAVA中文站社区门户o*zj1]^
t"w
图13-7 表student的内容
E;O tnH
(uV,O3?(tNu{ 2. 当我们建好这个示例数据库student后,我们要为其设置ODBC:
e{R an-mL)is9Z
2q5u6y3FX9^"n(G-} 一些说明:
tT.cw;X&F9Q
JAVA中文站社区门户+V S3s2@3^!j$j8} 读到这里,可能有些读者会感到奇怪,我们不是在使用JDBC吗?为什么要设置ODBC呢?这是因为有带JDBC驱动程序的数据库没有ODBC那样多?我们在这里使用的数据库系统Access就没有相应的JDBC驱动程序。
i$`MJO4j*@"s
JAVA中文站社区门户
j*\}r
r 不过没关系,大家应该记得在JDBC中有一个JDBC-ODBC的桥接器,通过它就可以使用ODBC驱动程序啦。
@*U eH'l
JAVA中文站社区门户$[5v?&a ^w 现在应该明白为什么为什么要先设置ODBC了吧!
7H^ mr}5xO
JAVA中文站社区门户R0Y\F&_] 设置ODBC的方法很简单:
Z
i5CyE4U8I}&dN
JAVA中文站社区门户u-B
^Eb[ 1) 首先,我们打开控制面板,双击“ODBC数据源(32位)”按钮,然后选择“系统DSN页”,将出现如下界面: JAVA中文站社区门户+L#t:X\q i-O.lU
{J%qgA
1~
d9aDH5A4j(TYZ 图13-8 ODBC设置(1)
Zx @ t ^oj]
%P3{~T {OT"WZ2gf 2) 然后,我们单击“添加”按钮,选择“Microsoft Access Driver”,然后单击“完成”按钮:
F7_ dF:ug\Ov
JAVA中文站社区门户(e?5z,fI?.tiJAVA中文站社区门户fF,YlM/V$j
图13-9 ODBC设置(2)
k zT SKl+r/q6p
R0I9N(B$Xx.^u 3) 接着,就会出现一个如下图所示的对话框,我们首先填上 “数据源名”:student,然后单击“选取”按钮,选择我们刚才创建的数据库student.mdb。然后单击“确定“按钮,至此ODBC设置完成: JAVA中文站社区门户n2S)G/N1F
L3H G
JAVA中文站社区门户gWkk]T;A ^P
N*W Jp|J.^;Kh)?$B 13-10 ODBC设置(3) JAVA中文站社区门户hST8cU0{'{AD
JAVA中文站社区门户+_rQX@#p2?:C3Qoe!X 3. 然后,创建一个源程序文件testjdbc.java,其内容如下: JAVA中文站社区门户A2g$cW+ERw
JAVA中文站社区门户 ^*@
K4R%z'HB3lR]"L p 源程序:testjdbc.java
AW#|_l'UmcT
JAVA中文站社区门户-wpG nm$CfTc
c
6qrp(} M kimport java.sql.*; JAVA中文站社区门户 ^:xlW8XO*?
public class testjdbc
(KB2j.Gex
N@^6NV{ JAVA中文站社区门户/z}3sU.OT;z
public static void main(String args[]) throws SQLException
}N6rCZ } cmi{
T P:c+}]7Ntry JAVA中文站社区门户
\ `8|
F8p _M
{
i%q5J!L%bv~#k
\lString name,sex,age,chinese,maths,output; JAVA中文站社区门户%_+v)id.t)kz
b$ws'^
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); JAVA中文站社区门户6U m5siH
Connection con=DriverManager.getConnection JAVA中文站社区门户9Js'F3zl!`4m]qd
("jdbc:odbc:student");
w+unL/r%e.DStatement sta=con.createStatement(); JAVA中文站社区门户\D A2w#qB*P6K
ResultSet rs=sta.executeQuery
k0cp?3g&P("SELECT Name,Sex,Age,Chinese,Maths FROM student"); JAVA中文站社区门户"Op F&u`@
z5OO,f*a
System.out.println("Name Sex Age Chinese Maths");
H;aXR2jjwhile(rs.next()) JAVA中文站社区门户V
?%ZP6y5nh,q
{
D8s*V@5R Cname=rs.getString(1); JAVA中文站社区门户E&[`w(Cd)s
sex=rs.getString(2); JAVA中文站社区门户'v!j ?cFU#kCo
age=rs.getString(3); JAVA中文站社区门户+Y8H&O'Q'BD
chinese=rs.getString(4); JAVA中文站社区门户0x)Y6W]2L/ZA&p
maths=rs.getString(5);
@'N8dD9Soutput=name+" "+sex+" "+age+" "+chinese+" "+maths; JAVA中文站社区门户o&W#n8cR[/}@+o A
System.out.println(output);
Kp"r,Y?.R1iYY'~} JAVA中文站社区门户1Oh2J~4h-]DX
}
2G~v5HYcatch(java.lang.Exception ex)
w1iX#j'j!A%WtE q$l{
5e?k+V(P/Dex.printStackTrace(); JAVA中文站社区门户d/^m1R;S
}
YGBcV'b}
K-V4A`?_I1r!Y]} JAVA中文站社区门户(D7n
u&b]GP:L$D F
JAVA中文站社区门户|-Ave'] p[)s
\Y};a3@:I)I
JAVA中文站社区门户B UHfK.r] 4. 最后,我们使用javac编译,然后执行java testjdbc,程序输出如下所示: JAVA中文站社区门户2|N,ALM,m
JQ
JAVA中文站社区门户2W&@"V\'[
h [
~^E-o8` 图13-11 程序输出图 JAVA中文站社区门户2M+X4H/R1F`!AM
!N^0].F-j!?s 传授新知 JAVA中文站社区门户#~8E-hz3c({%Q%tH&v
'kW F9qN5gW 下面,我们就一起来学习一下这个程序: JAVA中文站社区门户/J-K^(v K
e
+TjN#y~ 1) JAVA中文站社区门户'R.^S9l&t0A9y
JAVA中文站社区门户]BY\,{s
xmU*@:?3T uimport java.sql.*;
;d])k2f!LG(},n {N
JAVA中文站社区门户z6r'@pLNL\ JAVA中文站社区门户5alr&Ds4Q
JAVA中文站社区门户,h:ijn+O$z,qf 我们知道,JDBC的所有类和方法都在java.sql包中实现的,所以当我们的程序中要使用到JDBC时,就要把这个包import进来。否则就会出错的哟。
(HmVCla.AC
.oB3^Vpi_)W 2)
a+N&mY5b"~[ h
JAVA中文站社区门户iy0h|Q|Y[:HJAVA中文站社区门户&lk JxdL,g
public static void main(String args[]) throws SQLException
|_P:NUP
]g NUQ_C
A)gf0v0?gWMp-W
JAVA中文站社区门户gr7a5dXf 这个语句,我想大家应该可以看懂一半,也就是直到throws之前的部分,这是定义了main方法。而后面的throws SQLException则是说明如果程序遇到SQLException错误时就忽略错误。 JAVA中文站社区门户-IO1IZ.S&p*jHb!p
+Iuu9U*Cb{&n6x
p 3)
'q|s*]Ax
JAVA中文站社区门户(h#puS]#n?k
5K%@9xim0G;R$etry JAVA中文站社区门户5}:O1Y'w+E
{ JAVA中文站社区门户dY|gY\o
……
8V!g+zp's/mn&~T
v} JAVA中文站社区门户&uZ
jg&L
catch(java.lang.Exception ex)
1hop.A.d9u{ JAVA中文站社区门户
A3u5iVjw4S5T'K
ex.printStackTrace(); JAVA中文站社区门户jn
cV4^ J,f
cS]
}
R,K+BXuwoA5J
JAVA中文站社区门户] X TO4kfcR
,O#Gkq9ma
+r1C8kyt_ 这个语句,我们曾经在前面一章中做过介绍,也就是在try程序段中,如果遇到catch语句中定义的错误(在这里是java.lang.Exception ex),就执行catch程序段(在这里就是执行ex.printStackTrace(),打印出相关的错误信息)。 JAVA中文站社区门户z$U7e}1Oe9GO;tRa
9o-d+gv8jd%FnS 4)
sU-{Z @6wiP%n
JAVA中文站社区门户+sz-^|2C
~"C8PnG
Y9LG1B/q
EO5nClass.forName("sun.jdbc.odbc.JdbcOdbcDriver");
KI,`BB-Sa,Ut$_
F'_)v'D"L Fy.R \ JAVA中文站社区门户a'@
Z m~b
JAVA中文站社区门户.A q/Q[[^ 这条语句,大家虽然没有见过,但我想大家都能够猜出它的用途来!对,就是初始化并加载JDBC-ODBC驱动程序。