java 数据库基本操作 lL0M^Nv
1、java数据库操作基本流程 2"X~ju
2、几个常用的重要技巧: Vm,,uF
可滚动、更新的记录集 O m9jtWk
批量更新 !),t"Ae?>
事务处理 to`mnp9Z
N 9LgU)-Jt
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 u okc:D
1、取得数据库连接 4x=(Zw_X
1)用DriverManager取数据库连接 ~KPv7WfG
例子 4-^[%&>}
String className,url,uid,pwd; 0[Eb .2I
className = "oracle.jdbc.driver.OracleDriver"; ykmv'a$-4
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; v@n_F
uid = "system"; E
oe}l
pwd = "manager"; uR:rO^
Class.forName(className); ]C!?HQ{bsf
Connection cn = DriverManager.getConnection(url,uid,pwd); z:}nBCmLV
2)用jndi(java的命名和目录服务)方式 z_&P?+"Df
例子 S-c ^eLzQ
String jndi = "jdbc/db"; }`_(<H
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 2 hq\n<
DataSource ds = (DataSource) ctx.lookup(jndi); cP rwW6
Connection cn = ds.getConnection(); vFhz!P~
多用于jsp中 Wekqn!h
2、执行sql语句 Y3rt5\!
1)用Statement来执行sql语句 24B<[lSK
String sql; iKAusWj
Statement sm = cn.createStatement(); 3i=Iu0
sm.executeQuery(sql); // 执行数据查询语句(select) `q_<Im%I
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); B<,YPS8w
2)用PreparedStatement来执行sql语句 Zh'&-c_J
String sql; d1G8*YO@
sql = "insert into user (id,name) values (?,?)"; H
M:r0_
PreparedStatement ps = cn.prepareStatement(sql); T1bd:mC}n
ps.setInt(1,xxx); kO_5|6
ps.setString(2,xxx); Ll}yJ#3,
... K 1W].(-@4
ResultSet rs = ps.executeQuery(); // 查询 !20XsO
int c = ps.executeUpdate(); // 更新 Bp_wnd
?obm7<
3、处理执行结果 G5Yk bw#
查询语句,返回记录集ResultSet bRsTBp;R`I
更新语句,返回数字,表示该更新影响的记录数 tj5giQ3DG)
ResultSet的方法 z 7T0u.4Ss
1、next(),将游标往后移动一行,如果成功返回true;否则返回false tC)6
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 L0"~[zB]N
(CE7j<j
4、释放连接 MKg,!TELe
cn.close(); t'(1I|7
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection @dEiVF`4:
75NRCXh.
可滚动、更新的记录集
AK@L32-S
1、创建可滚动、更新的Statement ."6[:MF
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); lr3mE
该Statement取得的ResultSet就是可滚动的 d%ME@6K)
2、创建PreparedStatement时指定参数 nc?B6IV
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); lm0N5(XP
ResultSet.absolute(9000); Tv$sqVe9
批量更新 $[ z y
1、Statement wT_h!W
Statement sm = cn.createStatement(); $kPHxD!"
sm.addBatch(sql1); ^3~e/P KM
sm.addBatch(sql2); ^?GmrHC)
... y7lWeBnC
sm.executeBatch() [TTSA2
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 WNy3@+@GZ
2、PreparedStatement 46No%cSiG
PreparedStatement ps = cn.preparedStatement(sql); A)NkT`<)
{ 2`bdrRD0
ps.setXXX(1,xxx); (K<9hL+X
... l"pN90B4
ps.addBatch(); 8dO?K*J,H'
} 0. ;}]v
ps.executeBatch(); Q8nId<\(
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 j6YiE~
]?LB?:6
事务的处理 zP) ~a
1、关闭Connection的自动提交 ~
'Vxg}
cn.setAutoCommit(false); C9~~O~7x
2、执行一系列sql语句 #Dy?GB08
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close X#p Wyo~
Statement sm ; TqAPAHg
sm = cn.createStatement(insert into user...); BmBz}:xMez
sm.executeUpdate();
%X1x4t]
sm.close(); z`3( ,V
sm = cn.createStatement("insert into corp...); l67Jl"v
sm.executeUpdate(); diT=x52
sm.close(); cgT
3、提交 s0"e'
cn.commit(); =|U@
4、如果发生异常,那么回滚 TzG]WsY_
cn.rollback();