java 数据库基本操作 Gc<^b
1、java数据库操作基本流程 X^d}eWP`I
2、几个常用的重要技巧: \d
QRQL{LL
可滚动、更新的记录集 qmq#(%Z <W
批量更新 BXUd
i&'O
事务处理 "tmr
s_~
JgcMk]|'
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 'o1lJ?~kH
1、取得数据库连接 z"V`8D
1)用DriverManager取数据库连接 d@
tD0s
例子 68nPz".X
String className,url,uid,pwd; UX)QdT45Mh
className = "oracle.jdbc.driver.OracleDriver"; 2o~UA\:+=
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; "2`/mtMon
uid = "system"; L+0O=zJF
pwd = "manager"; 3IQ-2 X--
Class.forName(className); 9oVprd>%@
Connection cn = DriverManager.getConnection(url,uid,pwd); pB,l t6
2)用jndi(java的命名和目录服务)方式 +(oExp(!
例子 p
I@!2c:}
String jndi = "jdbc/db"; ,UneS
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); q5>!.v
DataSource ds = (DataSource) ctx.lookup(jndi); [`bA,)y"
Connection cn = ds.getConnection(); ^aY,Wq
多用于jsp中 ?r^>Vk}
2、执行sql语句 *ub"!}$st
1)用Statement来执行sql语句 %`]fZr A]#
String sql; 8!7`F.BX
Statement sm = cn.createStatement(); >%85S >e
sm.executeQuery(sql); // 执行数据查询语句(select) mxTuwx
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 6#kK
2)用PreparedStatement来执行sql语句 K]ds2Kp&
String sql; v8K4u)
sql = "insert into user (id,name) values (?,?)"; X9#i!_*
PreparedStatement ps = cn.prepareStatement(sql); #6nuiSF
ps.setInt(1,xxx); }Hb_8P
ps.setString(2,xxx); sDyt 3xN
... 29f4[V X
ResultSet rs = ps.executeQuery(); // 查询 /^, /o
int c = ps.executeUpdate(); // 更新 cfPQcB>A
C.+:FY.H
3、处理执行结果 mWH;-F*%
查询语句,返回记录集ResultSet *m`F-J6U
更新语句,返回数字,表示该更新影响的记录数 g3\13<
ResultSet的方法 -@/!u9l
1、next(),将游标往后移动一行,如果成功返回true;否则返回false )h/Qxf
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 LO)p2[5#R
(+;%zh-
4、释放连接 EP8R[Q0_"
cn.close(); g HKA:j`c
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection kTo{W]9]
Q6fPqEX=
可滚动、更新的记录集 KwhATYWQb
1、创建可滚动、更新的Statement iLf*m~Q
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ?# )\SQ
该Statement取得的ResultSet就是可滚动的 v\Zq=,+
2、创建PreparedStatement时指定参数 i/F].Sag
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); I =nvL
ResultSet.absolute(9000); >@q4Uez
批量更新 6?= ^8
1、Statement tflUy\H>
Statement sm = cn.createStatement(); 4_o+gG%HaM
sm.addBatch(sql1); 49dN ~k=
sm.addBatch(sql2); It5n;,n
... zc!q a"4yM
sm.executeBatch() yz_xWx#9
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ^c:I]_Ww
2、PreparedStatement ;ZR^9%+y9
PreparedStatement ps = cn.preparedStatement(sql); |}<!O@<|
{ n)R[T.E)+
ps.setXXX(1,xxx); HkyN$1s
... P@Av/r
ps.addBatch(); N~9zQ
} %QX"oRMn0
ps.executeBatch(); hr/|Fn+kA
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 _kQOax{c/
>`+lEob
事务的处理 ou[Wz{
1、关闭Connection的自动提交 NucLf6
cn.setAutoCommit(false); .
"`f~s\G
2、执行一系列sql语句 3y-P-NI~=
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close }62Q{>`
Statement sm ; $"`e^J9!!
sm = cn.createStatement(insert into user...); c.h_&~0qf
sm.executeUpdate(); .,gVquqMY
sm.close(); P;p;o]
sm = cn.createStatement("insert into corp...); sW!MV v
sm.executeUpdate(); $>=w<=r|;
sm.close(); zWf(zxGAz
3、提交 Ms=11C
cn.commit(); -A1:S'aN-
4、如果发生异常,那么回滚 o.>Yj)U
cn.rollback();