java 数据库基本操作 6Cfu19Dx
1、java数据库操作基本流程 mE\sD<b
2、几个常用的重要技巧: C9OEB6
可滚动、更新的记录集 e ?sMOBPlv
批量更新 nvY%{Zf$}
事务处理 \MI2^JN
j*Uz.q?
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 69N/_V
1、取得数据库连接 >xsbXQ>.
1)用DriverManager取数据库连接 41Ga- 0p
例子 o^+2%S`]
String className,url,uid,pwd; 2@~.FBby7@
className = "oracle.jdbc.driver.OracleDriver"; !LJE o>D
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ua%@Ay1|
uid = "system"; ,Pi!%an w
pwd = "manager"; M~+}ss
Class.forName(className); xP/?E
Connection cn = DriverManager.getConnection(url,uid,pwd); VW&EdrR,S
2)用jndi(java的命名和目录服务)方式 )cP&c=
例子 S1$lNB
String jndi = "jdbc/db"; e<A6=}
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); wr5ScsNS
DataSource ds = (DataSource) ctx.lookup(jndi); AS5'j
Connection cn = ds.getConnection(); 2S,N9(7
多用于jsp中 RRRF/Z;))
2、执行sql语句 !B|Aq-
n,
1)用Statement来执行sql语句 v'RpsCov
String sql; w2X0.2)P2
Statement sm = cn.createStatement(); /{Mo'.=Z
sm.executeQuery(sql); // 执行数据查询语句(select) 03pD<
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); <fSWX>pR
2)用PreparedStatement来执行sql语句 aW=c.Q.
String sql; )+7|_7
!x
sql = "insert into user (id,name) values (?,?)"; nwS @r
PreparedStatement ps = cn.prepareStatement(sql); u1 Z;n
ps.setInt(1,xxx); kx{LY`pY
ps.setString(2,xxx); 9[2qgw\D
... (;!92ct[?
ResultSet rs = ps.executeQuery(); // 查询 {'#1do}{
int c = ps.executeUpdate(); // 更新
B_Ul&V
H2kib4^i
3、处理执行结果 z][hlDv\j
查询语句,返回记录集ResultSet PaD6||1F
更新语句,返回数字,表示该更新影响的记录数 (fA>@5n
ResultSet的方法 /aTW X
1、next(),将游标往后移动一行,如果成功返回true;否则返回false {{6D4M|s
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Kd r7 V
;O `ZVB
4、释放连接 atiyQuT6Wh
cn.close(); h*>%ou
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection /O[<"Wcz
\+M6R<Qw
可滚动、更新的记录集 zEVQ[y6BcM
1、创建可滚动、更新的Statement !\<
[}2}
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ^/~ZP?%]
该Statement取得的ResultSet就是可滚动的 dvAG}<
2、创建PreparedStatement时指定参数 0 i'bo*
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); @vZeye
ResultSet.absolute(9000); 9epMw-)k
批量更新 cslZ;
1、Statement y#T.w0*
Statement sm = cn.createStatement(); r1axC%
sm.addBatch(sql1); tgyW:<iv
sm.addBatch(sql2); fZ aTckbE
... _lG|t6y
sm.executeBatch() gU&y5s~
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 LwlO)|E
2、PreparedStatement ]z#+3DaH
PreparedStatement ps = cn.preparedStatement(sql); &t~NR$@
{ +0ALO%G;G"
ps.setXXX(1,xxx); _`I}"`2H
... *z'v
ps.addBatch(); WKAG)4
} T>hrKn.!D:
ps.executeBatch(); aPdEEqc\l
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 gc\/A\F<
3Ofh#|qc&
事务的处理 5jq @ nq6
1、关闭Connection的自动提交 -aq3Lqi
cn.setAutoCommit(false); C 547})
2、执行一系列sql语句 tzShds
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close :5sjF:@
Statement sm ; g#k@R'7E
sm = cn.createStatement(insert into user...); \ 5.nr*5
sm.executeUpdate(); )n6,uTlOw
sm.close(); u`CHM:<<?
sm = cn.createStatement("insert into corp...); (#?O3z1@"
sm.executeUpdate(); a<0q%Ax
sm.close(); a&Qr7tTY"
3、提交 })+iAxR
cn.commit(); }a!ny
4、如果发生异常,那么回滚 .mHVJ5^:4\
cn.rollback();