java 数据库基本操作 vU*x2fVb}
1、java数据库操作基本流程
?W0(|9
2、几个常用的重要技巧: {C^@Q"I
可滚动、更新的记录集 FZH\Q~IUV
批量更新 <8#ObdY!
事务处理 r,N[ )@
nW+YOX|+
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 a45ss7
1、取得数据库连接 ^# A.@
1)用DriverManager取数据库连接 1#
t6`N]?V
例子 L fl-!1
String className,url,uid,pwd; ?`zgq>R}w[
className = "oracle.jdbc.driver.OracleDriver"; 1j\aH&)GH
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; _ jAo:K_Z
uid = "system"; =C
f(B<u
pwd = "manager"; ~"!a9GZ
Class.forName(className); @-#T5?
Connection cn = DriverManager.getConnection(url,uid,pwd); O4No0xeWo
2)用jndi(java的命名和目录服务)方式 |c2v%'J2G
例子 ArI]`h'W
String jndi = "jdbc/db"; }Uf<ZXW
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); uD["{?H
DataSource ds = (DataSource) ctx.lookup(jndi); *o' 4,+=am
Connection cn = ds.getConnection(); ecX/K.8l
多用于jsp中 !]S=z^"<
2、执行sql语句 NNa1EXZ[
1)用Statement来执行sql语句 2N~ E' 25
String sql; z}.D"
P+
Statement sm = cn.createStatement(); cX
A t:m
sm.executeQuery(sql); // 执行数据查询语句(select) #
4|9Fj??
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 2D([Z -<i
2)用PreparedStatement来执行sql语句 BN@,/m9OQ%
String sql; mEQ!-p
sql = "insert into user (id,name) values (?,?)"; {$^SP7qV#>
PreparedStatement ps = cn.prepareStatement(sql); !Zbesp KZ
ps.setInt(1,xxx); >sj
bK%
ps.setString(2,xxx); U&y`-@A4
... RP(/x+V
ResultSet rs = ps.executeQuery(); // 查询 ewB!IJxh
int c = ps.executeUpdate(); // 更新 8,o17}NY,
{@r*+~C3
3、处理执行结果 WwW^[k (X
查询语句,返回记录集ResultSet }#= Od e
更新语句,返回数字,表示该更新影响的记录数 PMKb ]y
ResultSet的方法 |,}E0G.
1、next(),将游标往后移动一行,如果成功返回true;否则返回false aQcN&UA@
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 b4 hIeBI\
o&^NwgRCF
4、释放连接 el'j&I
cn.close(); acOJ]]
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ,w&:_n
4^Ow^7N?
可滚动、更新的记录集 bZ#X9fT
1、创建可滚动、更新的Statement jNy?[
)
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY);
C(]'&~}(
该Statement取得的ResultSet就是可滚动的 WF/l7u#4i
2、创建PreparedStatement时指定参数 ">6&+^BN'
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); VjTe4$ *
ResultSet.absolute(9000); KtMbze
批量更新 /84bv=
1、Statement 8Inx/>eOI
Statement sm = cn.createStatement(); id?_>9@P
sm.addBatch(sql1); 9bn2UiJk
sm.addBatch(sql2);
A1Q
+0
... d,R6` i
sm.executeBatch() 8^w/HCC8O
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Tiprdvm<
2、PreparedStatement G&o64W;-s
PreparedStatement ps = cn.preparedStatement(sql); ,#aS/+;[)
{
5T/J%
ps.setXXX(1,xxx); dYyW]nZ&
... {NeWdC
ps.addBatch(); ?
: md
} $WNG07]tU
ps.executeBatch(); _[1^s$
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 gUGOHd(A
S'?fJ.
事务的处理 NQ!<f\m4n
1、关闭Connection的自动提交 J" bD\%
cn.setAutoCommit(false); ;\s~%~\
2、执行一系列sql语句 _:5=|2-E
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 6To:T[ z#
Statement sm ; -gSj>b7T
sm = cn.createStatement(insert into user...); x(vai1CrdH
sm.executeUpdate(); tE:X,Lt[
sm.close(); vpa fru4
sm = cn.createStatement("insert into corp...); WFj*nS^~l
sm.executeUpdate(); DoG%T(M!a9
sm.close(); L *{QjH
3、提交
0dh#/
cn.commit(); M1(9A>|nF
4、如果发生异常,那么回滚 o4'Wr
cn.rollback();