java 数据库基本操作 E}7@?o7u}
1、java数据库操作基本流程 ZCP
r`H
2、几个常用的重要技巧: n};:*N!
v
可滚动、更新的记录集 }XJA#@
批量更新 /$w,8pV=
事务处理 ,".1![b
|ia#Elavo
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ]LcCom:]
1、取得数据库连接 wZ&l6J4L
1)用DriverManager取数据库连接 q5@N//<DNN
例子 gk &
String className,url,uid,pwd; #qx$ p
className = "oracle.jdbc.driver.OracleDriver"; 2P`Z>_
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; =tP%K*Il4
uid = "system"; (KHO'QNMt^
pwd = "manager"; F$tshe(
Class.forName(className); Ol%KXq[
Connection cn = DriverManager.getConnection(url,uid,pwd); TBAF_$
2)用jndi(java的命名和目录服务)方式 ku8C#%.m3
例子 Aoi) 11>
String jndi = "jdbc/db"; &7K 4tL
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Yo 0wufbfV
DataSource ds = (DataSource) ctx.lookup(jndi); G1RUu-~+
Connection cn = ds.getConnection(); dF@m4U@L
多用于jsp中 F(!9;O5J]
2、执行sql语句 Z1 7=g@
1)用Statement来执行sql语句 =tk O^
String sql; K~1uR:DR
Statement sm = cn.createStatement(); cdBD.sg
sm.executeQuery(sql); // 执行数据查询语句(select) 0Yzm\"Ggv
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); jN[P$}#b`
2)用PreparedStatement来执行sql语句 F
gi&CJ8Q
String sql; HLlp+;CF><
sql = "insert into user (id,name) values (?,?)"; bdS
PreparedStatement ps = cn.prepareStatement(sql); |Ok@:Au
ps.setInt(1,xxx); I34|<3t$
ps.setString(2,xxx); 8@$`'h^6
... z CS.P.$
ResultSet rs = ps.executeQuery(); // 查询 #N?VbDK9_
int c = ps.executeUpdate(); // 更新 ;hz;|\ko5
mz[Q]e~&i
3、处理执行结果 \LN!k-c
查询语句,返回记录集ResultSet -:$#koW
更新语句,返回数字,表示该更新影响的记录数 zwLJ|>
ResultSet的方法 W@bZ~Q9
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ?RP&XrD
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 iE6?Px9]
uZ1b_e0SGu
4、释放连接 IqA'Vz,lL
cn.close(); b.N$eJlQ&
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Oq`CK f
f/?uosS
可滚动、更新的记录集 eYpK!9
1、创建可滚动、更新的Statement Z,jR:_p
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); efT@A}sV
该Statement取得的ResultSet就是可滚动的 _~QiQDq
2、创建PreparedStatement时指定参数 w
\ U?64
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); vtA%^~0
ResultSet.absolute(9000); QWncKE,O$
批量更新 yhuzjn
1、Statement ~; V5*t
Statement sm = cn.createStatement(); L?Fb}
sm.addBatch(sql1); ~x-"?K
sm.addBatch(sql2); D&dh>Pe1;
... <n;9IU
sm.executeBatch() !l(O$T9T
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 "mtEjK5
2、PreparedStatement _HAtTW
PreparedStatement ps = cn.preparedStatement(sql); z^FJ
{ #CV;Np
ps.setXXX(1,xxx); \aY<| 7zK
... }wIF$v?M
ps.addBatch(); OsrHA
} E ',z<S
ps.executeBatch(); es6]c%o:t^
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 X21k7 Ls
+jPJv[W
事务的处理 WA?We7m$
1、关闭Connection的自动提交 kMz*10$gn
cn.setAutoCommit(false); G`oY(2U
2、执行一系列sql语句 BzXTHFMSy
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 4#Bzq3,|
Statement sm ; X$Y\/|!z
sm = cn.createStatement(insert into user...); kgv29j?k;
sm.executeUpdate(); _?I6[Mz
sm.close(); )8JfBzR
sm = cn.createStatement("insert into corp...); RSTA!?K/.
sm.executeUpdate(); qlNB\~HCe
sm.close(); >7$h
3、提交 {Qf/.[
cn.commit(); M669G;w(K
4、如果发生异常,那么回滚 3+4U?~^k*
cn.rollback();