java 数据库基本操作 lS{r=y_0.
1、java数据库操作基本流程 #
Oup^ o@
2、几个常用的重要技巧: AyE\fY5
可滚动、更新的记录集 0)uYizJce
批量更新 }xn_6
事务处理 vxN0,l
Cd#E"dY6
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 q]4pEip
1、取得数据库连接 K2'O]#
1)用DriverManager取数据库连接 K.>wQA&
例子 -ewQp9)G
String className,url,uid,pwd; m4ApHM2
className = "oracle.jdbc.driver.OracleDriver"; ,<ya@Fi{
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; E\2Ml@J
uid = "system"; 4cCF\&yU
pwd = "manager"; N:+
taz-
Class.forName(className); 7CvD'QW /
Connection cn = DriverManager.getConnection(url,uid,pwd); ~el-*=<m
2)用jndi(java的命名和目录服务)方式 b_$1f>
例子 ?~ULIO'
String jndi = "jdbc/db"; 0x)dnq\
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); pe04#zQK
DataSource ds = (DataSource) ctx.lookup(jndi); `U`#I,Ln[
Connection cn = ds.getConnection(); LhJ a)jFQ
多用于jsp中 Z/ bB
h
2、执行sql语句 SHdL/1~t
1)用Statement来执行sql语句 (fk5'
String sql; 6p<`h^
Statement sm = cn.createStatement(); J?712=9
sm.executeQuery(sql); // 执行数据查询语句(select) z[!x:# q8`
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); |w)5;uQ&\
2)用PreparedStatement来执行sql语句 D$Kea
String sql; W"(u^}
sql = "insert into user (id,name) values (?,?)"; `6w#8}
PreparedStatement ps = cn.prepareStatement(sql); `ti8-
ps.setInt(1,xxx); ,jh~;, w2
ps.setString(2,xxx); Up ?=m^
... ]rX9MA6
ResultSet rs = ps.executeQuery(); // 查询 ku.A|+Tn
int c = ps.executeUpdate(); // 更新 .)PqN s:
C|e+0aW
3、处理执行结果 zNtq"T [
查询语句,返回记录集ResultSet O*7i }\{
更新语句,返回数字,表示该更新影响的记录数 #\FT EY!
ResultSet的方法 >!BFt$sd
1、next(),将游标往后移动一行,如果成功返回true;否则返回false %!W%#U0
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 wGXwzU
E$S`6+x`:a
4、释放连接 #EwK"S~
cn.close(); G(OFr2M
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection P/aDd@j
dB)[O9K)
可滚动、更新的记录集 k=uZ=tUft*
1、创建可滚动、更新的Statement 6"%qv`.Fp
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); jH0Bo;
该Statement取得的ResultSet就是可滚动的 fv==Gu%{
2、创建PreparedStatement时指定参数 (+MC<J/i
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); =~,l4g\
ResultSet.absolute(9000); |\{Nfm=:%
批量更新 B)a@fmp"a
1、Statement plku-O;]
Statement sm = cn.createStatement(); /.ZaE+
sm.addBatch(sql1); 22vq=RO7Z
sm.addBatch(sql2); on50+)uN
... H-a^BZ&iU
sm.executeBatch() #JS`e_3Rr
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 csvOg[
2、PreparedStatement u+DX$#-n!]
PreparedStatement ps = cn.preparedStatement(sql); ;IhPvff
{ Sh$U-ch@
ps.setXXX(1,xxx); jZ#UUnR%
... +2yF|/WW#
ps.addBatch(); y< ud('D
} @YB85p"]J.
ps.executeBatch(); uQ1jwYK`7
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 T/Q==Q{W:
EE9vk*[@C
事务的处理 Lupy:4AD
1、关闭Connection的自动提交 =M7PvH'"
cn.setAutoCommit(false); ^Fvr
f`A'
2、执行一系列sql语句 6`W|V+6|7
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close {g@A>
Statement sm ; qOgtGN}k
sm = cn.createStatement(insert into user...); /=ACdJ
sm.executeUpdate(); -$m@*L
sm.close(); &q L<C
sm = cn.createStatement("insert into corp...); w5Z2N[hy
sm.executeUpdate(); @ AggznA8
sm.close(); Vku#;:yUb^
3、提交 ?q6Z's[
cn.commit(); S|) J{~QH
4、如果发生异常,那么回滚 6d};|#}
cn.rollback();