java 数据库基本操作 DV?c%z`YO
1、java数据库操作基本流程 o6x8jz
2、几个常用的重要技巧: &sn-;r
可滚动、更新的记录集 YJwI@E(l$
批量更新 .j)DE}[q>
事务处理 Ao\ OU}
v8\_6}*I
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 E2o8'.~Yd`
1、取得数据库连接 " 5Pqvi
1)用DriverManager取数据库连接 dJQwb
例子 "kc%d'c(
String className,url,uid,pwd; 0"\js:-$
className = "oracle.jdbc.driver.OracleDriver"; ooa"Th<
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Ug#B( }/
uid = "system"; 6R3/"&P(/#
pwd = "manager"; Y*jkUQ
Class.forName(className); NP\/9
8|1
Connection cn = DriverManager.getConnection(url,uid,pwd); 4%yeEc;z
2)用jndi(java的命名和目录服务)方式 iqX%pR~Yo
例子 BUI#y `J
String jndi = "jdbc/db"; ~t*_
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); _Nz?fJ:$@
DataSource ds = (DataSource) ctx.lookup(jndi); Z~w?Qm:/
Connection cn = ds.getConnection(); X+\=dhn69
多用于jsp中 M_$;"NS+}
2、执行sql语句 2S@Cj{R(
1)用Statement来执行sql语句 um".Z4S
String sql; r<dvo%I#|
Statement sm = cn.createStatement(); ~}D"8[ABj
sm.executeQuery(sql); // 执行数据查询语句(select) ?*q-u9s9
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); rV%;d[LB
2)用PreparedStatement来执行sql语句 ki`ur%h
String sql; './qBJ
sql = "insert into user (id,name) values (?,?)"; $Vs5d=B
PreparedStatement ps = cn.prepareStatement(sql); 8v^AVg
ps.setInt(1,xxx); ? R[GSS1
ps.setString(2,xxx); >A L^y(G
... j=Q ?d]
ResultSet rs = ps.executeQuery(); // 查询 h=au`o&CG
int c = ps.executeUpdate(); // 更新 SrdCLT8
"5sUE!)f
3、处理执行结果 0x,4H30t(
查询语句,返回记录集ResultSet }lx'NY~(W
更新语句,返回数字,表示该更新影响的记录数 ]xV2=!J
ResultSet的方法 apxq] !
`
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Rh@UxNy\,
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 8"wavh|g4
rUB67ok*
4、释放连接 l@<Jp *|
cn.close(); ;,KT+!H$
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 4kNSF
XS0NjZW
可滚动、更新的记录集 M}" KAa
1、创建可滚动、更新的Statement )Y1+F,C
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); '<C#"2
该Statement取得的ResultSet就是可滚动的 W H+Sd
2、创建PreparedStatement时指定参数 (H|^Ow5
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); eg"!.ol
ResultSet.absolute(9000); Co<F<eXe
批量更新 B]#iZ,Tp
1、Statement #@M'*X_%}K
Statement sm = cn.createStatement(); 51s 3hX$
sm.addBatch(sql1); dlV HyCW
sm.addBatch(sql2); y.Yni*xt/
... !1+!;R@&H>
sm.executeBatch() Pf<BQ*n
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 'Hq#9?<2M
2、PreparedStatement tF!C']
PreparedStatement ps = cn.preparedStatement(sql); Oh=Kl3xs
{ ^S(["6OJ(
ps.setXXX(1,xxx); .X4UDZQg
... y
0fI7:e3
ps.addBatch(); 0)|;uW
} =\jPnov!
ps.executeBatch(); pN;T t+}
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 4Z{ r
3)dtl!VMW[
事务的处理 hya
$Vp
1、关闭Connection的自动提交 `=W#owAF
cn.setAutoCommit(false); [k,FJ5X
2、执行一系列sql语句 d6e]aO=g
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close v kW2&
Statement sm ; 2s`~<EF N
sm = cn.createStatement(insert into user...); n#5 pd;!n
sm.executeUpdate(); "4QD\k5
sm.close(); `uqsYY`V
sm = cn.createStatement("insert into corp...); G"prq&
sm.executeUpdate(); RjHKFB2
sm.close(); z
2Ao6*%
3、提交 \v.YP19
cn.commit(); IqjH
4、如果发生异常,那么回滚 q9m-d-!)
cn.rollback();