java 数据库基本操作 5lrjM^E|
1、java数据库操作基本流程 a1
v%G
2、几个常用的重要技巧: ,?oC+9w
可滚动、更新的记录集 ./i5VBP5
批量更新 'aqlNBG*
事务处理 q#_<J1)z
YMr2Dv\y
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 7w5C
NV
1、取得数据库连接 opv<r*!
1)用DriverManager取数据库连接 %@MO5#)NI
例子 /H~]5JZ3-E
String className,url,uid,pwd; ?X^.2+]*&
className = "oracle.jdbc.driver.OracleDriver"; i#KY'"P
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; *6/OLAkyF
uid = "system"; x%`tWE|
pwd = "manager"; WbJ
Class.forName(className); JJ4w]Dd4
Connection cn = DriverManager.getConnection(url,uid,pwd); .Ge`)_e
2)用jndi(java的命名和目录服务)方式 +.
tcEbFL
例子 oZ\zi> Y,
String jndi = "jdbc/db"; ]Wg&r Y0
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); k< $(
DataSource ds = (DataSource) ctx.lookup(jndi); ~@d4p|K
Connection cn = ds.getConnection(); `b*x}HP$
多用于jsp中 ,Fzuo:{uy
2、执行sql语句 vn1*D-?
1)用Statement来执行sql语句 .kc{)d*0K
String sql; r,Tq";N'
Statement sm = cn.createStatement(); }DFZ9,gQ
sm.executeQuery(sql); // 执行数据查询语句(select) ZfVw33z
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); OfPv'rW{x
2)用PreparedStatement来执行sql语句 ;U[W $w[
String sql; o-+H-
sql = "insert into user (id,name) values (?,?)"; AB=Wj*fr
PreparedStatement ps = cn.prepareStatement(sql); b NR@d'U
ps.setInt(1,xxx); 2Kz407|'
ps.setString(2,xxx); /RemLJP
F
... ^KUM4.
6
ResultSet rs = ps.executeQuery(); // 查询 &xE+PfX
int c = ps.executeUpdate(); // 更新 s8+{##"1
q
W(o#2;{ln
3、处理执行结果 jZR2Nx}16
查询语句,返回记录集ResultSet v9MliD'
更新语句,返回数字,表示该更新影响的记录数 XM~eocn
ResultSet的方法 iLk"lcX
1、next(),将游标往后移动一行,如果成功返回true;否则返回false gQ$0 |0O
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 6QePrf
FV\$M6
_
4、释放连接 DbrK,'b%
cn.close(); I/_,24[
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection F0KNkL>&g
(V<pz2\
可滚动、更新的记录集 @r]1;KG
1、创建可滚动、更新的Statement 1xj w=
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 48LzI@H&
该Statement取得的ResultSet就是可滚动的 u85?f
2、创建PreparedStatement时指定参数 f"Kl?IN8
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); mk[<=k~
ResultSet.absolute(9000); ZO&F15$P
批量更新 PMZ*ECIJU
1、Statement qDPl( WXb
Statement sm = cn.createStatement(); 91|~KR)
sm.addBatch(sql1); jwO7r0?\`G
sm.addBatch(sql2);
LX</xI08W
... JlE b
sm.executeBatch() :LLz$[c8
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 s)}EMDY
2、PreparedStatement 5"z~BE7
PreparedStatement ps = cn.preparedStatement(sql); 4\y>pXML-U
{ DAQozhP8
ps.setXXX(1,xxx); [E;~Y_l
... ;Swj`'7
ps.addBatch(); Voo_
?
} N{?Qkkgx
ps.executeBatch(); ,U=7#Cf!
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 1?{w~cF}
!yu-MpeG
事务的处理 jBU!xCO
1、关闭Connection的自动提交 e_dsBmTh
cn.setAutoCommit(false); Ns6CxE9
2、执行一系列sql语句 \9k{h08s
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Z&5cJk
W
Statement sm ; /_i]bM7W
sm = cn.createStatement(insert into user...); G\#dMCk?
sm.executeUpdate(); K-n]m#U4o
sm.close();
\z? -
sm = cn.createStatement("insert into corp...); Oee>d<
sm.executeUpdate(); @!::_E+F]
sm.close(); !Q{~f;L
3、提交 Nrzg>WQa
cn.commit(); e!P]$em|1E
4、如果发生异常,那么回滚 \4n9m
cn.rollback();