java 数据库基本操作 `V9bd}M%~;
1、java数据库操作基本流程 S"*k#ao
2、几个常用的重要技巧: bVz<8b6h'-
可滚动、更新的记录集 "*HM8\
批量更新 :| 9vMM^$
事务处理 ;"cQ)=s9Y
@Y `Z3LiR$
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 'yVe&5?
1、取得数据库连接 ]A }ZaXd
1)用DriverManager取数据库连接 '4M{Xn}@
例子 m!KEK\5M?
String className,url,uid,pwd; NxF:s,a6
className = "oracle.jdbc.driver.OracleDriver"; W! $U{=
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; |Ogh-<|<
uid = "system"; 1qR$ Yr\
pwd = "manager"; .tKBmq0xo"
Class.forName(className); LCSvw
Connection cn = DriverManager.getConnection(url,uid,pwd); G%k&|
2)用jndi(java的命名和目录服务)方式 :xHKbWz6j
例子 4AzDWK@/
String jndi = "jdbc/db"; |$
^3 5F
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); AS]8rH
DataSource ds = (DataSource) ctx.lookup(jndi); 0\U*
Connection cn = ds.getConnection(); a>l,H#w*vW
多用于jsp中 Tv1oy%dK
2、执行sql语句 s<LnUF1b
1)用Statement来执行sql语句 x"sbm
String sql; D7nK"]HG;l
Statement sm = cn.createStatement(); T%oJmp?0
sm.executeQuery(sql); // 执行数据查询语句(select) -ysNo4#e&
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); H
~3.F
2)用PreparedStatement来执行sql语句 `D|])^"{
String sql; `Kg!aN
sql = "insert into user (id,name) values (?,?)"; cz,CL/rno
PreparedStatement ps = cn.prepareStatement(sql); mxZ+r#|di
ps.setInt(1,xxx); {96MfhkeBv
ps.setString(2,xxx); :[+8(~| za
... [>mH
ResultSet rs = ps.executeQuery(); // 查询 kSiyMDY-
int c = ps.executeUpdate(); // 更新 k9oi8G'g~
|=ph&9
3、处理执行结果 @p~scE.#\
查询语句,返回记录集ResultSet x %`YV):*
更新语句,返回数字,表示该更新影响的记录数 Wu*
4r0
ResultSet的方法 va_u4
1、next(),将游标往后移动一行,如果成功返回true;否则返回false x-c5iahp'
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 L4B/
g)K
Mi#i 3y(
4、释放连接 lr4wz(q<9
cn.close(); 7_PY%4T"
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection QxG^oxU}
|pS]zD
可滚动、更新的记录集 aV7VbC
1、创建可滚动、更新的Statement 9[JUJ,#X'0
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); JwxKWVpWv
该Statement取得的ResultSet就是可滚动的 kJl^,q
2、创建PreparedStatement时指定参数 ]VQd*~ -
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); iS)-25M'
ResultSet.absolute(9000); s<"|'~<n
批量更新 i`e[Vwe2x@
1、Statement ROn@tW
Statement sm = cn.createStatement(); UapU:>!"`
sm.addBatch(sql1); *Sdx:G~gp
sm.addBatch(sql2); N@tKgx
... }wRm ~
sm.executeBatch() @gbW:
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 IV!`~\@
2、PreparedStatement a9;KS>~bq
PreparedStatement ps = cn.preparedStatement(sql); OQfFS+6
{ hFm^Fy[R
ps.setXXX(1,xxx); ~C^:SND7
... #<==7X#
ps.addBatch(); \,Ws=9f
} O$r/{{I.
ps.executeBatch(); n=4
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 FS=yc.Q_
xi{r-D8Z
事务的处理 `B"sy8}x
1、关闭Connection的自动提交 "~r)_Ko
cn.setAutoCommit(false); , d $"`W2
2、执行一系列sql语句 &-qQF`7
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close m
W>Iib|
Statement sm ; >v, si].
sm = cn.createStatement(insert into user...); Y!oLNGY
sm.executeUpdate(); }\S'oC\[
sm.close(); ?e6>dNw
sm = cn.createStatement("insert into corp...); wdP(MkaV
sm.executeUpdate(); E"VFBKB
sm.close(); rxX4Cw]\"y
3、提交 hsrf 2Xw[
cn.commit(); "G%</G8M
4、如果发生异常,那么回滚 w>9d^kU'
cn.rollback();