java 数据库基本操作 n1x3q/~
1、java数据库操作基本流程 rZAP3)dA
2、几个常用的重要技巧: aEEb1Y
可滚动、更新的记录集 8VpmcGvc3
批量更新 ;5|d[r}k3
事务处理 p;%5 o0{1
e[Z-&'
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 [IyC}lSW^-
1、取得数据库连接 aYtW!+#
1)用DriverManager取数据库连接 K=4|GZ~p}`
例子 B%x?VOdBE
String className,url,uid,pwd; ,=pn}\R
className = "oracle.jdbc.driver.OracleDriver"; ,7d#t4
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; oh:.iL}j
uid = "system"; Nbf>Y
pwd = "manager"; v/7^v}[<
Class.forName(className); f DXTedrG/
Connection cn = DriverManager.getConnection(url,uid,pwd); e ?Jgk$"
2)用jndi(java的命名和目录服务)方式 d_[zt)
例子 &?j\=%
String jndi = "jdbc/db"; M?m@o1\;W
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); do l8O
DataSource ds = (DataSource) ctx.lookup(jndi); t ,EMyZ
Connection cn = ds.getConnection(); Y 6jgAq
多用于jsp中 i:&$I=
2、执行sql语句 e=!sMWx6
1)用Statement来执行sql语句 6/0bis
H
String sql; =FAIbM>u
Statement sm = cn.createStatement(); Yru,YA
sm.executeQuery(sql); // 执行数据查询语句(select) *aYuuRx
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 6ZXRb
2)用PreparedStatement来执行sql语句 a!j{A?7Kw.
String sql; Z0 c|;
sql = "insert into user (id,name) values (?,?)"; ;b|=osyT\
PreparedStatement ps = cn.prepareStatement(sql); n"I{aJ]K
ps.setInt(1,xxx); j\@&poJ(,
ps.setString(2,xxx); 'O
7>w%#
... i_y%HG
ResultSet rs = ps.executeQuery(); // 查询 n&Q0V.
int c = ps.executeUpdate(); // 更新 DRVvC~M-,
n482?Wp
3、处理执行结果 Rd@?2)Xm
查询语句,返回记录集ResultSet &jrc]
更新语句,返回数字,表示该更新影响的记录数 7a4Z~r27/
ResultSet的方法 b.
:2x4
1、next(),将游标往后移动一行,如果成功返回true;否则返回false .|:R#VW
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 4`sW_
ks
kb\\F:w(W
4、释放连接 Eb&=$4c=
cn.close(); Q ~eh_>"
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection e[QEOx/-h2
HSACaTVK
可滚动、更新的记录集 /W{^hVkvC
1、创建可滚动、更新的Statement w,1*dn
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); XCGK&OGI
该Statement取得的ResultSet就是可滚动的 0Fs2* FS
2、创建PreparedStatement时指定参数 "JgwL_2
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); _Q*,~ z~
ResultSet.absolute(9000); OL.{lKJ3DV
批量更新 cVaGgP}\
1、Statement +~xzgaL
Statement sm = cn.createStatement(); ,y)V5
c1
sm.addBatch(sql1); T|--ZRYn
sm.addBatch(sql2); i@=(Y~tD`
... Xk :_aJ
sm.executeBatch() a!&<jM
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 wk2Ff*&
2、PreparedStatement &!>.)I`
PreparedStatement ps = cn.preparedStatement(sql); <Ug1g0.
{ =>e>
r~cW
ps.setXXX(1,xxx); +[V.yY/t|>
... pWeD,!f
ps.addBatch(); MZ^(BOe_
} ZQsVSz( 1
ps.executeBatch(); Bl+PJ
0
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 m*14n_m'
o#-^Lg&
事务的处理 ^HWa owy=
1、关闭Connection的自动提交 .p78
\T
cn.setAutoCommit(false); Hr(%y&0
2、执行一系列sql语句 Dyj>dh-
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close +@+*sVb
Statement sm ; );xTl6Y9
sm = cn.createStatement(insert into user...); `cFNO:
sm.executeUpdate(); g9F?j
sm.close(); FY,)iZ}Pq
sm = cn.createStatement("insert into corp...); 6^ ,;^
sm.executeUpdate(); FD8d-G
sm.close(); gS!zaD7Nr
3、提交 QRdh2YH`
cn.commit(); P\$%p-G
4、如果发生异常,那么回滚 \
Ju7.3.
cn.rollback();