java 数据库基本操作 wAu[pWD'6;
1、java数据库操作基本流程 2&gd"Ak(
2、几个常用的重要技巧: [EmOA.6
可滚动、更新的记录集 "s>fV9YyZ
批量更新 2fzKdkJhe
事务处理 Cv>yAt.3
3_L1Wm
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 xz"Z3B
1、取得数据库连接 ke}Y2sB
1)用DriverManager取数据库连接 b$?Xn {Y
例子 .lvI8Jf~X
String className,url,uid,pwd; b$v[@"1
className = "oracle.jdbc.driver.OracleDriver"; ntj`+7mw
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; =|E
09
uid = "system"; \m=-8KpU
pwd = "manager"; A \MfF
Class.forName(className); ` /I bWu
Connection cn = DriverManager.getConnection(url,uid,pwd); *bCi2mbm@
2)用jndi(java的命名和目录服务)方式 a1g6}ym\
例子 VelB-vy&
String jndi = "jdbc/db"; jcEs10y
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); f`hyYp`d5
DataSource ds = (DataSource) ctx.lookup(jndi); egI{!bZg'\
Connection cn = ds.getConnection(); ,pyQP^u-
多用于jsp中 QGH
h;
2、执行sql语句 - yC:?
1)用Statement来执行sql语句 3tT|9Tb@
String sql; ` URSv,(
Statement sm = cn.createStatement(); 8"km_[JE e
sm.executeQuery(sql); // 执行数据查询语句(select) +X:J]-1)
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); K,eqD<
2)用PreparedStatement来执行sql语句 U#;51_
String sql; HQ^9[HN.
sql = "insert into user (id,name) values (?,?)"; a[1sA12
PreparedStatement ps = cn.prepareStatement(sql); Pqy-gWOv
ps.setInt(1,xxx); N>d|A]zH
ps.setString(2,xxx); ,4H;P/xsb
... i1qS ns
ResultSet rs = ps.executeQuery(); // 查询 Jo{zy
int c = ps.executeUpdate(); // 更新 mb0n}I_AC
Ky[bX
3、处理执行结果 kqVg2#<@M
查询语句,返回记录集ResultSet /[a|DUoHO
更新语句,返回数字,表示该更新影响的记录数 n}< ir!ZTO
ResultSet的方法 y#S1c)vU
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ]urK$
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 klgv{_b
`OKo=e~,
4、释放连接 5%<TF.;-J
cn.close(); 7$(_j<o`
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 'FShNY5
t|;%DA)fjw
可滚动、更新的记录集 j\2]M
1、创建可滚动、更新的Statement 44|deE3Z
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 2?GXkPF2;A
该Statement取得的ResultSet就是可滚动的 bnijM/73
2、创建PreparedStatement时指定参数 sS,
zzx<
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); o" |O
]
ResultSet.absolute(9000); .aNO( /kO
批量更新 7w "sJ
1、Statement f5@.^hi[
Statement sm = cn.createStatement(); p QluGIX0V
sm.addBatch(sql1); [J~aAB
sm.addBatch(sql2); z*6$&sS\>
... ZV!R#Xv
sm.executeBatch() 'sj9[o@]
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 sf Dg/ a
2、PreparedStatement &&;ex9
PreparedStatement ps = cn.preparedStatement(sql); P?^JPbfV
{ mT96]V\
ps.setXXX(1,xxx); eh$G.-2N
... XjX 2[*l
ps.addBatch(); +x(YG(5\w
} aSRjFL^
ps.executeBatch(); ^~^mR#<P$
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 %VzYqj_P"
\WWG>OUh.U
事务的处理 z4CJn[m9
1、关闭Connection的自动提交 BS N6|W
cn.setAutoCommit(false); aT&t_^[]
2、执行一系列sql语句 GF&_~48GD
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close XmP;L(wa
Statement sm ; avlqDi1l
sm = cn.createStatement(insert into user...); x'@W=P 7
sm.executeUpdate(); R;WW
f.#
sm.close(); Q-[3j
sm = cn.createStatement("insert into corp...); w{3ycR
sm.executeUpdate(); +|6`E3j%
sm.close(); jQ6Xr&}
3、提交 {Jrf/p9w
cn.commit(); '?5S"??
4、如果发生异常,那么回滚 5\WUoSgy
cn.rollback();