java 数据库基本操作 a(JtGjTf&
1、java数据库操作基本流程 "$"<AKCwS
2、几个常用的重要技巧: rTC| 8e
可滚动、更新的记录集 P4MP`A
批量更新 6QPbmO]z
事务处理 w3>G3=b
H?ue!5R#L
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ?q'r9Ehe
1、取得数据库连接 Xn!=/<TIVz
1)用DriverManager取数据库连接 &$qIJvMiK
例子 ]/R>nT
String className,url,uid,pwd; ]YDqmIW
className = "oracle.jdbc.driver.OracleDriver"; D*HK[_5
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; )B@&q.2B=
uid = "system"; N0
t26| A
pwd = "manager"; z%6egi>
Class.forName(className); 3U?^49bJ
Connection cn = DriverManager.getConnection(url,uid,pwd); SN QLEe
2)用jndi(java的命名和目录服务)方式 "VsS-b^ P
例子 HqOnZ>D
String jndi = "jdbc/db"; Oh}@c~7;
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); el^<M,7!
DataSource ds = (DataSource) ctx.lookup(jndi); t!ZFpMv]n
Connection cn = ds.getConnection(); q<fj1t1w
多用于jsp中 p7*7V.>X
2、执行sql语句 =Y3 d~~
1)用Statement来执行sql语句 6|Rj
YX
String sql; w'5W L
Statement sm = cn.createStatement(); ?GZ?HK|
sm.executeQuery(sql); // 执行数据查询语句(select) b DF_
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); R, zp&L
2)用PreparedStatement来执行sql语句 4
>D5t)254
String sql; +hT9V1'-D
sql = "insert into user (id,name) values (?,?)"; 5'0kf7
PreparedStatement ps = cn.prepareStatement(sql); >R/^[([;]
ps.setInt(1,xxx); r^\Wo7q
ps.setString(2,xxx); 0wETv
... 8,m:
ResultSet rs = ps.executeQuery(); // 查询 8HSGOs =8
int c = ps.executeUpdate(); // 更新 F|WH=s3
okW'}@jD
3、处理执行结果 Pb :6nH=
查询语句,返回记录集ResultSet =gB{(
更新语句,返回数字,表示该更新影响的记录数 G~4|]^`g
ResultSet的方法 ht5:kt`F
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 7nPm{=BG
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 wi:d!,P`e
A kqGk5e
^
4、释放连接 afcyAzIB&
cn.close(); AqrK==0N
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection TF,a`?c`
<DdzDbgax
可滚动、更新的记录集 6tM@I`l
1、创建可滚动、更新的Statement .aIFm5N3?
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); T~N877
该Statement取得的ResultSet就是可滚动的 D
<Fl7QAb
2、创建PreparedStatement时指定参数 o\yqf:V8
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); kZ
9n@($B
ResultSet.absolute(9000); SR\$ fmo
批量更新 Fg^zz*e
1、Statement [
**F
Statement sm = cn.createStatement(); %{P." ki
sm.addBatch(sql1); PuU<
sm.addBatch(sql2); ~/R}K g(
... nx4E}8!Lh
sm.executeBatch() t== a(e
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 RQ51xTOL4]
2、PreparedStatement 'nqVcNgb
PreparedStatement ps = cn.preparedStatement(sql); "}UYsXg
{ pvd9wKz
ps.setXXX(1,xxx); 7m9T'
... ngaQa-8w
ps.addBatch(); ),I7+rY
} AzBpQb*
ps.executeBatch(); c6pGy%T-
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 S4X['0rX!
7otqGE\2
事务的处理 C)s*1@af
1、关闭Connection的自动提交 s!BZrVM%I`
cn.setAutoCommit(false); t+SLU6j,
2、执行一系列sql语句 j(=zc6m
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close TsZX'Yn
Statement sm ; E@;v|Xc
sm = cn.createStatement(insert into user...); 1 ^=[k
sm.executeUpdate(); 4=n%<U`Z/
sm.close(); 27jZ~Bp$
sm = cn.createStatement("insert into corp...); 0 :1ldU
4
sm.executeUpdate(); 12%4>2}~>
sm.close(); ;%aWA
3、提交 }=."X8zOI8
cn.commit(); jLf8 7
4、如果发生异常,那么回滚 15~+Ga4
cn.rollback();