java 数据库基本操作 S"z4jpqn3
1、java数据库操作基本流程 bV,R*C
2、几个常用的重要技巧: ti%
e.p0[
可滚动、更新的记录集 Ut =y`]F
批量更新 a{,t@G
事务处理 @jeV[N,0
o(qmI/h
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 "j>0A
Hem
1、取得数据库连接 \H(,'w7H
1)用DriverManager取数据库连接 +[DVD
例子 gk`.8o
String className,url,uid,pwd; s1q d/
className = "oracle.jdbc.driver.OracleDriver"; S22 ;g
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; uI wyan-
uid = "system"; lEs/_f3;A
pwd = "manager"; 3!x)LUWfWY
Class.forName(className); )9->]U@
Connection cn = DriverManager.getConnection(url,uid,pwd); de=T7,G#
2)用jndi(java的命名和目录服务)方式 LlqhZetS
例子 .&dcJh*O+
String jndi = "jdbc/db"; fok#D>q
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); K-5)Y+| >
DataSource ds = (DataSource) ctx.lookup(jndi); &x #5-O'
Connection cn = ds.getConnection(); >?KyPp
多用于jsp中 KS_d5NvYl
2、执行sql语句 Q0-~&e_'
1)用Statement来执行sql语句 w6 .HvH-@?
String sql; `rV,<
Statement sm = cn.createStatement(); `^[ra%a
sm.executeQuery(sql); // 执行数据查询语句(select) yhmW-#+^e
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 'r
CR8>k
2)用PreparedStatement来执行sql语句 ^g\%VIOD
String sql; Y8T.RS0
sql = "insert into user (id,name) values (?,?)"; 6qf`P!7d]M
PreparedStatement ps = cn.prepareStatement(sql); (PF (,B
ps.setInt(1,xxx); Af~AE2b3"
ps.setString(2,xxx); ,\7okf7H,-
... N~(}?'y9S
ResultSet rs = ps.executeQuery(); // 查询 g9JtWgu
int c = ps.executeUpdate(); // 更新 fM{Vy])J
?K"]XXsI
3、处理执行结果 tA.C"
查询语句,返回记录集ResultSet R,lr&;a8
更新语句,返回数字,表示该更新影响的记录数 t!GY>u>`
ResultSet的方法 k6\c^%x
1、next(),将游标往后移动一行,如果成功返回true;否则返回false O(!'V~3
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ovp>"VuC
3#unh`3b
4、释放连接 =Ju}{ bX
cn.close(); "mA/:8` Q
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection _QY "#
+W`~bX+
可滚动、更新的记录集 pppbn]%Ob
1、创建可滚动、更新的Statement )uP= o
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); b3H;Ea?^^<
该Statement取得的ResultSet就是可滚动的 DS
yE
2、创建PreparedStatement时指定参数 \b->AXe8
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Y/gCtSF
ResultSet.absolute(9000); 2S3F]fG0
批量更新 B!0[LlF+
1、Statement y\x<!_&D
Statement sm = cn.createStatement(); Cpl)byb
sm.addBatch(sql1); q I}Zg)q]
sm.addBatch(sql2); -_+0[Nb.
... 6822xk
sm.executeBatch() tp"\
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 e_SlM=_u
2、PreparedStatement _+i-)
PreparedStatement ps = cn.preparedStatement(sql); l_WY];a
{ jBM>Pe^`3
ps.setXXX(1,xxx); $8)/4P?OL
... O{PRK5 ^h
ps.addBatch(); gTT-7
} I
g`#U~
ps.executeBatch(); p%BO:%v
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 r\zK>GVm_
+;T%7j"wz
事务的处理 k6XO-a f
1、关闭Connection的自动提交 w}iflAnjq
cn.setAutoCommit(false); w jF\>
2、执行一系列sql语句 h!.(7qdd
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close lU?"\m
Statement sm ; 1EN5ZN,
sm = cn.createStatement(insert into user...); BLRrHaX0
sm.executeUpdate(); !u"Hf7/
sm.close(); Y+E@afsKs
sm = cn.createStatement("insert into corp...); U1Oq"Ij~
sm.executeUpdate(); V+ Z22
sm.close(); ;8!D8o(+
3、提交 +=O:z *O
cn.commit(); ;iEqa"gO
4、如果发生异常,那么回滚 E_?
M&
cn.rollback();