java 数据库基本操作 ]S 7^ITn
1、java数据库操作基本流程 &6Il(3-^
2、几个常用的重要技巧: *V(Fn-6(
可滚动、更新的记录集 (qwdQMj`
批量更新 ):EBgg4-N
事务处理 /HZumV?
yg]2erR
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 l.nH?kK<
1、取得数据库连接 F~U!1)
1)用DriverManager取数据库连接 sCl$f7"
例子 =l<iI*J.
M
String className,url,uid,pwd; ~2u\
className = "oracle.jdbc.driver.OracleDriver"; buk=p-oi
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Ri>?KrQF%
uid = "system"; `:M^8SYrL
pwd = "manager"; "8V{5e!%j'
Class.forName(className); V,%L~dI
Connection cn = DriverManager.getConnection(url,uid,pwd); TOLl@p]lU
2)用jndi(java的命名和目录服务)方式 }jSj+*
例子 x?D/.vrOY
String jndi = "jdbc/db"; bl/,*Wx:4.
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); e~v(eK_
DataSource ds = (DataSource) ctx.lookup(jndi); l0tYG[
Connection cn = ds.getConnection(); z(c9,3
多用于jsp中 b]gY~cbI8
2、执行sql语句 #~qAHJ<
1)用Statement来执行sql语句 f+vVR1
String sql; 4 c'4*`I
Statement sm = cn.createStatement(); (P6vOo
sm.executeQuery(sql); // 执行数据查询语句(select) 6g>)6ux>aV
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); vuz4qCQ
2)用PreparedStatement来执行sql语句 1@XgTL4
String sql; z 2/!m[U
sql = "insert into user (id,name) values (?,?)"; c#xP91.m
PreparedStatement ps = cn.prepareStatement(sql); D&hqV)d4R
ps.setInt(1,xxx); Y|0ow_oH
ps.setString(2,xxx); VanB>|p6
... |dadH7
ResultSet rs = ps.executeQuery(); // 查询 V:bV ?lt
int c = ps.executeUpdate(); // 更新 I_ "Z:v{
UBO^EVJ
3、处理执行结果 U/qE4u1J6M
查询语句,返回记录集ResultSet ]B9 ^3x[:
更新语句,返回数字,表示该更新影响的记录数 kpob b
ResultSet的方法 &~5=K
1、next(),将游标往后移动一行,如果成功返回true;否则返回false GIHpSy`z
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 'PdmI<eXQ
'~-IV0v9
4、释放连接 +yt6(7V*
cn.close(); ;_<)JqUh
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection JhR W[~
rVAL|0;3
可滚动、更新的记录集 Uz8hANN0_
1、创建可滚动、更新的Statement r{+aeLu
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); g?qKNY
该Statement取得的ResultSet就是可滚动的 %Ny) ?B
2、创建PreparedStatement时指定参数 FuP/tTMU1a
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); #I`ms$j%
ResultSet.absolute(9000); 'b:Ne,<
批量更新 ecH/Wz1
1、Statement kRIB<@{
Statement sm = cn.createStatement(); F@YV]u>N
sm.addBatch(sql1); |;;!8VO3J
sm.addBatch(sql2); s ?l%L!
... zREJ#r
sm.executeBatch() Y9}8M27vQG
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有
YRB%:D@u
2、PreparedStatement Fm j=
PreparedStatement ps = cn.preparedStatement(sql); g{pQ4jKF
{ |Svk^m q
ps.setXXX(1,xxx); #A <1aQ
... 6 o[/F3`
ps.addBatch(); ,&a`d}g&G
} "2HY5AE
ps.executeBatch(); nbvkP
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 {`.O|_b
Pl~P- n
事务的处理 Gm=>!.p
1、关闭Connection的自动提交 J l7z|Q S
cn.setAutoCommit(false); H)JS0
G0
2、执行一系列sql语句 =L0fZf
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close fU*C/ d3
Statement sm ; ,9/5T: 2
sm = cn.createStatement(insert into user...); Ex($
sm.executeUpdate(); 6GOcI#C9C
sm.close(); +?N}Y {Y&
sm = cn.createStatement("insert into corp...); Ht=$] Px
sm.executeUpdate(); J^H=i)A
sm.close(); 1
ycc5=.
3、提交 |PM m?2^ R
cn.commit(); j.c8}r&
4、如果发生异常,那么回滚 .`L gYW
cn.rollback();