java 数据库基本操作 ,(;]8G-Yj
1、java数据库操作基本流程
{v}BtZ
2、几个常用的重要技巧: K};~A?ET,h
可滚动、更新的记录集 1"S~#
批量更新 TOw;P:-
事务处理 {wh, "Ok_
;:1o|>mX
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 c|s7cG$+-
1、取得数据库连接 w`_"R6
1)用DriverManager取数据库连接 }!QVcu"+t/
例子 ?p&( Af)
String className,url,uid,pwd; ,B1~6y\b
className = "oracle.jdbc.driver.OracleDriver"; @MKf$O4K
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; a)QSq<2*
uid = "system"; 8 -YC#&
pwd = "manager"; !rTkH4!_
Class.forName(className); })umg8s
Connection cn = DriverManager.getConnection(url,uid,pwd); ]{ir^[A6
2)用jndi(java的命名和目录服务)方式 Cs'<;|r(
例子 821;; ]H
String jndi = "jdbc/db"; !,9;AMO
-
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ")Qhg-l
DataSource ds = (DataSource) ctx.lookup(jndi); ;5tQV%V^Q
Connection cn = ds.getConnection(); (>C$8)v
多用于jsp中 N
oRPvFv
2、执行sql语句 fL~@v-l#~
1)用Statement来执行sql语句 !g4u<7
String sql; ymb{rKkN3
Statement sm = cn.createStatement(); m[qW)N:w
sm.executeQuery(sql); // 执行数据查询语句(select) x5R|,bY
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); _sK{qQxvM=
2)用PreparedStatement来执行sql语句 $1Qcz,4B|
String sql; yY_#fJj
sql = "insert into user (id,name) values (?,?)"; zuS4N?t`p
PreparedStatement ps = cn.prepareStatement(sql); uc
Ph*M
ps.setInt(1,xxx); B &e'n<
ps.setString(2,xxx); *~kHH
... |f3 :9(p
ResultSet rs = ps.executeQuery(); // 查询 O,Ej m<nt
int c = ps.executeUpdate(); // 更新 TjS&V
O+"a0:GM
3、处理执行结果 3(`P x}
查询语句,返回记录集ResultSet rGlnu.mK^
更新语句,返回数字,表示该更新影响的记录数 n;LjKE
ResultSet的方法 a FL;E
1、next(),将游标往后移动一行,如果成功返回true;否则返回false H,EGB8E2
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 PZihC
F^CR$L& K
4、释放连接 t!\B6!Fo
cn.close(); &3 *#h
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection r"!xI
<UwYI_OX
可滚动、更新的记录集 6 IRa$h>H
1、创建可滚动、更新的Statement @plh'f}
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); M{g.x4M@W
该Statement取得的ResultSet就是可滚动的 zy`T!
$
2、创建PreparedStatement时指定参数 r3dGXiu
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ) uTFId
ResultSet.absolute(9000); O=}d:yZb!
批量更新 Sq]QRI/
1、Statement -tA_"q'^
Statement sm = cn.createStatement(); Mc{-2
sm.addBatch(sql1); z) x.6
sm.addBatch(sql2); XD Q<28^
... dP?QPky{9
sm.executeBatch() ]GBlads
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 W<:x4gBa
2、PreparedStatement <"yL(s^u"
PreparedStatement ps = cn.preparedStatement(sql); .'b|pd
{ JnLF61
ps.setXXX(1,xxx); Of>2 m<
... 06e dVIRr
ps.addBatch(); $f=6>Kn|^]
} ~l}\K10L*
ps.executeBatch(); !8&EkXTw,
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 [lGxys)J
B+z>$6
事务的处理 m qwJya
1、关闭Connection的自动提交 P=.~LZZ]89
cn.setAutoCommit(false); 9.B gsV .
2、执行一系列sql语句 R>B6@|}?
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close h@dy}Id
Statement sm ; tLcw?aB
sm = cn.createStatement(insert into user...); #gVWLm<
sm.executeUpdate(); SqZ .}s
sm.close(); &gcZ4gpH
sm = cn.createStatement("insert into corp...); 4 %V9
sm.executeUpdate(); PMT}fg
sm.close(); 9"zp>VR
3、提交 $b)t`r+
cn.commit(); iK!FVKi}
4、如果发生异常,那么回滚 Va A.J
cn.rollback();