java 数据库基本操作 >E3OYa?G
1、java数据库操作基本流程 ;C'*Ui
2、几个常用的重要技巧: mDUS9>
可滚动、更新的记录集 yFjSvm6
批量更新 r>\.b{wI
事务处理 A[MEtI=Q J
F2=97=R
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 cxV3Vrx@A
1、取得数据库连接 gO%3~f!vY#
1)用DriverManager取数据库连接 l"/O s_4O
例子 E:AXnnGKO
String className,url,uid,pwd; -L@=j
className = "oracle.jdbc.driver.OracleDriver"; zuw6YY8kQ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; :O2N'vl47A
uid = "system"; XT)@)c7j
pwd = "manager"; `KN{0<Ne
Class.forName(className); %BJ V$tO
Connection cn = DriverManager.getConnection(url,uid,pwd); "PPwJ/L(
2)用jndi(java的命名和目录服务)方式 2cL<`
例子 &I8ZVtg
String jndi = "jdbc/db"; L`6`NYR
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); (#~063N,#
DataSource ds = (DataSource) ctx.lookup(jndi); +}]xuYzo
Connection cn = ds.getConnection(); eo!{rs@f
多用于jsp中 umk[\}Ip+P
2、执行sql语句 PYGHN
T
1)用Statement来执行sql语句 *P>F#
~X
String sql; ~7|z 2L
Statement sm = cn.createStatement(); ^<c?I re
sm.executeQuery(sql); // 执行数据查询语句(select) K2JS2Y]
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); H|]Q;,C
2)用PreparedStatement来执行sql语句 >K3Lww)Ln
String sql; ?]S*=6
sql = "insert into user (id,name) values (?,?)"; 'tekne
PreparedStatement ps = cn.prepareStatement(sql); 8I%1
`V
ps.setInt(1,xxx); >
ewcD{bt
ps.setString(2,xxx); ? T9-FGW
... p)`JVq,H/B
ResultSet rs = ps.executeQuery(); // 查询 @xo9'M<l
int c = ps.executeUpdate(); // 更新 7y!{lr=n
Ad(j&P
3、处理执行结果 idHBz*3~ps
查询语句,返回记录集ResultSet YRFM1?*
更新语句,返回数字,表示该更新影响的记录数 Dcq^C LPY
ResultSet的方法 zrcSPh
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 9"[#\TW9Vb
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 TeHR,GB
^VD14V3
4、释放连接 ;-59#S&?tB
cn.close(); ^c*'O0y[D
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection s&4Y+dk93
&}<IR\ci
可滚动、更新的记录集 5 Jd,]~KAP
1、创建可滚动、更新的Statement yo5|~"yZY
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); t2>Vj>U
该Statement取得的ResultSet就是可滚动的 se&:Y&vrc~
2、创建PreparedStatement时指定参数 RaR$lcG+iY
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); (c;$^xZK
ResultSet.absolute(9000); ;tO (,^
批量更新 IsI\T8yfc
1、Statement :EZTJu
Statement sm = cn.createStatement(); ne%ckW?ks
sm.addBatch(sql1); Gmc0yRN
sm.addBatch(sql2); /J^yOR9
... O3S_P]{*ny
sm.executeBatch() mU;TB%#)
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 yA~W|q(/V
2、PreparedStatement N7XRk=J
PreparedStatement ps = cn.preparedStatement(sql); Y:O%xtGi
{ {=TD^>?
ps.setXXX(1,xxx); "~tEmMz
... L49`=p<
ps.addBatch(); }JS?42CTaV
} xRb-m$B}L
ps.executeBatch(); E=7~\7TE
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 J^U#dYd
<S<(wFE@4
事务的处理 @#nB]qV:e
1、关闭Connection的自动提交 h/d&P
cn.setAutoCommit(false); uCx\Bt"VI
2、执行一系列sql语句 Pt E>08
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close S>nM&758
Statement sm ; VK8 5A
sm = cn.createStatement(insert into user...); 5E$)Ip
sm.executeUpdate(); H13|bM<
sm.close(); .hUndg
sm = cn.createStatement("insert into corp...); 2s~X
sm.executeUpdate(); ? r^+-
sm.close(); 0e&Vvl4DK
3、提交 |dXmg13( -
cn.commit(); S~hNSw(-
4、如果发生异常,那么回滚 -[Q%Vv!8
cn.rollback();