java 数据库基本操作 %"jp':
1、java数据库操作基本流程 !T|q/ri
2、几个常用的重要技巧: X]1Q# $b
可滚动、更新的记录集 }Sx+: N*
批量更新 uHQf <R$:
事务处理 W5SCm(QS5
vyA
`Z1
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Gi+ZI{)
1、取得数据库连接 W2`/z)[*>
1)用DriverManager取数据库连接 yKhN1kY
例子 /cXVJ(#j
String className,url,uid,pwd; {CaTu5\
className = "oracle.jdbc.driver.OracleDriver"; ZzO^IZKlC
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; fep8hf B;
uid = "system"; fxOa(mt
pwd = "manager"; RxB9c(s^@
Class.forName(className); C$x
r)_
Connection cn = DriverManager.getConnection(url,uid,pwd); $[6] Ly(F)
2)用jndi(java的命名和目录服务)方式 J$>9UCk7B
例子 k|r|*|8
String jndi = "jdbc/db"; /QW-#K|S&
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 9j8<Fs0M
DataSource ds = (DataSource) ctx.lookup(jndi); q}+Fm?B
Connection cn = ds.getConnection(); =jWjUkm2
多用于jsp中 0|chRX
2、执行sql语句 }o d5kK;
1)用Statement来执行sql语句 '
X9D( ?O
String sql; $&ZN%o3
Statement sm = cn.createStatement(); x-@}x@n&[
sm.executeQuery(sql); // 执行数据查询语句(select) bm\Zp
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); DX b=Ku
2)用PreparedStatement来执行sql语句 +M{A4nYY|1
String sql; Uaz$<K6
sql = "insert into user (id,name) values (?,?)"; \:5M0
PreparedStatement ps = cn.prepareStatement(sql); =U`9_]~1c@
ps.setInt(1,xxx); O/ih9,
ps.setString(2,xxx); U{Xx)l/o
... YVW`|'7)|
ResultSet rs = ps.executeQuery(); // 查询 y?-zQs0
int c = ps.executeUpdate(); // 更新 N ]|P||fC
AM:lU
3、处理执行结果 *=)kR7,]9d
查询语句,返回记录集ResultSet >g+e`!;6
更新语句,返回数字,表示该更新影响的记录数 2)F~
ResultSet的方法 EG#mNpxE
1、next(),将游标往后移动一行,如果成功返回true;否则返回false A>Y#-e;<d
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 #\T5r*W
T\OpPSYbl
4、释放连接 p02E:?
cn.close(); tPz!C&.=
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 9NEL[J|
40m>~I^q}
可滚动、更新的记录集 -RBH5+SS2
1、创建可滚动、更新的Statement +\s&v!
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); x&d:V
该Statement取得的ResultSet就是可滚动的 E5. @=U,c
2、创建PreparedStatement时指定参数 +6;1.5Tc
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); N#&/d nV
ResultSet.absolute(9000); py%_XL=w,
批量更新 mIYM+2p
1、Statement @#1T-*
Statement sm = cn.createStatement(); LEJn
1
sm.addBatch(sql1); m[$pj~<\
sm.addBatch(sql2); /s[D[:P_
... e"^n^_9
sm.executeBatch() l}&&f8n
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 h7
c
2、PreparedStatement X775j"<d
PreparedStatement ps = cn.preparedStatement(sql); ASULg{
{ Nc:0opPM
ps.setXXX(1,xxx); 3.w &e0Es
... _NN5e|t
ps.addBatch(); 'DTq<`~?
} 9"f
ps.executeBatch(); {C5-M! D{<
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 CSlPrx2\
{9XQ~t"m^
事务的处理 AQTV1f_
1、关闭Connection的自动提交 Y{ OnW98
cn.setAutoCommit(false); %,f(jQfg_
2、执行一系列sql语句 AYv7-!Yk
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close C~R,,
Statement sm ; ?b x ak
sm = cn.createStatement(insert into user...); fF.sT7Az+
sm.executeUpdate(); _bSn YhS
sm.close(); `c? 8i
sm = cn.createStatement("insert into corp...); h~s h!W8
sm.executeUpdate(); !'*1;OQ
sm.close(); 8SoTABHV
3、提交 kerBy\^
cn.commit(); *Ke\Yb
4、如果发生异常,那么回滚 "z4V@gk
cn.rollback();