java 数据库基本操作 (uRZxX
1、java数据库操作基本流程 GY9y9HNZ
2、几个常用的重要技巧: KXq_K:r?
可滚动、更新的记录集 i+1Qf
批量更新 .>wFztK
事务处理 +v!v[qn
Hsgy'X%om
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 TOrMXcn!/
1、取得数据库连接 !VFem~'d
1)用DriverManager取数据库连接 aiJnfU]W
例子 bs
BZE
String className,url,uid,pwd; R3Ee%0QK
className = "oracle.jdbc.driver.OracleDriver"; Fe5jdV<
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; \q,s?`+B
uid = "system"; 6{8/P'@/Zz
pwd = "manager"; >J@egIKzP
Class.forName(className); 05"qi6tncz
Connection cn = DriverManager.getConnection(url,uid,pwd); g}m+f]|
2)用jndi(java的命名和目录服务)方式 %E aE,
例子 hF.6}28U1
String jndi = "jdbc/db"; 8""mp]o9
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); JN|VPvjE
DataSource ds = (DataSource) ctx.lookup(jndi); M7vj^mt?
Connection cn = ds.getConnection(); N ocFvF7\
多用于jsp中 S~> 5INud
2、执行sql语句 xD4$0Ppu
1)用Statement来执行sql语句 ZtR&wk
String sql; 26 ?23J
;
Statement sm = cn.createStatement(); Dp`HeSKU^
sm.executeQuery(sql); // 执行数据查询语句(select) 0E1=W6UZ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ~{P:sjsU
2)用PreparedStatement来执行sql语句 rd"
&QB{
String sql; >D~w}z/fk
sql = "insert into user (id,name) values (?,?)"; 1AT'S;`
PreparedStatement ps = cn.prepareStatement(sql); pqH4w(;
ps.setInt(1,xxx); "$DldHC
ps.setString(2,xxx); c|Y!c!9F
... R^6Zafp
ResultSet rs = ps.executeQuery(); // 查询 {-h, ZdH^
int c = ps.executeUpdate(); // 更新 LN\[Tmd &
;y OD
3、处理执行结果 MJ\r 4n
查询语句,返回记录集ResultSet +sRP<as
更新语句,返回数字,表示该更新影响的记录数 `s%QeAde
ResultSet的方法 / gu3@@h
1、next(),将游标往后移动一行,如果成功返回true;否则返回false !UcOl0"6
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 vK:QX$b
rREzM)GA
4、释放连接 /BKtw8
cn.close(); ]4o?BkL
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ,T{oy:rB
a,cC!
可滚动、更新的记录集 qv uxhz F
1、创建可滚动、更新的Statement &[~[~m|
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); `.8UKSH+
该Statement取得的ResultSet就是可滚动的 V^2-_V]8
2、创建PreparedStatement时指定参数 Um\0i;7 ~4
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 8YKQItK
ResultSet.absolute(9000); ~#Aa Ldq
批量更新 r)8z#W>s
1、Statement "xn|zB
Statement sm = cn.createStatement(); LABNj{=D!
sm.addBatch(sql1); :Y^I]`lR"
sm.addBatch(sql2); ]u0Jd#@
... a_{6Qdl
sm.executeBatch() 1eD.:_t4
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 :<%vE !$
2、PreparedStatement @)b^^Fp
PreparedStatement ps = cn.preparedStatement(sql); ;(S|cm'>}
{ r.<JDdj
ps.setXXX(1,xxx); Uouq>N
... wS%zWdsz
ps.addBatch(); 02pplDFsM
} hfv%,,e
ps.executeBatch(); /WYh[XKe
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 dhtb?n{
OpQ8\[X+
事务的处理 KuXkI;63J>
1、关闭Connection的自动提交 $H;+}VQ
cn.setAutoCommit(false); KoF
iQ?
2、执行一系列sql语句 gc,Ps
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 8^vArS;
Statement sm ; P#*n3&Uu
sm = cn.createStatement(insert into user...); *Ru2:}?MpS
sm.executeUpdate(); +$,dwyI2t
sm.close(); >|nt2
sm = cn.createStatement("insert into corp...); V.2[ F|P;3
sm.executeUpdate(); CL1;Inzl
sm.close(); Ag6uR(uI
3、提交 uLK(F
B
cn.commit(); z mbZ
4、如果发生异常,那么回滚 tN2 W8d
cn.rollback();