java 数据库基本操作 .4-,_`T?
1、java数据库操作基本流程 $n!K6fkX%
2、几个常用的重要技巧: y >+mc7n
可滚动、更新的记录集 Pw[g
批量更新 />44]A<
事务处理 4a''Mi`u
m@Rtlb
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ~ G6"3"
1、取得数据库连接 -7{$Vj
1)用DriverManager取数据库连接 j Ux
z
例子 k{I01
String className,url,uid,pwd; bB}5U@G|
className = "oracle.jdbc.driver.OracleDriver"; g(|{')8?d
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; %$5H!!~o
uid = "system"; aZ|=(]
pwd = "manager"; )"+2Z^1-
Class.forName(className); ~j9O$s~)
Connection cn = DriverManager.getConnection(url,uid,pwd); x@Hd^xH`
2)用jndi(java的命名和目录服务)方式 .6f%?oo
例子 cyM-)r@YQV
String jndi = "jdbc/db"; nh>K`+>co
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Np+&t}
DataSource ds = (DataSource) ctx.lookup(jndi); w= P9FxB
Connection cn = ds.getConnection(); NnT g3:.
多用于jsp中 :'iYxhM.V
2、执行sql语句 /X'(3'a
1)用Statement来执行sql语句 4m)OR
String sql; ^BQrbY
Statement sm = cn.createStatement(); `n5"0QRd
sm.executeQuery(sql); // 执行数据查询语句(select) !> }.~[M
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); XolZonJr
2)用PreparedStatement来执行sql语句 $(e#aHB
String sql; xg_Df,
sql = "insert into user (id,name) values (?,?)"; sZGj"_-Hzu
PreparedStatement ps = cn.prepareStatement(sql); rgmF: C
ps.setInt(1,xxx); 9d[5{"2j
ps.setString(2,xxx); Rp7ntI:
... O3DmNq$dz
ResultSet rs = ps.executeQuery(); // 查询 ,L bBpi=TJ
int c = ps.executeUpdate(); // 更新 K"j_>63)
} :=Tm]S
3、处理执行结果 ^j#rZ;uc
查询语句,返回记录集ResultSet \.YS%"Vz
更新语句,返回数字,表示该更新影响的记录数 ^V$Ajt
ResultSet的方法 D(-yjY8aG
1、next(),将游标往后移动一行,如果成功返回true;否则返回false o*U]v
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 !$N<ds.
AdRX`[ik
4、释放连接 Q'_z<V
cn.close(); EBz}|GY;
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ~.;<
Bj
;22oY>w
可滚动、更新的记录集 sVG(N.y
1、创建可滚动、更新的Statement Z R/#V7Pj
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); T^J >ZDA
该Statement取得的ResultSet就是可滚动的 a:QDBS2Llv
2、创建PreparedStatement时指定参数 jck}" N
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Xd^\@
ResultSet.absolute(9000); orOt>5}b<
批量更新 i[wb0yL
1、Statement 3Zi@A4Wu
Statement sm = cn.createStatement(); `{qG1
sm.addBatch(sql1); 5^^XQ?"
sm.addBatch(sql2); \=_{na_
... Um&(&?Xf
sm.executeBatch() 5mb]Q)f9-
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 L:@7tc.
2、PreparedStatement [l,Ei?
PreparedStatement ps = cn.preparedStatement(sql); 7jdb)l\p=
{ )7h$G-fe
ps.setXXX(1,xxx); lRXK\xIP ,
... RjN{%YkXe
ps.addBatch(); uu`G 2[t
} _3ZYtmn.
ps.executeBatch(); iX)%Q
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 720D V+o
P#AW\d^"B
事务的处理 t. ;LnrY
1、关闭Connection的自动提交 thhwN
A
cn.setAutoCommit(false); K5lmVF\$P
2、执行一系列sql语句 c"[cNZo
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close MdW]MW{
Statement sm ; b9!FC$^J
sm = cn.createStatement(insert into user...); P'_H/r/#
sm.executeUpdate(); '*3h!lW1.
sm.close(); 9g<7i
sm = cn.createStatement("insert into corp...); /FRm2m83
sm.executeUpdate(); ^jx7@LgS=
sm.close(); @H=:)*;
3、提交 /HaHH.e
cn.commit(); V;v8=1t!
4、如果发生异常,那么回滚 <*qnY7c&N;
cn.rollback();