java 数据库基本操作 }SIUsh'
1、java数据库操作基本流程 I&^B?"Y
2、几个常用的重要技巧: uO8z .
可滚动、更新的记录集 DUUQz:?{J
批量更新 >0z(+}]3z
事务处理 M@ILB-H
bq#*XCt#
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 r)UtS4 7
1、取得数据库连接 _yw]Cacr\
1)用DriverManager取数据库连接 #q'J`BC
例子 atRWKsY<
String className,url,uid,pwd; 2{:bv~*I0F
className = "oracle.jdbc.driver.OracleDriver"; Z+!._uA
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; %;$zR}
uid = "system"; 8R<2I1xn2
pwd = "manager"; `1aEV#;
Class.forName(className); @2ZE8O#I
Connection cn = DriverManager.getConnection(url,uid,pwd); lArYlR}
2)用jndi(java的命名和目录服务)方式 FGY4 u4y
例子 @}k5rcQ*/
String jndi = "jdbc/db"; 7~n<%q/6
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 5]D"y Ay81
DataSource ds = (DataSource) ctx.lookup(jndi); (!`TO{ !6P
Connection cn = ds.getConnection(); p2s*'dab7
多用于jsp中 N]f"+
2、执行sql语句 N=R|s$,Oy9
1)用Statement来执行sql语句 fgcI55&jV{
String sql; <pJeiMo
Statement sm = cn.createStatement(); %2>ya>/M
sm.executeQuery(sql); // 执行数据查询语句(select) YBb%D
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); @k~'b
2)用PreparedStatement来执行sql语句 uf4C+ci
String sql; 32j@6!
sql = "insert into user (id,name) values (?,?)"; I*8i=O@0T
PreparedStatement ps = cn.prepareStatement(sql); 3~v'Ev
ps.setInt(1,xxx); Sxo9y0K8-
ps.setString(2,xxx); oRmz'F
... y^pzqv
ResultSet rs = ps.executeQuery(); // 查询 y
qDE|DIez
int c = ps.executeUpdate(); // 更新
&!7{2E\7C
Plpt7Pa_
3、处理执行结果 ig|ol*~
查询语句,返回记录集ResultSet M{M>$pt
更新语句,返回数字,表示该更新影响的记录数 !@j5 yYf
ResultSet的方法 w$%d"Jm#X
1、next(),将游标往后移动一行,如果成功返回true;否则返回false g*]Gc%
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 }Jfi"L
Ch;C\H:X
4、释放连接 P(B:tg
cn.close(); KtH-QQDluj
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection nHiE$Y
$}kT)+K
可滚动、更新的记录集 Z#w@ /!"}T
1、创建可滚动、更新的Statement :ZrE/3_S
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); h2M>4c
该Statement取得的ResultSet就是可滚动的 zq\YZ:JC
2、创建PreparedStatement时指定参数 *UM=EQaYk
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); +*/XfPlr|
ResultSet.absolute(9000); 5y3V duE
批量更新 p1^k4G
1、Statement X@`kuWIUw
Statement sm = cn.createStatement(); 8:s"
^YLN
sm.addBatch(sql1); mc37Y.
sm.addBatch(sql2); %^1@c f?.
... Qry?h*p+`
sm.executeBatch() yKSvg5lLy
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 c~j")o
2、PreparedStatement Td~CnCor
PreparedStatement ps = cn.preparedStatement(sql); ;.Dm?J0
{ F/1B>2$`
ps.setXXX(1,xxx); 6R_G{AWLL
... L{XNOf3
ps.addBatch(); yc ize2>q
} !I3_KuJ5
ps.executeBatch(); ME'hN->c
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 GI:J9TS
rDr3)*H?0
事务的处理 xz9xt
1、关闭Connection的自动提交 yCk9Xc
cn.setAutoCommit(false); e}V3dC^pU
2、执行一系列sql语句 UvwO/A\Gv
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ZcT%H*Ib]9
Statement sm ; OB-gH3:
sm = cn.createStatement(insert into user...); kY e3A&J
sm.executeUpdate(); 9Rz TC
sm.close(); sw:o3cC]
sm = cn.createStatement("insert into corp...); o{C7V*
sm.executeUpdate(); qyA%_;ReMY
sm.close(); `R\aNgCS}
3、提交 TV^m1uC
cn.commit(); L?[NXLn+
4、如果发生异常,那么回滚 55aJ=T
cn.rollback();