java 数据库基本操作 }T0O~c{$i
1、java数据库操作基本流程 egvb#:zW?
2、几个常用的重要技巧: 9Ta0Li
可滚动、更新的记录集 dU#-;/}o
批量更新 n)~*BpL3
事务处理 q)mG6Su
d
0k#7LubWZl
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 *a\6X(
~
1、取得数据库连接 -V4%f{9T3
1)用DriverManager取数据库连接 QgI[#d{
例子 y^"@$
String className,url,uid,pwd; ~nTj't2R
className = "oracle.jdbc.driver.OracleDriver"; kU+|QBA@
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; L
R\LC6kM
uid = "system"; pCDN9*0/
pwd = "manager"; gW,hI>
Class.forName(className); {#:31)P
Connection cn = DriverManager.getConnection(url,uid,pwd); n1JtY75#,/
2)用jndi(java的命名和目录服务)方式 4-t^?T:qF
例子 j.ucv
String jndi = "jdbc/db"; pB4Uc<e
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); @)BO`;*$fF
DataSource ds = (DataSource) ctx.lookup(jndi); WR3,woo
Connection cn = ds.getConnection(); 43pe6 ^.
多用于jsp中 |mP};&b
2、执行sql语句 lH;V9D^
1)用Statement来执行sql语句
}DXG;L
String sql; =gs-#\%
Statement sm = cn.createStatement(); 'f!U[Qatg
sm.executeQuery(sql); // 执行数据查询语句(select) .%s
U)$bH
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ~ney~Pz_
2)用PreparedStatement来执行sql语句 m`9nDiV
String sql; J*[@M*R;&
sql = "insert into user (id,name) values (?,?)"; 4Wp5[(bg
PreparedStatement ps = cn.prepareStatement(sql); r=&,2meo
ps.setInt(1,xxx); 4 sax
ps.setString(2,xxx); 'w27Lt'V
... *I)J%#
ResultSet rs = ps.executeQuery(); // 查询 IH;sVT$M
int c = ps.executeUpdate(); // 更新
p"#\E0GM
%rMCiz
3、处理执行结果 =KUmvV*\
查询语句,返回记录集ResultSet _0jR({\
更新语句,返回数字,表示该更新影响的记录数 {G Jl<G1
ResultSet的方法 +]s,VSL5`
1、next(),将游标往后移动一行,如果成功返回true;否则返回false S~i9~jA
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 >UMxlvTg&
4SZ,X^]I>
4、释放连接 1vxRhS&FY
cn.close(); P+0'^:J
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Lxwi"ndP
|82q|@e
可滚动、更新的记录集 "~5cz0
H3v
1、创建可滚动、更新的Statement \4L ur
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 0eNdKE
该Statement取得的ResultSet就是可滚动的 %W"u4
NT7
2、创建PreparedStatement时指定参数 uMEM7$o
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); vY-CXWC7
ResultSet.absolute(9000); \ dFE.4
批量更新 g5|~i{"0
1、Statement oGRk/@
Statement sm = cn.createStatement(); =nGFLH6)
sm.addBatch(sql1); HbegdbTJ
sm.addBatch(sql2); !1G
KpL
... W!wof-1
sm.executeBatch() J(l\VvK
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 PqV
F}
2、PreparedStatement 8u2k-_9
PreparedStatement ps = cn.preparedStatement(sql); hhze5_$_
{ $
]s^M=8
ps.setXXX(1,xxx); N<9 c/V
... y)fMVD"(
ps.addBatch(); 7a1o#O
} ,7LfvZj4[
ps.executeBatch(); B;r_[^
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 3'Y-~^ml|
^Hv&{r77
事务的处理 W;Y^(f
1、关闭Connection的自动提交 M
bWby'
cn.setAutoCommit(false); =I`S7oF
2、执行一系列sql语句 =mO5~~"W+v
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close J,
-.5
Statement sm ; c,xdkiy3
sm = cn.createStatement(insert into user...); {^z73Gxt,
sm.executeUpdate(); 8YFG*HSa
sm.close(); taE
p
sm = cn.createStatement("insert into corp...); WR{m?neE_N
sm.executeUpdate(); *S ag
sm.close(); rO7_K>g?
3、提交 u%~'+=
cn.commit(); )2Ei<
4、如果发生异常,那么回滚 hOwb
cn.rollback();