java 数据库基本操作 "@iK'
c^
1、java数据库操作基本流程 pKpUXfQu
2、几个常用的重要技巧: X-K=!pET
可滚动、更新的记录集 wn/_}]T
批量更新 8%A#`)fb
事务处理 I ?gSG*m
(nf~x
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Z2qW\E^_r
1、取得数据库连接 L^@'q6*}
1)用DriverManager取数据库连接 oX30VfT
例子 5z7U1:
String className,url,uid,pwd; gOSJM1Mr3
className = "oracle.jdbc.driver.OracleDriver"; ME46V6[LX]
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; QdF5Cwf4
uid = "system"; Q(wx nm
pwd = "manager"; a&/#X9/
Class.forName(className); VVac:
Connection cn = DriverManager.getConnection(url,uid,pwd); d3ZdB4L
2)用jndi(java的命名和目录服务)方式 1w@(5 ^V
例子 TN+iA~kQ
String jndi = "jdbc/db"; %5M/s'O?i
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); kMi/>gpQ
DataSource ds = (DataSource) ctx.lookup(jndi); [j=yMP38!:
Connection cn = ds.getConnection(); HK,cJahq
多用于jsp中 }wr{W:j
2、执行sql语句 g{OwuAC_
1)用Statement来执行sql语句 RJ 8+h
String sql; dCi?SIN
Statement sm = cn.createStatement(); $'BSH4~|.
sm.executeQuery(sql); // 执行数据查询语句(select) Pg,b-W?n*
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); + jc!5i .
2)用PreparedStatement来执行sql语句 Q=;U@k@>
String sql; &"f";
sql = "insert into user (id,name) values (?,?)"; V58wU:li
PreparedStatement ps = cn.prepareStatement(sql); JTO~9>$ B
ps.setInt(1,xxx); =,spvy'"*C
ps.setString(2,xxx); 7K,-01-:
... )h"<\%LU
ResultSet rs = ps.executeQuery(); // 查询 8!O5quEc
int c = ps.executeUpdate(); // 更新 uwzvb gup?
[$0p+1
3、处理执行结果 ~zCEpU|@N
查询语句,返回记录集ResultSet -JMdE_h
更新语句,返回数字,表示该更新影响的记录数 {XR6>]
ResultSet的方法 *H"B _3<n
1、next(),将游标往后移动一行,如果成功返回true;否则返回false -]/I73!b
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 #lmB
AL~3
t<#mP@Mz=N
4、释放连接 ^Cu\VV
cn.close(); Aw$x;3y
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection zi|+HM
j9eTCJqB
可滚动、更新的记录集 -+(jq>t
1、创建可滚动、更新的Statement [#-b8Cu
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); @L<*9sLWh
该Statement取得的ResultSet就是可滚动的 }\tdcTMgS
2、创建PreparedStatement时指定参数 v- T$:cL
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ;X?}x%$
ResultSet.absolute(9000); |'P]GK
批量更新 SQBa;hvgM
1、Statement &]"
Statement sm = cn.createStatement(); 8ja$g,
sm.addBatch(sql1); 7X0Lq}G@
sm.addBatch(sql2); k;K)xb[w |
... U
9_9l7&r
sm.executeBatch() (D#B_`;-
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 diJLZikk
2、PreparedStatement 3h;{!|-3
PreparedStatement ps = cn.preparedStatement(sql); 4 !i$4
{ -~s!73pDY
ps.setXXX(1,xxx); Rp.Sj{<2
... R)_%i<nq\
ps.addBatch(); fol,xMc&
} tNO-e|~'
ps.executeBatch(); HJLu'KY}
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 M2PAy! J
`NCwK6/i
事务的处理 od IV:(
1、关闭Connection的自动提交 d/PiiiFf,
cn.setAutoCommit(false); x'+T/zw
2、执行一系列sql语句 |jI#"LbF
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 3LAIl913
Statement sm ; o<|cA5f\
sm = cn.createStatement(insert into user...); <'qeXgi
sm.executeUpdate(); ![`Ay4AZ@a
sm.close(); ykl
.1(
sm = cn.createStatement("insert into corp...); rSZd!OQ
sm.executeUpdate(); 'FqQzx"r
sm.close(); Huy5-[)15
3、提交 }Mst jm
cn.commit(); }#L^! \V}
4、如果发生异常,那么回滚 *@Lp`thq
cn.rollback();