java 数据库基本操作 yFP#z5G
1、java数据库操作基本流程 uoBPi[nK
2、几个常用的重要技巧: ;#"`]khd
可滚动、更新的记录集 Xg"Mjmr
批量更新 LyXABQ]
事务处理 1hp@.Fv
@1[LD[<
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 9=~jKl%\vJ
1、取得数据库连接 )=D9L
1)用DriverManager取数据库连接 U(qM( E
例子 z<P#djx
String className,url,uid,pwd; xhMdn3~U
className = "oracle.jdbc.driver.OracleDriver"; 2I39fZa
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ?Z7C0u#wd
uid = "system"; 8c$IsvJg
pwd = "manager"; &l|B>{4v
Class.forName(className); r>q`# ~
Connection cn = DriverManager.getConnection(url,uid,pwd); 8i"{GGVC
2)用jndi(java的命名和目录服务)方式 {gi"ktgk
例子 1Kebl
String jndi = "jdbc/db"; veE8
N~0N.
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 7,LT4wYH
DataSource ds = (DataSource) ctx.lookup(jndi); }#u}{
Connection cn = ds.getConnection(); @49^WY
多用于jsp中 ^jhHaN]G^
2、执行sql语句 7y`~T+
1)用Statement来执行sql语句 2W~2Hk=0+%
String sql; TT&!WbA-Hk
Statement sm = cn.createStatement(); o_$r*Z|HG
sm.executeQuery(sql); // 执行数据查询语句(select) RMrt4:-DI
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); gA) F
2)用PreparedStatement来执行sql语句 +l3
vIN
String sql; %F/tbXy{
sql = "insert into user (id,name) values (?,?)"; 'Ph;:EMj
PreparedStatement ps = cn.prepareStatement(sql); )I}G:bBa
ps.setInt(1,xxx); If#7SF)n'
ps.setString(2,xxx); 1X9sx&5H
... n2O7n@8
ResultSet rs = ps.executeQuery(); // 查询 C,z]q$4
int c = ps.executeUpdate(); // 更新 1Q;`<=
)DLK<10
3、处理执行结果 y! 1NS
查询语句,返回记录集ResultSet P?uKDON
更新语句,返回数字,表示该更新影响的记录数 V+K.'
J
^@
ResultSet的方法 ,[hJi3xM
1、next(),将游标往后移动一行,如果成功返回true;否则返回false {DO9{96w4
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 0UB'6wRVo
NAocmbfNz
4、释放连接 -jw=Iyv
cn.close(); "7
4 L
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ]V]o%onW
XF$C)id2p
可滚动、更新的记录集 nW%c95E
1、创建可滚动、更新的Statement +1623E
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Gsh2
该Statement取得的ResultSet就是可滚动的 3a S>U #
2、创建PreparedStatement时指定参数 -T(V6&'Qi
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); UX9o
ResultSet.absolute(9000); nb!m>0*/
批量更新 CUd'*Ewu
1、Statement V7v,)a" L
Statement sm = cn.createStatement(); |3cR'|<Ual
sm.addBatch(sql1); )T+htD)
sm.addBatch(sql2); J\0YL\jw1K
... !%(B2J
sm.executeBatch() Yb\36|
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 :R&tO3_F
2、PreparedStatement d16PY_
PreparedStatement ps = cn.preparedStatement(sql); \ d;Ow8%d/
{ LMDa68 s
ps.setXXX(1,xxx); yI;Qb7|^
... )G|UB8]
ps.addBatch(); Mt:(w;Y
} `'QPe42
ps.executeBatch(); t8[:}[Jx
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 [6tQv<}^
@'y"D
事务的处理 $7*Ml)H!9
1、关闭Connection的自动提交 vtT:c.~d
cn.setAutoCommit(false); &Gt9a-ne
2、执行一系列sql语句 +Snjb0
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close :4Vt
Statement sm ; g<-cHF
sm = cn.createStatement(insert into user...); _8>"&1n
sm.executeUpdate(); w$!n8Aqs
sm.close(); /L
4WWQ5
sm = cn.createStatement("insert into corp...); "8X+F%
sm.executeUpdate(); ij),DbWd
sm.close(); G#*;3X$
3、提交 6bn-NY:i
cn.commit(); b +_E)4
4、如果发生异常,那么回滚 }1P
cn.rollback();