java 数据库基本操作 9S%gVNxn
1、java数据库操作基本流程 oqba:y;AR
2、几个常用的重要技巧: SECQVA_y`
可滚动、更新的记录集 ph?0I:eU
批量更新 !t
Oky
事务处理 `b ")Bx|
4E-A@FR
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 cIvYfgIo9
1、取得数据库连接 2 dD<]
1)用DriverManager取数据库连接 lo UwRz
例子
p=+*g.,O
String className,url,uid,pwd; "&#WMi
className = "oracle.jdbc.driver.OracleDriver"; 0BB@E(*
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; iW@Vw{|i I
uid = "system"; Ws*PMK.0
pwd = "manager"; k!/_/^{
Class.forName(className); p/1}>F|i
Connection cn = DriverManager.getConnection(url,uid,pwd); wUCDJY:,1
2)用jndi(java的命名和目录服务)方式 @B'8SLoP
例子 Gr"7w[|+
String jndi = "jdbc/db"; mvA xx`jc
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ^wF@6e7/&
DataSource ds = (DataSource) ctx.lookup(jndi); Z!-<rajl
Connection cn = ds.getConnection(); '<D `:srV
多用于jsp中 boF4d'g"
2、执行sql语句 W
B*`zCM
1)用Statement来执行sql语句 PyT}}UKj:
String sql; H'0*CiHes
Statement sm = cn.createStatement(); :gD0EqV
sm.executeQuery(sql); // 执行数据查询语句(select) !+A"Lej
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 9U<)_E<y
2)用PreparedStatement来执行sql语句 5Vqmv<F;$Z
String sql; ;Co[y=Z
sql = "insert into user (id,name) values (?,?)"; OgXZ-<'
PreparedStatement ps = cn.prepareStatement(sql); +:"6`um|
ps.setInt(1,xxx); IN|i)?rh
ps.setString(2,xxx); I4<{R
... ~6:LUM
ResultSet rs = ps.executeQuery(); // 查询 < k+fKl
int c = ps.executeUpdate(); // 更新 PF'5z#] NP
E7yf[/it
3、处理执行结果 moVa'1ul
查询语句,返回记录集ResultSet q3x;_y^
更新语句,返回数字,表示该更新影响的记录数 \Qi#'c$5+a
ResultSet的方法 nrS[7~
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 7zg)h
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Y-%l7GErhL
#U$YZ#B
4、释放连接 :n+y/6*
cn.close(); @vdc)vN[/
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection KO-Zz&2f
oBRm\8 2|
可滚动、更新的记录集 V/(`Ek-
1、创建可滚动、更新的Statement #0?"J)
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); )l!J$X+R
该Statement取得的ResultSet就是可滚动的 6`DwEs?Y{
2、创建PreparedStatement时指定参数 zL)1^[%O9
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); + 9\:$wMN
ResultSet.absolute(9000); FtFv<UV
批量更新 _@#uIOcE
1、Statement &?/N}g@K
Statement sm = cn.createStatement(); *or2
sm.addBatch(sql1); Jb3>vCIn
sm.addBatch(sql2); DMAf^.,S
... jU]]:S4xD/
sm.executeBatch() tDC0-N&6S~
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Hi; K"H]x1
2、PreparedStatement KFTf~!|
PreparedStatement ps = cn.preparedStatement(sql); ch0oFc$
{ 4i_spF-3
ps.setXXX(1,xxx); ;g:
U[cE
... n0+g]|a
AF
ps.addBatch(); cy=I0
} 5T$}Oy1
ps.executeBatch(); ~rgf{oGz
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 C2+{U
OwG6i|q
事务的处理 !Qv5"_
1、关闭Connection的自动提交 b$dJ?%W
cn.setAutoCommit(false); <O \tC81
2、执行一系列sql语句 2YL`3cgfb
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close BW'L.*2
Statement sm ; a4A`cUt
sm = cn.createStatement(insert into user...); Z"6 2#VM
sm.executeUpdate(); )ZT6:)
sm.close(); GXT]K>LA
sm = cn.createStatement("insert into corp...); QuSV&>T\
sm.executeUpdate(); 7))y}N:p
sm.close(); FovE$Dj]
3、提交 J"%8:pL
cn.commit(); ! 9d_Gf-
4、如果发生异常,那么回滚 bH'S.RWp=
cn.rollback();