java 数据库基本操作 7TMq#Pb
1、java数据库操作基本流程 M}x%'=Pox
2、几个常用的重要技巧: M% \T5
可滚动、更新的记录集 DFK@/.V
批量更新 _TOWqV^
事务处理 J8alqs7
+ U5Q/g
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 wW@e#:
1、取得数据库连接 )N&SrzqTK
1)用DriverManager取数据库连接 LJGpa )(
例子 9kH~=`: ?
String className,url,uid,pwd; u^tQ2&?O!P
className = "oracle.jdbc.driver.OracleDriver"; Ig`q[o
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; -[L\:'Gp5
uid = "system"; tF`L]1r>
pwd = "manager"; F,wB6Cw
Class.forName(className); 'F/oR/4,
Connection cn = DriverManager.getConnection(url,uid,pwd); h#hr'3bI1
2)用jndi(java的命名和目录服务)方式 B>^6tdz
例子 {r&mNbz
String jndi = "jdbc/db"; 6:#o0OeBP
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); K=[7<b,:3
DataSource ds = (DataSource) ctx.lookup(jndi); \5r^D|Rp}
Connection cn = ds.getConnection(); 9:USxFM
多用于jsp中 't5ufAT
2、执行sql语句 #cfiN b}GX
1)用Statement来执行sql语句 ;\mX=S|a
String sql; $v;WmYTJ
Statement sm = cn.createStatement(); #c^]p/
sm.executeQuery(sql); // 执行数据查询语句(select) x|rc[e%k
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); lmzHE8MUNu
2)用PreparedStatement来执行sql语句 1'E=R0`pA
String sql; kg7F8($
sql = "insert into user (id,name) values (?,?)"; w*VN=
PreparedStatement ps = cn.prepareStatement(sql); _YF>Y=D-
ps.setInt(1,xxx); i-OD"5a`
ps.setString(2,xxx); c,~uurVi
... bkV<ZUW|;
ResultSet rs = ps.executeQuery(); // 查询 >zW2w2O3
int c = ps.executeUpdate(); // 更新 j~-N2b6z
xSmG,}3mF
3、处理执行结果 k4K.
mlIO
查询语句,返回记录集ResultSet avRtYL
更新语句,返回数字,表示该更新影响的记录数 o72r `2
ResultSet的方法 -qIi.]/f"9
1、next(),将游标往后移动一行,如果成功返回true;否则返回false f CU]
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 *#Cx-J
oe|#!SM(
4、释放连接 `q*[fd1u.
cn.close(); =OHX5:Z
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 5~[7|Y
c4tw)O-X
可滚动、更新的记录集 9Y:I)^ek
1、创建可滚动、更新的Statement 3x+lf4"
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ZbYC3_7w
该Statement取得的ResultSet就是可滚动的 =0g!Q
2、创建PreparedStatement时指定参数 9p W~Gz
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); zr.\7\v
ResultSet.absolute(9000); 6<];}M_{
批量更新 H
-Mb:4
1、Statement ~XTC:6ts
Statement sm = cn.createStatement(); ~S8:xG+s
sm.addBatch(sql1); Qo#]Lo> \g
sm.addBatch(sql2); V+E8{|dYL
... 8Sr'
sm.executeBatch() ,UY1.tR(
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ^1S{::
2、PreparedStatement ks#3
o+
PreparedStatement ps = cn.preparedStatement(sql); )UKX\nD"0
{ y8k8Hd1<f
ps.setXXX(1,xxx); Tx;a2:6\[
... !?P8[K
ps.addBatch(); NU=ru/
} ~7PD/dre
ps.executeBatch(); EqW~K@
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 FH,]'
#r'MfTr
事务的处理 >C|pY6
1、关闭Connection的自动提交 -5<[oBL;
cn.setAutoCommit(false); f{P1.?a
2、执行一系列sql语句 3`^@ymY
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ?})A-$f ~
Statement sm ; pe?)AiTZ:
sm = cn.createStatement(insert into user...); `B)@
sm.executeUpdate(); BHY8G06
sm.close(); lz,M$HG<[
sm = cn.createStatement("insert into corp...); =:]ps<Qx
sm.executeUpdate(); N:lfKI
sm.close(); B>53+GyMV
3、提交 QLd*f[n
cn.commit(); %O\@rws
4、如果发生异常,那么回滚 b84l`J
cn.rollback();