java 数据库基本操作
;};wq&b#
1、java数据库操作基本流程 :RoBl3X=
2、几个常用的重要技巧: y_\p=0t8
可滚动、更新的记录集 }*.0N;;C
批量更新 ?A(QyaKz
事务处理 xX*H7#
x77l~=P+!
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 fP.F`V_Y
1、取得数据库连接 XGP6L 0j
1)用DriverManager取数据库连接 ^Ge+~o?x
例子 j'9"cE5_
String className,url,uid,pwd; i4^o59}8
className = "oracle.jdbc.driver.OracleDriver"; TXe$<4"
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; XsnF~)YW
uid = "system"; LPMU8Er
pwd = "manager"; J[f;Xlh
Class.forName(className); :0s]U_h
Connection cn = DriverManager.getConnection(url,uid,pwd); x| yEtO&
2)用jndi(java的命名和目录服务)方式 N<QXmgqx
例子 c478P=g=5
String jndi = "jdbc/db"; Yjx|9_|Xn
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); v) vkn/:
DataSource ds = (DataSource) ctx.lookup(jndi); &u#&@J
Connection cn = ds.getConnection(); pdE3r$C
多用于jsp中 ?LvCR_D:
2、执行sql语句 C@th O
1)用Statement来执行sql语句 xg)v0y~
String sql; k0T?-iM
Statement sm = cn.createStatement(); )M)7"PC
sm.executeQuery(sql); // 执行数据查询语句(select) cA%%IL$R
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ZDbc
2)用PreparedStatement来执行sql语句 rn<PR*
String sql; #1>X58I^
sql = "insert into user (id,name) values (?,?)"; r*Yi1j/
PreparedStatement ps = cn.prepareStatement(sql); }Ho Qwy|&
ps.setInt(1,xxx); >JiltF7H0
ps.setString(2,xxx); 8Y5
... **}h&k&%2
ResultSet rs = ps.executeQuery(); // 查询 Mbjvh2z
int c = ps.executeUpdate(); // 更新 ) $PDo
7#
HttiX/2~
3、处理执行结果 `w]s;G[
查询语句,返回记录集ResultSet G "73=8d
更新语句,返回数字,表示该更新影响的记录数 7)s^8+
ResultSet的方法 *zr(Zv
1、next(),将游标往后移动一行,如果成功返回true;否则返回false r$2P;Cxj
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 AhZ8 0!
N!g9*Z
4、释放连接 tKpmm`2
cn.close(); 9<KAXr#
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 1Tu
*79A
.'Vww
可滚动、更新的记录集
8']9$#
1、创建可滚动、更新的Statement s8}@=]aA
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); hiQha5
该Statement取得的ResultSet就是可滚动的 V7/I>^X
2、创建PreparedStatement时指定参数 Q[nEsYP
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); iezO9`
ResultSet.absolute(9000); gG/!,Q.Qh
批量更新 e o pD5
1、Statement 0:+WO%z
Statement sm = cn.createStatement(); y- 1 pR
sm.addBatch(sql1); j$+nKc$
sm.addBatch(sql2); ^Vpq$'!
... i9/aAH0
sm.executeBatch() nw-I|PVTNa
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ]C) 4
2、PreparedStatement ?mwD*LN3o
PreparedStatement ps = cn.preparedStatement(sql); 92EWIHEWZ
{ Z?\2F%
ps.setXXX(1,xxx); p\bDY
... ~$~5qwl
ps.addBatch(); utIX %0
} Nqu>6^-z0
ps.executeBatch(); lyGhdgWc
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 &uO%_6J
}I
:OsAw
事务的处理 XHK70: i
1、关闭Connection的自动提交 ^/r7@:
cn.setAutoCommit(false); m@^1JlH
2、执行一系列sql语句 DCZ\6WY1G)
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close +(h\fm7*-
Statement sm ; rYbpih=x
sm = cn.createStatement(insert into user...); ({q?d[q[
sm.executeUpdate();
6q{HU]N+
sm.close(); 6Udov pl
sm = cn.createStatement("insert into corp...); 2o'Wy
sm.executeUpdate(); Z:*76PP,
sm.close(); <TP=oq?I/
3、提交 l6d$V9A
cn.commit(); wYmM"60
4、如果发生异常,那么回滚 /AW=5Ck- #
cn.rollback();