java 数据库基本操作 bnzIDsw!Q
1、java数据库操作基本流程 ,^n5UA`PK
2、几个常用的重要技巧: O'.sK pXe
可滚动、更新的记录集 -\I".8"YE
批量更新 9er0Ww.d
事务处理 !kQJ6U
. UaLP
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 s2kom)
1、取得数据库连接 hd%O\D?
1)用DriverManager取数据库连接 }trQ<*D
例子 7=`_UqCV
String className,url,uid,pwd; YZ(tjIgQ
className = "oracle.jdbc.driver.OracleDriver"; qe_qag9
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; jccSjGX@w
uid = "system"; {8e4TD9E0
pwd = "manager"; [~5<['G
Class.forName(className); ozUsp[W>
Connection cn = DriverManager.getConnection(url,uid,pwd); c2~oPUj
2)用jndi(java的命名和目录服务)方式 S2PPwCU
例子 I7]qTS[vg
String jndi = "jdbc/db"; P
~rT uj
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); <(tnClAn
DataSource ds = (DataSource) ctx.lookup(jndi); ]yV,lp
Connection cn = ds.getConnection(); ;=lQMKx0
多用于jsp中 j`l'Mg
2、执行sql语句 shuoEeoo
1)用Statement来执行sql语句 #-7m@EU;O
String sql; >k9W+mk
Statement sm = cn.createStatement(); g$T%
C?
sm.executeQuery(sql); // 执行数据查询语句(select) *5z"Xy3J
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); m
?#WQf
2)用PreparedStatement来执行sql语句 E5Zxp3 N
String sql; XJ6=Hg4_O
sql = "insert into user (id,name) values (?,?)"; 9?I?;l{
PreparedStatement ps = cn.prepareStatement(sql); qk_YFR?R
ps.setInt(1,xxx); $TY1'#1U;
ps.setString(2,xxx); JWVn@)s
... 6QX2&[qWS
ResultSet rs = ps.executeQuery(); // 查询 c+N\uG4
int c = ps.executeUpdate(); // 更新 "VgPaz#
a"!r]=r
3、处理执行结果 z+{Q(8'b]
查询语句,返回记录集ResultSet 'tJ@+(tqw
更新语句,返回数字,表示该更新影响的记录数 r68d\N`.
ResultSet的方法 LB/1To
1、next(),将游标往后移动一行,如果成功返回true;否则返回false TFI$>Oz|
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 `2a7y]?
[;$9s=:[
4、释放连接 8fC5O
cn.close(); 6g 5Lf) yG
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection +?ilTU
4%>2>5
可滚动、更新的记录集 u iR[V~
1、创建可滚动、更新的Statement b>'y[P!
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ^
Q
该Statement取得的ResultSet就是可滚动的 y1t,i.
[
2、创建PreparedStatement时指定参数 wj-z;YCV
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); IP+.L]S
ResultSet.absolute(9000); !BEl6h
批量更新 ';KZ.D
1、Statement !"bU|a
Statement sm = cn.createStatement(); N'=b8J-fF
sm.addBatch(sql1); [_1K1i"m
sm.addBatch(sql2); ;3
/*Z5p
... cjc1iciZ
sm.executeBatch() ;bYLQ
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 !b?`TUt
2、PreparedStatement Qt"i
PreparedStatement ps = cn.preparedStatement(sql); ]z"7v
{ gmdA1$c
ps.setXXX(1,xxx); "4WwiI9
... 63T4''bwu
ps.addBatch(); :0vKt 6>Sp
} ]<:qMLg
ps.executeBatch(); ?7\$zn)v#
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 6a4-VX5
k@9CDwh*s
事务的处理 KpfQ=~'
1、关闭Connection的自动提交 L
/V;;
cn.setAutoCommit(false); jI45X22j
2、执行一系列sql语句 /m8&E*+T1
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close >m4HCs>
Statement sm ; U%l<48@8
sm = cn.createStatement(insert into user...); DUWSY?^c
sm.executeUpdate(); ]udH`{]
sm.close(); j[Oh>yG
sm = cn.createStatement("insert into corp...); lj"72
sm.executeUpdate(); k*!f@ M
sm.close(); )|IMhB+4
3、提交 +uB.)wr
cn.commit(); 2_CJV
4、如果发生异常,那么回滚 5sguv^;C5
cn.rollback();