java 数据库基本操作 S-Ryt>G
1、java数据库操作基本流程 g@`14U/|
2、几个常用的重要技巧: ~}$:iyJV(>
可滚动、更新的记录集 J0C<Qb[
批量更新 c{V0]A9VF
事务处理 +\\*Iy'xK
Apa)qRJd
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 :hjeltt
1、取得数据库连接 -r/# 20Y
1)用DriverManager取数据库连接 el;^cMY
例子 [
C]=p
String className,url,uid,pwd; y%v<Cp@R
className = "oracle.jdbc.driver.OracleDriver"; NnGQ=$e
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; KaBze67<|
uid = "system"; J &u&G7#S
pwd = "manager"; Bl3G_Ep
Class.forName(className); =_D82`p
Connection cn = DriverManager.getConnection(url,uid,pwd); !|}J{
2)用jndi(java的命名和目录服务)方式 A5F< <
例子 3@XCP-`
String jndi = "jdbc/db"; 9kH~+
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); C>:F4"0
DataSource ds = (DataSource) ctx.lookup(jndi); S%kE<M?
Connection cn = ds.getConnection(); N@58R9P<p
多用于jsp中 `IFt;Ja\6
2、执行sql语句 &s\$&%|
1)用Statement来执行sql语句 #fzvK+
String sql; rRYP~
$c
Statement sm = cn.createStatement(); (GMKIw2
sm.executeQuery(sql); // 执行数据查询语句(select) 9'Pyo`hJ#U
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); [o*u!2 r
2)用PreparedStatement来执行sql语句 b+[9)B)a?
String sql; c zL[W2l
sql = "insert into user (id,name) values (?,?)"; 42Tjbten_u
PreparedStatement ps = cn.prepareStatement(sql); [WRs1$5
ps.setInt(1,xxx); *;,=x<
ps.setString(2,xxx); gupB8 .!
... %+Z0$Q
ResultSet rs = ps.executeQuery(); // 查询 jE&kN$.7j
int c = ps.executeUpdate(); // 更新 Ty*ec%U9F
n&r-
3、处理执行结果 /h0-qW
查询语句,返回记录集ResultSet ^ B=x-G.
更新语句,返回数字,表示该更新影响的记录数 jMzHs*:
ResultSet的方法 x
+q"%9.c
1、next(),将游标往后移动一行,如果成功返回true;否则返回false F$ZWQ9&5U0
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 mkk74NY
MPAZ%<gmD
4、释放连接 i74^J +xk
cn.close(); 83412@&
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection #E{aN?_
= EyxM
可滚动、更新的记录集 9x;/q7
1、创建可滚动、更新的Statement #Vs/1y`()
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 8!VjXj"
该Statement取得的ResultSet就是可滚动的 Jj fNH
~
2、创建PreparedStatement时指定参数 8MX/GF;F
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); [9BlP
ResultSet.absolute(9000); Te[[xhTyw
批量更新 SjtGU47$!
1、Statement S82NU2L
Statement sm = cn.createStatement(); UciWrwE
sm.addBatch(sql1); ,*E%D _
sm.addBatch(sql2); Y@9L8XNP>
... Wq<>a;m
sm.executeBatch() rHT8a^MO
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 '8*gJ7]
2、PreparedStatement g~FB&U4c
PreparedStatement ps = cn.preparedStatement(sql); iV'-j,-i
{ +GP"9S2%R
ps.setXXX(1,xxx); f#eTi&w
... iL|*g3`-f
ps.addBatch(); ^b-H
} Pk8L-[&v
ps.executeBatch(); h,FP,w;G
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 d2.n^Q"?3
*n}9_V%
事务的处理 Qbl6~>T
1、关闭Connection的自动提交 W.MJyem
cn.setAutoCommit(false); g+ 2SB5 2D
2、执行一系列sql语句 RVI],O
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close :&?# ~NFH
Statement sm ; D1o 8Wo
sm = cn.createStatement(insert into user...); )Bb :tz+
sm.executeUpdate(); k\ I$ve"*
sm.close(); "MoV*U2s,
sm = cn.createStatement("insert into corp...); "5{Yn!-:
sm.executeUpdate(); LTzf&TZbx5
sm.close(); ^ /
f*5k
3、提交 Q.z2 (&
cn.commit(); )z/j5tnvm
4、如果发生异常,那么回滚 8^dGI9N
cn.rollback();