java 数据库基本操作 MG0d&[
1、java数据库操作基本流程 5B+I\f&
2、几个常用的重要技巧: W q>qso
可滚动、更新的记录集 -VRKQNT
批量更新 #jR1ti)p
事务处理 *6P)HU@
{(qH8A
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Qx}hiv/
1、取得数据库连接 _,]@xFCOH
1)用DriverManager取数据库连接 3!KEk?I]
例子 }Fgp*x-G
String className,url,uid,pwd; ,zH\&D$>u
className = "oracle.jdbc.driver.OracleDriver"; N'RUtFqj
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; R//S(eU68\
uid = "system"; &dI;o$t
pwd = "manager"; nL-kBW Ed>
Class.forName(className); -&_;x&k
/
Connection cn = DriverManager.getConnection(url,uid,pwd); +^@6{1
2)用jndi(java的命名和目录服务)方式 _'DZoOH|VE
例子 \jThbCb
String jndi = "jdbc/db"; }{m.\O
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); g|V0[Hnq6
DataSource ds = (DataSource) ctx.lookup(jndi); g7U>G=,;?U
Connection cn = ds.getConnection(); a$P$Ngi?S
多用于jsp中 %W]"JwRu
2、执行sql语句 SB2Ij',
1)用Statement来执行sql语句 e`D? x1-
String sql; _i+7O^=d6X
Statement sm = cn.createStatement(); qx\P(dOUf
sm.executeQuery(sql); // 执行数据查询语句(select) ;tu2}1#r
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); lC(g&(\{
2)用PreparedStatement来执行sql语句 QF`o%mI
String sql; uNRT@@oCq
sql = "insert into user (id,name) values (?,?)"; K+J fU
J
PreparedStatement ps = cn.prepareStatement(sql); ~'L`RJR
ps.setInt(1,xxx); [I7([l1Wvd
ps.setString(2,xxx); #^&.*'z%z
... e.ksN
ResultSet rs = ps.executeQuery(); // 查询 t+Rt*yjO
int c = ps.executeUpdate(); // 更新 dsUY[X-<6
aXO|%qX
3、处理执行结果 r:uW(<EP^
查询语句,返回记录集ResultSet ~`Xu6+1o
更新语句,返回数字,表示该更新影响的记录数 \mp5G&+/Q
ResultSet的方法 [xsiSt?6
1、next(),将游标往后移动一行,如果成功返回true;否则返回false iKN800^u
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ck4g=QpD{
qJrMr4:F
4、释放连接 G@;I^_gN
cn.close(); PFnq:G^L
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ;Q} H'Wg,
4Gm (P~N
可滚动、更新的记录集 N:Zf4
1、创建可滚动、更新的Statement K+s
xO/}h
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 8cyC\Rs
该Statement取得的ResultSet就是可滚动的 =)Q0=!%-
2、创建PreparedStatement时指定参数 Fq9>t/Zj
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); !u=,b fyH
ResultSet.absolute(9000); N`%f+eT(
批量更新 =c(3EI'w
1、Statement Kp_^ 2V?
Statement sm = cn.createStatement(); 2DbM48\E
sm.addBatch(sql1); +4%:q~C
sm.addBatch(sql2); trC+Etc
... y()Si\9v
sm.executeBatch() E)7ODRVbl
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 PofHe
2、PreparedStatement \9t6#8
PreparedStatement ps = cn.preparedStatement(sql); /i)1BaF
{ nmrYB w>
ps.setXXX(1,xxx); %[C-KQH
... ,"W.A
ps.addBatch(); X}gnO83
} Du2v,n5@
ps.executeBatch(); !HP/`R
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 P?P))UB5
jL[
hB
事务的处理 J6Q}a7I#
1、关闭Connection的自动提交 $"&U%3
cn.setAutoCommit(false); aY7.<p*a
2、执行一系列sql语句 H;OPA8\n
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close b_JW3l
Statement sm ; U\Hd?&`9gz
sm = cn.createStatement(insert into user...); SZm)`r\A
sm.executeUpdate(); Ut
xe
sm.close(); K2GcU_*t
sm = cn.createStatement("insert into corp...); H^no&$2`1
sm.executeUpdate(); GxIw4m9
sm.close(); sB,>4*Zd
3、提交 on q~wEr
cn.commit(); cOr@dUSL
4、如果发生异常,那么回滚 YQ+Kl[ec
cn.rollback();