java 数据库基本操作 QApyP CH
1、java数据库操作基本流程 XAic9SNu;
2、几个常用的重要技巧: BW K IbG
可滚动、更新的记录集 .[pUuVq]
批量更新 wyQb5n2`;~
事务处理 I0w%8bs
|r=DBd3
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 8I#D`yVKc
1、取得数据库连接 ;bjnL>eW
1)用DriverManager取数据库连接 S`g;Y
'
例子 pM$ @m]
String className,url,uid,pwd; uH{'gd,q8
className = "oracle.jdbc.driver.OracleDriver"; !D:k!
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; MOZu.NmO
uid = "system"; o:\XRPB
pwd = "manager"; @EZ>f5IO+
Class.forName(className); /tKGwX]y
Connection cn = DriverManager.getConnection(url,uid,pwd); rxE&fjW
2)用jndi(java的命名和目录服务)方式 v*TeTA
%
例子 l)Mh2lA,=
String jndi = "jdbc/db";
tbG8MXX
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 0s%6n5>
DataSource ds = (DataSource) ctx.lookup(jndi); uw_?O[ZA[
Connection cn = ds.getConnection(); &L3#:jSk
多用于jsp中 [MmM 9J["
2、执行sql语句 &HF]\`RNr
1)用Statement来执行sql语句 L|67f4
String sql; (V9h2g&8L
Statement sm = cn.createStatement(); g [L
sm.executeQuery(sql); // 执行数据查询语句(select) e- 6(F4
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); myvh@@N
2)用PreparedStatement来执行sql语句 3M*Y= ?pI
String sql; K2|7%
sql = "insert into user (id,name) values (?,?)"; >]/dOH,A
PreparedStatement ps = cn.prepareStatement(sql); fValSQc!U
ps.setInt(1,xxx); iZ Ta>@
ps.setString(2,xxx); oyvtZ/@
... TzF0/T!
ResultSet rs = ps.executeQuery(); // 查询 jgRCs.6
int c = ps.executeUpdate(); // 更新 #"r kuDO
+Jq`$+%C
3、处理执行结果 p7 [(z
查询语句,返回记录集ResultSet Xp^$
E6YFy
更新语句,返回数字,表示该更新影响的记录数 DQ_ 2fX~)
ResultSet的方法 4A o{M
1、next(),将游标往后移动一行,如果成功返回true;否则返回false s=/^lOOO
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 uBRw>"c_*8
ITvHD-,\
4、释放连接 u}CG>^0C
cn.close(); Q
X):T#^V
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection <9N4"d!A
XGk}e4;_
可滚动、更新的记录集 k~|ZO/X@l%
1、创建可滚动、更新的Statement BhkAQEsWTQ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); $i%HDt|
该Statement取得的ResultSet就是可滚动的 ZbyG*5iq
2、创建PreparedStatement时指定参数 m)k-uWc$C
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); o16~l]Z|f
ResultSet.absolute(9000); -x?Hj/
批量更新 i-"<[*ePd
1、Statement B$`d&7I;D
Statement sm = cn.createStatement(); k(9s+0qe
sm.addBatch(sql1); +{^'i P
sm.addBatch(sql2); &<t79d%{
... ir+8:./6
sm.executeBatch() H<z30r/-w
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 k!vHO
2、PreparedStatement %&2B
PreparedStatement ps = cn.preparedStatement(sql); <G}m #
{ 8xgc[#
ps.setXXX(1,xxx); vC-[#]<
... :SdIU36
ps.addBatch(); m&ZJqsZIL
} 9JXhHAxD
ps.executeBatch(); ^T+<!k
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Sy:K:Z|[U
Y`q!V=
事务的处理 i
_8zjj7
1、关闭Connection的自动提交 6T]Q.\5BZ
cn.setAutoCommit(false); sgD@}":m
2、执行一系列sql语句 'l8eH$
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close epYj+T
Statement sm ; I,w^?o
sm = cn.createStatement(insert into user...); i >J:W"W
sm.executeUpdate(); XWc|[>iO
sm.close(); WEps.]s
sm = cn.createStatement("insert into corp...); 7Z
VVR*n|
sm.executeUpdate(); "wF*O"WQo
sm.close(); L2k;f]
3、提交 -z&9DWH
cn.commit(); )'w]YIv9
4、如果发生异常,那么回滚 qPp]K?.
cn.rollback();