java 数据库基本操作
qSM|hHDo)
1、java数据库操作基本流程 R
2、几个常用的重要技巧: MR;1
2*p
可滚动、更新的记录集 YDIG,%uv
批量更新 pI1-cV,`
事务处理 ;dkYf24
=-0/k;^
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 )%`c_FL@N=
1、取得数据库连接 &DS/v)]
1)用DriverManager取数据库连接 xzdf^Ce
例子 GF"hx`zyJ
String className,url,uid,pwd; {dhXIs
className = "oracle.jdbc.driver.OracleDriver"; _:ReN_0
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; -Fi`Z$
uid = "system"; KWq+PeB5TS
pwd = "manager"; B?OFe'*
Class.forName(className); '3R`lv
Connection cn = DriverManager.getConnection(url,uid,pwd); $By<$
2)用jndi(java的命名和目录服务)方式 8^kGS-+^
例子 /}((l%U E.
String jndi = "jdbc/db"; IY_iB*T3jt
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ]P9l jwR
DataSource ds = (DataSource) ctx.lookup(jndi); B |5]Jm]
Connection cn = ds.getConnection(); 4(#'_jS
多用于jsp中 1NbG>E#Ol
2、执行sql语句 MS
nG3]{z
1)用Statement来执行sql语句 %2}-2}[>
String sql; ADz ^\
Statement sm = cn.createStatement(); D.r<QO~6B
sm.executeQuery(sql); // 执行数据查询语句(select) 2+RUTOv/d
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); VRVO-Sk
2)用PreparedStatement来执行sql语句 .Hescg/S
String sql; Rm2yPuOU}A
sql = "insert into user (id,name) values (?,?)"; ~G)S
PreparedStatement ps = cn.prepareStatement(sql); [xK3F+
ps.setInt(1,xxx); B+$%*%b
ps.setString(2,xxx); !`M,XSp(
... >Ifr [
ResultSet rs = ps.executeQuery(); // 查询 I:E`PZ
int c = ps.executeUpdate(); // 更新 C+*d8_L
B~?*?Z'
3、处理执行结果 kS %Ydy#:'
查询语句,返回记录集ResultSet cF\;_0u
更新语句,返回数字,表示该更新影响的记录数 5u,{6
ResultSet的方法 C0sX gM
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ~Sdb_EZ
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 loEPr5bL
5A,K6f@:g
4、释放连接 bYcV$KJk
cn.close(); R]JT&p|w.1
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ,A9]CQ
%{7|1>8
可滚动、更新的记录集 >d(~#Z`
1、创建可滚动、更新的Statement :>rkG?NfL
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); $1SPy|y
该Statement取得的ResultSet就是可滚动的 zU,9T
2、创建PreparedStatement时指定参数 \/93Dz
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 0^v`T%|fTX
ResultSet.absolute(9000); kc2PoJ
批量更新 Lt2u,9
1、Statement kT|dUw9G
Statement sm = cn.createStatement(); _1!7V3|^
sm.addBatch(sql1); xn?a. 3b'
sm.addBatch(sql2); bc*X/).
... <NHH^M\N
sm.executeBatch() R$EW4]j
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 2d>z1%'
2、PreparedStatement 9,c(ysv"
PreparedStatement ps = cn.preparedStatement(sql); I^* Nqqq
{ 0!D4pvlt
ps.setXXX(1,xxx); >|J`s~?
... c\/=iVw,
ps.addBatch(); :vYYfs&
} E}%B;"b/Tj
ps.executeBatch(); CYt?,qk-r
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 N'F77
.
gBd]B03
事务的处理 %3s1z<;R[S
1、关闭Connection的自动提交 *}Xf!"I#]N
cn.setAutoCommit(false); #^#PPO
2、执行一系列sql语句 [m->5H
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close SDL7<ZaE
Statement sm ; Eu0akqZ
sm = cn.createStatement(insert into user...); We)xB
sm.executeUpdate(); XUrXnz|>
sm.close(); PG2: ~$L0
sm = cn.createStatement("insert into corp...); (|F*vP'
sm.executeUpdate(); )"qa kT
sm.close(); c& <Fr[AK
3、提交 *$#W]bO
cn.commit(); <g-9T -Ky
4、如果发生异常,那么回滚 }?lrU.@zg
cn.rollback();