java 数据库基本操作 "JzfL(yt
1、java数据库操作基本流程 0
&*P}U}Uc
2、几个常用的重要技巧: %"l81z
可滚动、更新的记录集 =MTj4VXh"
批量更新 <#xrrRhm}
事务处理 |h^K M
2f3=?YqD
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 v78&[
1、取得数据库连接 *>e~_{F
1)用DriverManager取数据库连接 j7@!J7S
例子 s.^c..e75C
String className,url,uid,pwd; *nYB o\@g
className = "oracle.jdbc.driver.OracleDriver"; K4j@j}zK9I
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; gI)w^7Gi
uid = "system"; $Hp.{jw
pwd = "manager"; j';n8|Y9
Class.forName(className); $42Au2Jg
Connection cn = DriverManager.getConnection(url,uid,pwd); '1CD-
Bu
2)用jndi(java的命名和目录服务)方式 L"[IOV9S
例子 oy2(A g\
String jndi = "jdbc/db"; B;eW/#`
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); x8 f6,
DataSource ds = (DataSource) ctx.lookup(jndi); RRx`}E9,
Connection cn = ds.getConnection(); J3H.%m!V
多用于jsp中 KU+( YF$1
2、执行sql语句 d@-wi%,^
1)用Statement来执行sql语句 YO)')&
String sql; Sdgb#?MR|
Statement sm = cn.createStatement(); %S{o5txo
sm.executeQuery(sql); // 执行数据查询语句(select) r~)VGdB+
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); UG6M9
2)用PreparedStatement来执行sql语句 xe(MHNrj
String sql; oz%h)#;
sql = "insert into user (id,name) values (?,?)"; >W8bWQ^fK
PreparedStatement ps = cn.prepareStatement(sql); {V[Ha~b%*
ps.setInt(1,xxx); mYjf5
ps.setString(2,xxx); 5\VxXiy0
... 4$%`Qh>yA
ResultSet rs = ps.executeQuery(); // 查询 65lOX$*{-
int c = ps.executeUpdate(); // 更新 pz$_W
c`-YIz)W
3、处理执行结果 pAENXC\,
查询语句,返回记录集ResultSet mH'\:oN
更新语句,返回数字,表示该更新影响的记录数 Qn*6D
ResultSet的方法 G-2EQ.
1、next(),将游标往后移动一行,如果成功返回true;否则返回false !\aV0,
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 rwoF}}
q1UBKhpnH
4、释放连接 !loO%3_)
cn.close(); /M 0 p_4
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection u/} xE7G
GUKDhg,W
可滚动、更新的记录集 j\!
e9M
1、创建可滚动、更新的Statement f](I.lm:
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); !0b%Jh
该Statement取得的ResultSet就是可滚动的 ?hKm&B;d
2、创建PreparedStatement时指定参数 6%>/og\%
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); _~ v-:w
ResultSet.absolute(9000); !2(.$}E
批量更新 Cq gJ
1、Statement m6-76ma,hi
Statement sm = cn.createStatement(); ]+AAT=B<!
sm.addBatch(sql1); Y]~IY?I
sm.addBatch(sql2); Bk+{}
... H]BAW *}
sm.executeBatch() SAP;9*f1\
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 8AryIgy>@
2、PreparedStatement #`vVgGZ&
PreparedStatement ps = cn.preparedStatement(sql); 658\#x8|
{ ja?s@Y}-9s
ps.setXXX(1,xxx); C+`xx('N9
... .XIr?>G
ps.addBatch(); THJ
3-Ug
} A xf^hBP
ps.executeBatch(); l7ZB3'
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Ex6o=D2
@2u#93Y
事务的处理 Q]/B/
1、关闭Connection的自动提交 9MT3T?IS
cn.setAutoCommit(false); 3#9uEDdE
2、执行一系列sql语句 RXM}hqeG
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close am2a#4`
Statement sm ; A$Wx#r7)
sm = cn.createStatement(insert into user...); M=W
4:H,gx
sm.executeUpdate(); 691G15
sm.close(); *y{+W
sm = cn.createStatement("insert into corp...); Y hS{$Z
sm.executeUpdate(); M</Wd{.g"
sm.close(); ^eobp.U
3、提交 4 HW;
cn.commit(); wsqLXZI
4、如果发生异常,那么回滚 <iRWd
cn.rollback();