java 数据库基本操作 t7l{^d_L
1、java数据库操作基本流程 <#J5.I 1
2、几个常用的重要技巧: $|xSM2
可滚动、更新的记录集 n\)1Bz
批量更新 <}:` Y"
事务处理 4(sHUWT
d!w3LwZ
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 u7^(?"x
1、取得数据库连接 ;W+8X-B
1)用DriverManager取数据库连接 P3`$4p?
例子 0PqI^|!
String className,url,uid,pwd; V*ao@;sD
className = "oracle.jdbc.driver.OracleDriver"; =Q{?!
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 3<Zp+rD
uid = "system"; xu_,0ZT]{
pwd = "manager"; 'B{FRK
Class.forName(className); [al$sCD]+
Connection cn = DriverManager.getConnection(url,uid,pwd); A+!,{G
2)用jndi(java的命名和目录服务)方式 WPkKbF
例子 `<yQ`Y_X
String jndi = "jdbc/db"; I ^m
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ax>j3HKi
DataSource ds = (DataSource) ctx.lookup(jndi); 5wmd[YL
Connection cn = ds.getConnection(); #GLW3}
多用于jsp中 ,%
QhS5e
2、执行sql语句 t[J=8rhER
1)用Statement来执行sql语句 oz>2P.7
String sql; Q&N#q53
Statement sm = cn.createStatement(); $%q=tn'EX
sm.executeQuery(sql); // 执行数据查询语句(select) nX 9]dz
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); (5 @H
2)用PreparedStatement来执行sql语句 v+"4YIN
String sql; w6Nnx5Ay
sql = "insert into user (id,name) values (?,?)"; SF&2a(~s
PreparedStatement ps = cn.prepareStatement(sql); `:Gzjngc
ps.setInt(1,xxx); JC%&d1
ps.setString(2,xxx); G~o!u8^;
... 5LB{b]w7m
ResultSet rs = ps.executeQuery(); // 查询 Jn^b}bk t
int c = ps.executeUpdate(); // 更新 &}[P{53sr
C6[W/,eS
3、处理执行结果 &n
)MGg1%
查询语句,返回记录集ResultSet &:g:7l]g
更新语句,返回数字,表示该更新影响的记录数 (z>t 4(%\
ResultSet的方法 {@vnKyf^K
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ,bXZ<RY$
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 C= V2Y_j
A
$gn{ c
4、释放连接 8'zZVX D<
cn.close(); y7M{L8{0
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection UL-_z++G
sa4w.9O1GS
可滚动、更新的记录集 *9"x0bth
1、创建可滚动、更新的Statement s6@mXO:H^
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); HB8s[]A:D
该Statement取得的ResultSet就是可滚动的 l@Vv%w9H
2、创建PreparedStatement时指定参数 uyxYCc
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); g/JF(nkP
ResultSet.absolute(9000); A$3Rbn}"
批量更新 IO)#O<
1、Statement m9oOH5@K~
Statement sm = cn.createStatement(); a3<:F2=~\
sm.addBatch(sql1); @2/|rq
sm.addBatch(sql2); OIL8'xY.w
... uD>=
sm.executeBatch() >4jE[$p]"
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 \O;2^
2、PreparedStatement `,-mXxTNT
PreparedStatement ps = cn.preparedStatement(sql); =&} _bd/]
{ /j$=?Rp
ps.setXXX(1,xxx); D<;~eZ'
... d]]z )
ps.addBatch(); o]4\Geg$
} OQ&N]P2p
ps.executeBatch(); B6Kl_~gT
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 U_(>eVi7F
qU7_%Z
事务的处理 >Ua'*
1、关闭Connection的自动提交 ^sD
M>OHp
cn.setAutoCommit(false);
2Qp}f^
2、执行一系列sql语句 ![\-J$
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close N!7}B
Statement sm ; iyl
i/3|
sm = cn.createStatement(insert into user...); RkYn6
sm.executeUpdate(); :.,9}\LK
sm.close(); _ \6v@
sm = cn.createStatement("insert into corp...); &
"&s,
sm.executeUpdate(); \~l_w
,Poo
sm.close(); `SFeln{1B
3、提交 @|SeabN^-
cn.commit(); t\K
(zE
4、如果发生异常,那么回滚 PlGif)
cn.rollback();