java 数据库基本操作 oEQ{m5O9
1、java数据库操作基本流程 `*" H/QG
2、几个常用的重要技巧: .L^pMU+!^
可滚动、更新的记录集 bCA2ik
批量更新 Xb=2/\}|f
事务处理 Tf#2"(!
mWli}j#
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 B.22
DuE#
1、取得数据库连接 0i5y(m&7
1)用DriverManager取数据库连接 bB:r]*_
s]
例子 fou_/Nrue
String className,url,uid,pwd; SE;Tujwhqi
className = "oracle.jdbc.driver.OracleDriver"; {K45~ha9!m
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; #*Yi4Cn<
uid = "system"; Y^f94s:2S
pwd = "manager"; $!|8g`Tm
Class.forName(className); "?.'{,Q
Connection cn = DriverManager.getConnection(url,uid,pwd); Q%& _On
2)用jndi(java的命名和目录服务)方式 WxVn&c\
例子
':4}O#
String jndi = "jdbc/db"; &o*s !u
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); &c!j`86y*
DataSource ds = (DataSource) ctx.lookup(jndi); j\`EUC
Connection cn = ds.getConnection(); %@lV-(5q
多用于jsp中 Lj&1K~U
2、执行sql语句 n5Nan
1)用Statement来执行sql语句 :DdBn.
String sql; ]6t]m2~\
Statement sm = cn.createStatement(); k_D4'(V:b
sm.executeQuery(sql); // 执行数据查询语句(select) ~K~b`|1
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); qIbg
4uE
2)用PreparedStatement来执行sql语句 rU=b?D)n!w
String sql;
<+AI t
sql = "insert into user (id,name) values (?,?)"; N5 SLF4R1
PreparedStatement ps = cn.prepareStatement(sql); >~I
xyQp
ps.setInt(1,xxx); bJQ5- *F
ps.setString(2,xxx); AT B\^;n.
... Hp)X^O"
ResultSet rs = ps.executeQuery(); // 查询 n7IL7?!o
int c = ps.executeUpdate(); // 更新 [G{rHSK5tQ
CM%|pB/z
3、处理执行结果 r}/yi
查询语句,返回记录集ResultSet V$/u
更新语句,返回数字,表示该更新影响的记录数 Em e'Gk
ResultSet的方法 #XTY7,@P
1、next(),将游标往后移动一行,如果成功返回true;否则返回false [3O^0-:6E
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 $Wit17j
0U82f1ei
4、释放连接 cGgM8
cn.close(); }>MP{67Dm
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection tcBC!_vF
xS6(K
可滚动、更新的记录集 =?/N5O(
1、创建可滚动、更新的Statement ]y3pE}R
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); #TMm#?lC
该Statement取得的ResultSet就是可滚动的 9=t#5J#O
2、创建PreparedStatement时指定参数 )W&o?VRfO
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); j/)"QiS*?
ResultSet.absolute(9000); v5(q)h
批量更新 ic%?uWN
1、Statement d"#gO,H0
Statement sm = cn.createStatement(); C%giv9a
sm.addBatch(sql1); wYZT D*A2h
sm.addBatch(sql2); u~s
Sk
... iO!27y
sm.executeBatch() tIq>Oojdx
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 "pt+Fe|@c;
2、PreparedStatement Dt.0YKF
PreparedStatement ps = cn.preparedStatement(sql); 16"#i
{ 6!P`XTTE
ps.setXXX(1,xxx); yiiyqL*E
... T}C2e! _O
ps.addBatch(); 7#QLtU
} OnZF6yfN=3
ps.executeBatch(); b,nn&B5@{
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 q5Fs )B
YiD-F7hf.*
事务的处理 ]JOephX2R
1、关闭Connection的自动提交 8 RVS)D''
cn.setAutoCommit(false); "mP&8y9F
2、执行一系列sql语句 h }<0 /
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close !7}IqSs
Statement sm ; /-h6`@[
sm = cn.createStatement(insert into user...); z5x _fAT(
sm.executeUpdate(); >A-<ZS*N
sm.close(); b9!.-^<8y
sm = cn.createStatement("insert into corp...); Y RPm^kW
sm.executeUpdate(); 7 _`L$<-n
sm.close(); J , V
3、提交 pgT9hle/
cn.commit(); t)` p@]j
4、如果发生异常,那么回滚 m9Ax\lf
cn.rollback();