java 数据库基本操作 Z@JTZMN_
1、java数据库操作基本流程 /a$Zzs&xs
2、几个常用的重要技巧: x
`%x f
可滚动、更新的记录集 ^}gZ+!kA
批量更新 :1UOT'_
事务处理 K^/.v<w
fP;I{AiN~
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 0ly6 |:
1、取得数据库连接 gpbdK?
1)用DriverManager取数据库连接 MD0d
例子 FAGi`X<L
String className,url,uid,pwd; &"1 _n]JO
className = "oracle.jdbc.driver.OracleDriver"; ls "Z4v(L6
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; iF:NDqc
uid = "system"; oY\;KPz
pwd = "manager"; 4dz Ym+vJm
Class.forName(className); (:+Wc^0
Connection cn = DriverManager.getConnection(url,uid,pwd); m*e8j[w#
2)用jndi(java的命名和目录服务)方式 qIy9{LF
例子 Vn^8nS
String jndi = "jdbc/db"; O" [#g
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); .(Z^[C}
DataSource ds = (DataSource) ctx.lookup(jndi); bL:+(/:
Connection cn = ds.getConnection(); ldKLTO*&
多用于jsp中 B( wi+;
2、执行sql语句 hR>`I0|p&
1)用Statement来执行sql语句 ]'#^ ~.
String sql; 2C_I3S~U
Statement sm = cn.createStatement(); d|
{<SRAI
sm.executeQuery(sql); // 执行数据查询语句(select) s,laJf
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Q."rE"}<
2)用PreparedStatement来执行sql语句 FGo)]U
String sql; >^f]Lgp
sql = "insert into user (id,name) values (?,?)"; a5]]AkvA
PreparedStatement ps = cn.prepareStatement(sql); !$-QWKD4
ps.setInt(1,xxx);
poZ&S
ps.setString(2,xxx); pL.~z
... 5tVg++I
ResultSet rs = ps.executeQuery(); // 查询 "LZv\c~v,%
int c = ps.executeUpdate(); // 更新 3\B~`=*q/
LKud'
3、处理执行结果 !?B2OE
查询语句,返回记录集ResultSet ~W gO{@Mw
更新语句,返回数字,表示该更新影响的记录数 r_V^sX
ResultSet的方法 Ys5Iqj=mp
1、next(),将游标往后移动一行,如果成功返回true;否则返回false gF M~M(
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ;UQ&yj%x
'
b,zE[Q
4、释放连接 T !pHT'J
cn.close(); 9\r5&#<(I
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection *;
6LX
=*WfS^O
可滚动、更新的记录集 fb!>@@9Z
1、创建可滚动、更新的Statement 8L))@SA+uJ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); w (,x{Bg\
该Statement取得的ResultSet就是可滚动的 *ul-D42!U
2、创建PreparedStatement时指定参数 ^X*l&R_=R
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); p!(]`N
ResultSet.absolute(9000); cPl$N5/5
批量更新 cc3+Wx_
1、Statement _ =(v? 2:?
Statement sm = cn.createStatement(); f./j%R@
sm.addBatch(sql1); m?)F@4]
sm.addBatch(sql2); ns[h_g!j;
... _lOyT$DN
sm.executeBatch() T,4REbm^
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 P9# }aw+
2、PreparedStatement <
$rXQ
PreparedStatement ps = cn.preparedStatement(sql); VBu6,6
{ q[.,i{2R}
ps.setXXX(1,xxx); ZN`I4Ak
... 04E#d.o'
ps.addBatch(); {<Vw55)#0Q
} h`:gMhn
ps.executeBatch(); }4*~*NoQ
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 e({-.ra
_4t
事务的处理 k'd=|U;(FV
1、关闭Connection的自动提交 9\R+g5
cn.setAutoCommit(false); v$|cF'yyF=
2、执行一系列sql语句 F)tcQO"G
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 5lm>~J!/^
Statement sm ; qP[jtRIN
sm = cn.createStatement(insert into user...); L8KMMYh[
sm.executeUpdate(); ){i
9,u")
sm.close(); f@xjNm*'Z
sm = cn.createStatement("insert into corp...); &m@DK>
sm.executeUpdate(); v}"DW?
sm.close(); DIc -"5~
3、提交 Czd)AVK
cn.commit(); %y\
4、如果发生异常,那么回滚 gs= (h*
cn.rollback();