java 数据库基本操作 -jw=Iyv
1、java数据库操作基本流程 E|Lh$9XONA
2、几个常用的重要技巧: XF$C)id2p
可滚动、更新的记录集 nW%c95E
批量更新 +1623E
事务处理 Gsh2
3a S>U #
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 -T(V6&'Qi
1、取得数据库连接 ";. 3+z
1)用DriverManager取数据库连接
^~ I
例子 +%~g$#tlJo
String className,url,uid,pwd; t-Fl"@s
className = "oracle.jdbc.driver.OracleDriver"; wIiT
:o
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; sR0nY8@F
uid = "system"; WL~`L!_. A
pwd = "manager"; K=>/(sWiq
Class.forName(className); U5PCj ]-Xt
Connection cn = DriverManager.getConnection(url,uid,pwd); 8UZEC-K
2)用jndi(java的命名和目录服务)方式 Te/)[I'Tn
例子 Y+7v~/K=
String jndi = "jdbc/db"; Q'Tn+}B&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); /][U$Q;Ke
DataSource ds = (DataSource) ctx.lookup(jndi); ljCgIfZ_4
Connection cn = ds.getConnection(); w/<hyEpxg
多用于jsp中 u!S{[7 FY
2、执行sql语句 A|+{x4s`
1)用Statement来执行sql语句 8YJ({ Ou_
String sql; Y#5S;?bR
Statement sm = cn.createStatement(); ]_,~q@r$
sm.executeQuery(sql); // 执行数据查询语句(select) *]=)mM#
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); m
;vNA
2)用PreparedStatement来执行sql语句 5f5`7uVJF
String sql; s_8!x
sql = "insert into user (id,name) values (?,?)"; 3IxT2@H)
PreparedStatement ps = cn.prepareStatement(sql); ]7O?c=
ps.setInt(1,xxx); -|kDa1knA
ps.setString(2,xxx); YD%Kd&es
... +Lr0i_al
ResultSet rs = ps.executeQuery(); // 查询 N!3f1d7RQ
int c = ps.executeUpdate(); // 更新 \3/9lE|gh
N@>S>U8C
3、处理执行结果 EIfrZg7R
查询语句,返回记录集ResultSet o_5@R+&
更新语句,返回数字,表示该更新影响的记录数 PTh
Ya
ResultSet的方法 &Hqu`A/^
1、next(),将游标往后移动一行,如果成功返回true;否则返回false rG]Xgq"
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 _V?Q4}7d/
(
FRf.mv{
4、释放连接 1XKk~G"D
cn.close(); Sm,$~~iq}
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection D.e*IP1R
{m?x},
可滚动、更新的记录集 $} Myj'`r
1、创建可滚动、更新的Statement Z-?9F`}
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 3PGyqt(
该Statement取得的ResultSet就是可滚动的 (!(bysi9
2、创建PreparedStatement时指定参数 F*=RP$sj
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); B+LNDnjO]
ResultSet.absolute(9000); [`lAc V<
批量更新 ;rKYWj>IR
1、Statement AQ5v`xE4
Statement sm = cn.createStatement(); ao!r6:&v$e
sm.addBatch(sql1); 5 $J
sm.addBatch(sql2); @6SSk=9_S
... F8I<4S
sm.executeBatch() ,L;vN6~
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ;<A/e
2、PreparedStatement 5dk,!Cjg
PreparedStatement ps = cn.preparedStatement(sql); YovY0nO
{ v=>Gvl3&U
ps.setXXX(1,xxx); URgF8?n
... pS\>X_G3
ps.addBatch(); AngwBZ@
} ._Xtb,p{
ps.executeBatch(); lUEyo.xVt
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 7w*&Yg]
d8#j@='a*
事务的处理 2'U9!.o
1、关闭Connection的自动提交 >e ;f{
cn.setAutoCommit(false); O~el2
2、执行一系列sql语句 Q:\hh=^
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close
_1'Pb/1
Statement sm ; Tjqn::~D
sm = cn.createStatement(insert into user...); *&]l
sm.executeUpdate(); 2LU'C,o?
sm.close(); P>-,6a>
sm = cn.createStatement("insert into corp...); ?
h%+2
sm.executeUpdate(); =.a ]?&Yyh
sm.close(); M6sDtL9l
3、提交 s|'L0` <B
cn.commit(); (/U1J
4、如果发生异常,那么回滚 @\?f77Of6
cn.rollback();