java 数据库基本操作 N+V_[qr#
1、java数据库操作基本流程 Fb^Ae6/i
2、几个常用的重要技巧: X^%E"{!nU
可滚动、更新的记录集 $&@etsW0/
批量更新 Bt?.8H6Y
事务处理 m`Dn R`+
Nm;V9*5
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 >7Y6NAwY
1、取得数据库连接 l(fStpP
1)用DriverManager取数据库连接 7k==?,LG3
例子 J=OWXL!<a
String className,url,uid,pwd; N =0R6{'
className = "oracle.jdbc.driver.OracleDriver"; H"n@=DMLm
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 'a6:3*
uid = "system"; ,<cF<9h
pwd = "manager"; w~S~
Class.forName(className); '-?t^@
Connection cn = DriverManager.getConnection(url,uid,pwd); Zi4Ektj2
2)用jndi(java的命名和目录服务)方式 wfJ["
q
例子 z"*$ .
String jndi = "jdbc/db"; WokQ
X"
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); )`V__^
DataSource ds = (DataSource) ctx.lookup(jndi); t%'0uB#v1
Connection cn = ds.getConnection(); E{#Y=
多用于jsp中 J nzI-
y
2、执行sql语句 1oVjx_I5y
1)用Statement来执行sql语句 f|cF[&wo
String sql; #ozQF~
Statement sm = cn.createStatement(); "?Mf%u1R
sm.executeQuery(sql); // 执行数据查询语句(select) 6j{O/
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); D,)^l@UP
2)用PreparedStatement来执行sql语句 8ba*:sb
String sql; (+=TKI<=
sql = "insert into user (id,name) values (?,?)"; ;xl_9Ht/
PreparedStatement ps = cn.prepareStatement(sql); LqOjVQxz
ps.setInt(1,xxx); rjJ-ZRs\
ps.setString(2,xxx); <zdo%~ba
... P?Fm<s:
ResultSet rs = ps.executeQuery(); // 查询 s(3iGuT
int c = ps.executeUpdate(); // 更新 /EXubU73
{W5D)
3、处理执行结果 l*0`{R
查询语句,返回记录集ResultSet TXDb5ZCzM
更新语句,返回数字,表示该更新影响的记录数 j1hx{P'
ResultSet的方法 CNRiK;nQ
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ,VTX7vaH
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 j}devpO
SB<09|2
4、释放连接 <e%~K4KH
cn.close(); H5'Le{
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Dn9AOi!
/[|ODfY
可滚动、更新的记录集 =nTNL .SX
1、创建可滚动、更新的Statement rcyq+wY #
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); u}L;/1,B
该Statement取得的ResultSet就是可滚动的 &8^1:CcE
2、创建PreparedStatement时指定参数 SyWLPh
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); G._E9
ResultSet.absolute(9000); d mj T$a|
批量更新 -Z/'kYj?U
1、Statement 6d%|yl
Statement sm = cn.createStatement(); dreEe s`|
sm.addBatch(sql1); 6?X)'
sm.addBatch(sql2); ue~?xmZg
... faJ>,^V#
sm.executeBatch() N!hS`< }
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 G;CB%qXI
2、PreparedStatement F]"Hs>
PreparedStatement ps = cn.preparedStatement(sql); HxXCxI3
{ nP+]WUnY
ps.setXXX(1,xxx); zs_^m1t1s
... A`
iZ"?
ps.addBatch(); Ub%sw&QG(9
} ji(Y?vhQt
ps.executeBatch(); w&E*{{otJ
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 oB8x_0#n
G^ 2a<?Di
事务的处理 wV,l }Xb-
1、关闭Connection的自动提交 Gf|qc>j.b
cn.setAutoCommit(false); nGdEJ
2、执行一系列sql语句 !]v &/
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close NxyrP**j
Statement sm ; g^qbd$ }
sm = cn.createStatement(insert into user...); FlPPz
sm.executeUpdate(); +l,6}tV9
sm.close(); o3oAk10
sm = cn.createStatement("insert into corp...); YV 5kzq
sm.executeUpdate(); ZvS|a~jO
sm.close(); E{-W#}#
3、提交 KJf~9w9U
cn.commit(); >[U.P)7;
4、如果发生异常,那么回滚 ny,a5zEnF
cn.rollback();