java 数据库基本操作 Ahc9HA2
1、java数据库操作基本流程 $+PyW(
r
2、几个常用的重要技巧: ?L0 |$#Iw
可滚动、更新的记录集 X` J86G )
批量更新 B*t1Y<>x
事务处理 |AT`(71
K>C@oE[W
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 0Y:)$h2?
1、取得数据库连接 $ w+.-Tr
1)用DriverManager取数据库连接 `:C2Cj
例子 GS7'pTsYH
String className,url,uid,pwd; :5BCW68le
className = "oracle.jdbc.driver.OracleDriver"; |3^U\r^zo
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 7dv!
uid = "system"; fzA Fn$[
pwd = "manager"; bDm7$ (
Class.forName(className); *Q)-"]O(k
Connection cn = DriverManager.getConnection(url,uid,pwd); %'X~9Pvi
2)用jndi(java的命名和目录服务)方式 :K 5?&kT
例子 wWSo+40
String jndi = "jdbc/db"; 1xu~@v60
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ]s!id[j
DataSource ds = (DataSource) ctx.lookup(jndi); ^!x! F
Connection cn = ds.getConnection(); 8]oolA:^4s
多用于jsp中 M6bM`wHH>
2、执行sql语句 '1(6@5tyWk
1)用Statement来执行sql语句 mHV{9J
String sql; Ql%B=vgKL
Statement sm = cn.createStatement(); UNK.39
sm.executeQuery(sql); // 执行数据查询语句(select) jgS3#
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ANJL8t-m
2)用PreparedStatement来执行sql语句 D/JSIDd
String sql; }+Q4s]
sql = "insert into user (id,name) values (?,?)"; 3=^)=yOd
PreparedStatement ps = cn.prepareStatement(sql); C"$~w3A k
ps.setInt(1,xxx); ;mRZ_^V;
ps.setString(2,xxx); oe|8
... b(CO7/e>
ResultSet rs = ps.executeQuery(); // 查询 ~y?Nn8+&f
int c = ps.executeUpdate(); // 更新 $VB
dd~f
\XYidj
3、处理执行结果 )2#&l
查询语句,返回记录集ResultSet 2r;h">
更新语句,返回数字,表示该更新影响的记录数 ca3SE^
ResultSet的方法 _aBy>=2c$
1、next(),将游标往后移动一行,如果成功返回true;否则返回false u!&T}i:
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 RRpY%-8M
\yZVn6GVr
4、释放连接 hlZ{bO'f
cn.close(); IC (:RtJ
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection H
XFY
S;jD@j\t&
可滚动、更新的记录集 ecQ{ePoU
1、创建可滚动、更新的Statement r
d-yqdJ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); R\XS5HOE(
该Statement取得的ResultSet就是可滚动的 P3n#s2o6y
2、创建PreparedStatement时指定参数 )<{u
oH
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); .9WOTti
ResultSet.absolute(9000); Bs` {qmbC
批量更新 =m F"D:s*
1、Statement >3pT).wH|M
Statement sm = cn.createStatement(); TOF V`7q;3
sm.addBatch(sql1); RwYFBc
sm.addBatch(sql2); ?{jey_]M
... S3i p?9
sm.executeBatch() #oFyi @U
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 YM6
J:89
2、PreparedStatement FRajo~H
PreparedStatement ps = cn.preparedStatement(sql); )QRT/, ;c
{ }mzd23^W>P
ps.setXXX(1,xxx); |Olz h63k:
... `/'p1?Z"
ps.addBatch(); 1G.?Y3DC<
} qp/1tC`
ps.executeBatch(); [f!
{
-T
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Yh!=mW!OY
Shn=Q
事务的处理 B :S8{
1、关闭Connection的自动提交 de)4)EzUP
cn.setAutoCommit(false); OzD\*,{7
2、执行一系列sql语句 Wh)
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 7}y@VO6]
Statement sm ; 6wj o:I
sm = cn.createStatement(insert into user...); u$C\#y7
sm.executeUpdate(); ]1XtV<
sm.close(); J*MH`;-
sm = cn.createStatement("insert into corp...); }(
CYok
sm.executeUpdate(); HfgTc
h
sm.close(); hc[J,yG
3、提交 '|Bk}pl7
cn.commit(); :Yn.Wv-
4、如果发生异常,那么回滚 6i~|<vcSP
cn.rollback();