java 数据库基本操作 _`j7clEz
1、java数据库操作基本流程 oWT3apGO
2、几个常用的重要技巧: V+Y%v.F
可滚动、更新的记录集 sUO`u qZV
批量更新 Di6 ?[(8
事务处理 ,]F,Uu_H7
WaRw05r
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 YoNDf39
1、取得数据库连接 Jq-]7N%k/
1)用DriverManager取数据库连接 \;Biq`
例子 y'q$|
String className,url,uid,pwd; AO4U}?
className = "oracle.jdbc.driver.OracleDriver"; ,?%Zc$\LW
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; b4 6~?*
uid = "system"; `Y$4 H,8L
pwd = "manager"; GR_-9}jQP
Class.forName(className); (mpNcOY<D
Connection cn = DriverManager.getConnection(url,uid,pwd); iOghb*aW
2)用jndi(java的命名和目录服务)方式 p?OoC
例子 Dw.J2>uj
String jndi = "jdbc/db"; k1~&x$G
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); cOJo3p;&
DataSource ds = (DataSource) ctx.lookup(jndi); jvL[
JI,b
Connection cn = ds.getConnection(); Ynj,pl
多用于jsp中 =&]g "a'
2、执行sql语句 S9y}
1)用Statement来执行sql语句 b2Fe<~S{
String sql; K($Npuu]
Statement sm = cn.createStatement(); 6<QQ@5_
sm.executeQuery(sql); // 执行数据查询语句(select) @Cyvf5|bL
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 4xje$/_d
2)用PreparedStatement来执行sql语句 *w\W/ Y
String sql; $Ds2>G4c
sql = "insert into user (id,name) values (?,?)"; *L^,|
PreparedStatement ps = cn.prepareStatement(sql); .|70;
ps.setInt(1,xxx); /$?}YL,
ps.setString(2,xxx); E{`fF8]K
... 45c$nuZ
ResultSet rs = ps.executeQuery(); // 查询 *])
`z8Ox
int c = ps.executeUpdate(); // 更新 ]h+j)J}[A
R
'zWYQ
3、处理执行结果 FcU SE
查询语句,返回记录集ResultSet EV%gF
更新语句,返回数字,表示该更新影响的记录数 R&k<AZ
ResultSet的方法 \ Gvm9M
1、next(),将游标往后移动一行,如果成功返回true;否则返回false
cdT7
@
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 .Yn_*L+4*
kn4`Fa;)O
4、释放连接 Bj;'qB>3
cn.close(); #q=Efn'
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 583|blL
'-~~-}= sJ
可滚动、更新的记录集 dUZ
,m9u
1、创建可滚动、更新的Statement ;4|15S
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); <\^8fn
该Statement取得的ResultSet就是可滚动的 f2`2,?
2、创建PreparedStatement时指定参数 VY4yS*y
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); _]H&,</
ResultSet.absolute(9000); yvB.&<]No
批量更新 Z@!+v19^
1、Statement n Dxz~8
Statement sm = cn.createStatement(); !_)[/q"
sm.addBatch(sql1); VpDbHAg
sm.addBatch(sql2); h*](a_0
... iqWQ!r^
sm.executeBatch() on`3&0,.
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 6LIJQ
2、PreparedStatement HIZe0%WPw
PreparedStatement ps = cn.preparedStatement(sql); hz@bW2S.
{ E ~<JC"]
ps.setXXX(1,xxx); rjYJs*#
... 0x@
mZ
ps.addBatch(); OQJ6e:BGt
} q@8*Xa >
ps.executeBatch(); jQB9j
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Tyx_/pJT
H* *Xu;/5@
事务的处理 s.C_Zf~3
1、关闭Connection的自动提交 &V/MmmT
cn.setAutoCommit(false); *z8\Lnv~k
2、执行一系列sql语句 k5pN
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close %*}(}~
Statement sm ; 2\{zmc}G-0
sm = cn.createStatement(insert into user...); uKHxe~
sm.executeUpdate(); M8(t'jN
sm.close(); 4H&+dRI"
sm = cn.createStatement("insert into corp...); 37o;;
sm.executeUpdate(); "^%cJAnLX
sm.close(); jNk%OrP]
3、提交 l]8uk^E
cn.commit(); VMWf>ZU
4、如果发生异常,那么回滚 0 @oJFJrO
cn.rollback();