java 数据库基本操作 "5z6~dq
1、java数据库操作基本流程 %BP)m(S7
2、几个常用的重要技巧: X;[zfEB
可滚动、更新的记录集 '%r@D&*vp
批量更新 8 H"f9S=K
事务处理 0aN }zUf
P+c Fp7nC
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 8=_| qy}l/
1、取得数据库连接 Gxt<kz
1)用DriverManager取数据库连接 frO/
nx|9
例子 {UVm0AeUq
String className,url,uid,pwd; JnKbd~
className = "oracle.jdbc.driver.OracleDriver"; GeW$lA I
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ^# g;"K0
uid = "system"; z4%F2Czai&
pwd = "manager"; W1,L>Az^Ts
Class.forName(className); R)d7b,_Yd
Connection cn = DriverManager.getConnection(url,uid,pwd); l+kg4y
2)用jndi(java的命名和目录服务)方式 ="nrq&2
例子 M:q;z(
String jndi = "jdbc/db"; ("@V{<7(t
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); *'S%gR=Aa+
DataSource ds = (DataSource) ctx.lookup(jndi); }(7QJk5 j
Connection cn = ds.getConnection(); 2\8\D^
多用于jsp中 g|*eN{g]uE
2、执行sql语句 ;w&yGm
1)用Statement来执行sql语句 .mU.eLM
String sql; k=/|?%
Statement sm = cn.createStatement(); B0SmE_u_N
sm.executeQuery(sql); // 执行数据查询语句(select) Ej3hdi)
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 8t
35j
2)用PreparedStatement来执行sql语句 u$ / ]59
String sql; jtOsb91c}
sql = "insert into user (id,name) values (?,?)"; Oh85*3
PreparedStatement ps = cn.prepareStatement(sql); ?F), 4Q
ps.setInt(1,xxx); L5P}%1 _
ps.setString(2,xxx); >WS&w;G
... wk7_(gT`0
ResultSet rs = ps.executeQuery(); // 查询 h+d;`7Z>
int c = ps.executeUpdate(); // 更新 2A;[Ek6{q
cg5{o|x
3、处理执行结果 uNGxz*e
查询语句,返回记录集ResultSet ] ,aAzjZ
更新语句,返回数字,表示该更新影响的记录数 xWZcSIH!
ResultSet的方法 80"=Qu{s
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Br$PL&e~
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 wg~`Md
.*ovIU8
4、释放连接 gd,%H@3
cn.close(); aC6b})^
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection YxqQg
9@a;1Wr/f
可滚动、更新的记录集 ~O7(0RsCN
1、创建可滚动、更新的Statement U@AfRUF&
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); w+(wvNmNEK
该Statement取得的ResultSet就是可滚动的 NjyIwo0
2、创建PreparedStatement时指定参数 <;Z3
5{
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); %>U*A
ResultSet.absolute(9000); m8A_P:MQq
批量更新 aw~EK0yU
1、Statement qxr&_r
Statement sm = cn.createStatement(); /'_ RI
sm.addBatch(sql1); /6*.%M>r
sm.addBatch(sql2); #\["y%;W
... UN 4)>\Y
sm.executeBatch() G&H"8REm
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 QYb?;Z
2、PreparedStatement e%Xf*64
PreparedStatement ps = cn.preparedStatement(sql); T1di$8
{ EKw\a
ps.setXXX(1,xxx); !27]1%Aw
... U:jf9L2
ps.addBatch(); h4i$z-!
} ;i?!qB>baX
ps.executeBatch(); TRok4uc
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 odn`%ok
qP'g}Pc
事务的处理 WYzaD}
1、关闭Connection的自动提交 cb,sb^-
cn.setAutoCommit(false); F7l:*r,O
2、执行一系列sql语句 .*7UT~o=CS
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close OIT;fKl9
Statement sm ; EZfa0jJD
sm = cn.createStatement(insert into user...); ck+rOGv7{Z
sm.executeUpdate(); f)P/@rh
sm.close(); 6+z]MT
sm = cn.createStatement("insert into corp...); tP{$}cEY
sm.executeUpdate(); sZDJ+
sm.close(); .u?$h0u5
3、提交 >7q,[:(gs
cn.commit(); 1*CWHs
4、如果发生异常,那么回滚 nGd
cn.rollback();