java 数据库基本操作 F7J-@T<
1、java数据库操作基本流程 "|RP_v2
2、几个常用的重要技巧: 5sC{5LJzC
可滚动、更新的记录集 q /EK]B
批量更新 `L`*jA+_
事务处理 ghd~p@4
<lZyUd
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 AbUPJF"F
1、取得数据库连接 >FPE%X0+
1)用DriverManager取数据库连接 |Q:$G!/
例子 qgrRH'
String className,url,uid,pwd; I_.(&hMn
className = "oracle.jdbc.driver.OracleDriver"; x{<WJ|'B
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; $7gzu4f
uid = "system"; I z~#G6]M
pwd = "manager"; SQ5SvYH
Class.forName(className); / _v5B>
Connection cn = DriverManager.getConnection(url,uid,pwd); !zLd,`
2)用jndi(java的命名和目录服务)方式 s$6zA
j!
例子 v=nq P{
String jndi = "jdbc/db"; ]]@jvU_?kS
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Fh& `v0
DataSource ds = (DataSource) ctx.lookup(jndi); `g6XVa*%#
Connection cn = ds.getConnection(); w[\*\'Vm0
多用于jsp中 wl^bvHG
2、执行sql语句 4XK*sR0-`
1)用Statement来执行sql语句 Cl[ '6Lk
String sql; o!L1Qrh
Statement sm = cn.createStatement(); iZ#dS}VlJ
sm.executeQuery(sql); // 执行数据查询语句(select) Zoj.F
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); :gDIGBK,
2)用PreparedStatement来执行sql语句 owZjQ
String sql; * #e%3N05_
sql = "insert into user (id,name) values (?,?)"; vn3<LQ]
PreparedStatement ps = cn.prepareStatement(sql); '#xxjhF^
ps.setInt(1,xxx); Rct|"k_"Ys
ps.setString(2,xxx); UBuk-tq
... ,WA7Kp9
ResultSet rs = ps.executeQuery(); // 查询 1"A1bK
int c = ps.executeUpdate(); // 更新 ,e( |,u
S6,AY(V
3、处理执行结果 ;YNN)P%"
查询语句,返回记录集ResultSet KL#F5\ E
更新语句,返回数字,表示该更新影响的记录数 53P\OG^G`
ResultSet的方法 Q6Y1Jr">X
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 2<>n8 K
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 X}p#9^%N
%Fq"4%
4、释放连接 _CAWD;P
cn.close(); tY !fO>Fn~
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ~1wAk0G`n
OGg9e
可滚动、更新的记录集 Htl6Mr*{
1、创建可滚动、更新的Statement ^DXERt&3
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); dsX{5
该Statement取得的ResultSet就是可滚动的 7!w@u6Q
2、创建PreparedStatement时指定参数 J}EQ_FC"$
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); {,.1KtrSN
ResultSet.absolute(9000); -"u}lCz>
批量更新 fL
ng[&
1、Statement N72z5[..
Statement sm = cn.createStatement(); 85$MHod}[,
sm.addBatch(sql1); x,IU]YW@
sm.addBatch(sql2); #rMMOu9r2
... |xQG
sm.executeBatch() %d($\R-*O
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 pez*kU+9
2、PreparedStatement >T;"bcb
PreparedStatement ps = cn.preparedStatement(sql); ]Gow
{ *$/7;CLq
ps.setXXX(1,xxx); yw"FI!M
... n|lXBCY7K
ps.addBatch(); |TF,Aj
} Jx1oK
ps.executeBatch(); 6[wej$u
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 (*7edc"F
P~redX=t@
事务的处理 kU_bLC?>D
1、关闭Connection的自动提交 E:xpma1Qf
cn.setAutoCommit(false); kLMg|48fdI
2、执行一系列sql语句 }cgEC-
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close )52:@=h*l
Statement sm ; )XMSQ ="m
sm = cn.createStatement(insert into user...); g2;JJ}
sm.executeUpdate(); mA(K`"Bfh
sm.close(); tf|/_Y2
sm = cn.createStatement("insert into corp...); #!rng]p
sm.executeUpdate(); iHr{
VQ
sm.close(); VF!?B>
3、提交 RO'MFU<g
cn.commit(); ZJsc ?*@
4、如果发生异常,那么回滚 4pV.R5:
cn.rollback();