java 数据库基本操作 3P3:F2S R
1、java数据库操作基本流程 JYl\<Z' {
2、几个常用的重要技巧: ,Os7T 1>
可滚动、更新的记录集 9DY|Sa]#=
批量更新 D'85VZEFyo
事务处理 oFwG+W/
AE]i
V {p
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 )fy<P;g
1、取得数据库连接
~t$mw,
1)用DriverManager取数据库连接 &l?N:(r
例子 hq]xmM?&
String className,url,uid,pwd; A/hpYa
className = "oracle.jdbc.driver.OracleDriver"; S]5VEn;pV
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; N!.kq4$.
uid = "system"; rSzQUn<
pwd = "manager"; ja L$LJV
Class.forName(className); @\S]]oLn
Connection cn = DriverManager.getConnection(url,uid,pwd); .wM:YX'[G
2)用jndi(java的命名和目录服务)方式 ,uKs>T^
例子 zuUQ."#i
String jndi = "jdbc/db"; Q*,6X*W!~
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); u~
VswXc4
DataSource ds = (DataSource) ctx.lookup(jndi); JO}#f+w}
Connection cn = ds.getConnection(); f<) Ro$
多用于jsp中 (0X,Qwx
2、执行sql语句 -??!@R7V
1)用Statement来执行sql语句 b1eK(F
String sql; ^!$}
BY
Statement sm = cn.createStatement(); p6B .s_G4
sm.executeQuery(sql); // 执行数据查询语句(select) #?L(#a$k
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); (QA-"9v#i,
2)用PreparedStatement来执行sql语句 .jLMl*6%:
String sql; >a?OXqYP
sql = "insert into user (id,name) values (?,?)"; D$Kz9GVZq
PreparedStatement ps = cn.prepareStatement(sql); y*y`t6D
ps.setInt(1,xxx); x:=0.l#
ps.setString(2,xxx); AlAh
S<
... xI-=tib
ResultSet rs = ps.executeQuery(); // 查询 FGV}5L
int c = ps.executeUpdate(); // 更新 ',L{CQA?c
s$js5
ou
3、处理执行结果 k,
$I59
查询语句,返回记录集ResultSet 4!NfQk>X
更新语句,返回数字,表示该更新影响的记录数 Y]D7i?3N
ResultSet的方法 T_(qN;_
1、next(),将游标往后移动一行,如果成功返回true;否则返回false *(@L+D0N
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 M@',3
.vCY%0oE
4、释放连接 ._8xY$l$
cn.close(); dM$N1DB{U+
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection bbfDt^
o+]Y=r2
可滚动、更新的记录集 CpUI|Rs
1、创建可滚动、更新的Statement g5lmUKlQ$0
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ^zBjG/'7
该Statement取得的ResultSet就是可滚动的 bEVO<x+
2、创建PreparedStatement时指定参数 '*o7_Ez-{
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); bd@*vu}?}
ResultSet.absolute(9000); %s~NQ;Y
批量更新 N1D6D$s 0
1、Statement ORV}j,Ym
Statement sm = cn.createStatement(); V%X:1 8j
sm.addBatch(sql1); c^i"}2+
sm.addBatch(sql2); 3bT6W,J4T
... [0mFy)6
sm.executeBatch() ;zfQ3$@9
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 < fojX\}3
2、PreparedStatement Fw(b1 d>E
PreparedStatement ps = cn.preparedStatement(sql); ZXFAuF
{ ~rVKQ-+4&
ps.setXXX(1,xxx); &4w\6IR
... # i`A4D
ps.addBatch(); d,GtH)( s
} GInZ53cQ
ps.executeBatch(); *F26}q
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 .g6PrhzFbk
hqhu^.}]
事务的处理 1qB!RIau
1、关闭Connection的自动提交 T% /xti5$!
cn.setAutoCommit(false); >N+bU{s
2、执行一系列sql语句 e>])m3xvn
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close WHpUjyBP
Statement sm ; PK:o}IWn~x
sm = cn.createStatement(insert into user...); 1q}u?7nnSG
sm.executeUpdate(); 3{2^G@j
sm.close(); r`&2-]
sm = cn.createStatement("insert into corp...); h"RP>fZt
sm.executeUpdate(); 0?J|C6XM#4
sm.close(); E<X{72fb>
3、提交 RTg Q#<W8
cn.commit(); = )JVT$]w
4、如果发生异常,那么回滚 d- Z+fz
cn.rollback();