java 数据库基本操作 0]$-}AYM
1、java数据库操作基本流程 g:U
-kK!i
2、几个常用的重要技巧: =NnG[#n%
可滚动、更新的记录集 Ol>/^3a=
批量更新 -%K}~4J
事务处理 *P5/ S8c
Ml{4)%~Y7f
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 T!pZj_ h=
1、取得数据库连接 "?W8o[c+
1)用DriverManager取数据库连接 ">S1,rhgS
例子 !YlEXaS
String className,url,uid,pwd; +&J1D8
className = "oracle.jdbc.driver.OracleDriver"; PGVp1TQ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 8493O x4 O
uid = "system"; 9 }42s +
pwd = "manager"; No+BS%F5
Class.forName(className); $?VYHkX
Connection cn = DriverManager.getConnection(url,uid,pwd); Y$j!-l5z
2)用jndi(java的命名和目录服务)方式 BJLeE}=H
例子 w
!<-e>
String jndi = "jdbc/db"; / T_v8{D
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ycvgF6Me<
DataSource ds = (DataSource) ctx.lookup(jndi); 6x/o j`_[
Connection cn = ds.getConnection(); "d
M-3o<
多用于jsp中 =*>.z@WQ
2、执行sql语句 { ~(XO@;b
1)用Statement来执行sql语句 k)8*d{ *
String sql; $"}*#<Z
Statement sm = cn.createStatement(); I?%#`Rvu
sm.executeQuery(sql); // 执行数据查询语句(select) fi&>;0?7
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); YG*}F|1
2)用PreparedStatement来执行sql语句 l2wu>Ar7.
String sql; %rEP.T\i
sql = "insert into user (id,name) values (?,?)"; #!_ViG )2^
PreparedStatement ps = cn.prepareStatement(sql); ou]jm=4[
ps.setInt(1,xxx); <$#^)]Ts
ps.setString(2,xxx); 5>=4$!`
... lR`.V0xA
ResultSet rs = ps.executeQuery(); // 查询 ]~ S
zb
int c = ps.executeUpdate(); // 更新 tn(6T^u
Eq8:[o
3、处理执行结果 t~qAA\p}o
查询语句,返回记录集ResultSet P86wRq
更新语句,返回数字,表示该更新影响的记录数 M~Er6Zg
ResultSet的方法 BE0Xg
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 77]lpmC
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 zU4*FXt
BgB0
4、释放连接 a'*~E?b
cn.close(); $H/: -v
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection (S6>^:;=~
CE|
*&G
可滚动、更新的记录集 Wi~?2-!
1、创建可滚动、更新的Statement !QME!c>*$
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); z$(`{
o%a
该Statement取得的ResultSet就是可滚动的 U0N6\+
2、创建PreparedStatement时指定参数 };gcM@]]E
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); _5OxESE
ResultSet.absolute(9000); azRp4~2?
批量更新 y~VLa
1、Statement 3S%/>)k
Statement sm = cn.createStatement(); kp6 &e
sm.addBatch(sql1); 3 [O+wVv
sm.addBatch(sql2); "od2i\
... /U6ry'
sm.executeBatch() X'xnJtk
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 w.+G+r=
2、PreparedStatement $wl_
PreparedStatement ps = cn.preparedStatement(sql); v[jg|s&6"
{ {Z>Mnw"R
ps.setXXX(1,xxx); i\#?M "
... 3]7j,1^
ps.addBatch(); :1v.Jk
} C[><m2T
ps.executeBatch(); yEkwdx5!(
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 /#?!9c
hANe$10=H
事务的处理 E0u&hBd3_
1、关闭Connection的自动提交 R\x3'([A5
cn.setAutoCommit(false); =yPV9#(I/
2、执行一系列sql语句 bu=RU
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close "cvhx/\1#
Statement sm ; NuXII-
sm = cn.createStatement(insert into user...); Z
?F_({im
sm.executeUpdate(); =i},$"Bf*%
sm.close(); v"_E0
3!
sm = cn.createStatement("insert into corp...); '{)Jhl47
sm.executeUpdate(); g#G ]}8C
sm.close();
L08lkq,
3、提交 lx> ."rW
cn.commit(); !1
Y[e^
4、如果发生异常,那么回滚 h&rZR`g
cn.rollback();