java 数据库基本操作 :oIBJ u%/
1、java数据库操作基本流程 P1mg;!tq
2、几个常用的重要技巧: >1sa*Wf
可滚动、更新的记录集 jo:Z
批量更新 W"Ip]LJ
事务处理 <K [y~9u
63W;N7@
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 j*DPW)RkKX
1、取得数据库连接 LlX)xJ
1)用DriverManager取数据库连接 sC-o'13
例子 ^#:;6^Su
String className,url,uid,pwd; 072C!F
className = "oracle.jdbc.driver.OracleDriver"; IA` voO$
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; =p@`bx
uid = "system"; D;Qx9^.
pwd = "manager"; D^6*Cwb
Class.forName(className); XG/xMz~
Connection cn = DriverManager.getConnection(url,uid,pwd); ^+m`mc sE
2)用jndi(java的命名和目录服务)方式 LE8<JMB
例子 *k LFs|U
String jndi = "jdbc/db"; huC{SzXM
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); +Ryj82;59z
DataSource ds = (DataSource) ctx.lookup(jndi); G WIsT\J
Connection cn = ds.getConnection(); $f
=`fPo
多用于jsp中 zq};{~u(
2、执行sql语句 cLZ D\1Mt
1)用Statement来执行sql语句 P=n_wE
String sql; Yqs=jTq`{
Statement sm = cn.createStatement(); ETHcZ
sm.executeQuery(sql); // 执行数据查询语句(select) z&%i"IY
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); =*\.zr
2)用PreparedStatement来执行sql语句 xOTvrX
String sql; r{R-X3s
sql = "insert into user (id,name) values (?,?)"; ,R{&x7
PreparedStatement ps = cn.prepareStatement(sql); Sb`[+i'`
ps.setInt(1,xxx); 6^b)Q(Edut
ps.setString(2,xxx); 64/ZfXD
... *O_fw 0jV
ResultSet rs = ps.executeQuery(); // 查询 \L*%?~
int c = ps.executeUpdate(); // 更新 & &}_[{fc
6(8F4[D
3、处理执行结果 SxRJ{m~
查询语句,返回记录集ResultSet PF~@@j
更新语句,返回数字,表示该更新影响的记录数 W;OGdAa_
ResultSet的方法 P =X]'m_B
1、next(),将游标往后移动一行,如果成功返回true;否则返回false $Z G&d
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 (kxS0 ]=
O=o}uB-*6
4、释放连接 IBT>&(cnV
cn.close(); T)zk2\u
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection |*{*tW C1
O\=Z;}<N
可滚动、更新的记录集 F1yn@a "=J
1、创建可滚动、更新的Statement Dd?G4xUG
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); agUdI_'~@9
该Statement取得的ResultSet就是可滚动的 JG!B3^qB
2、创建PreparedStatement时指定参数 >+%#m'Y&&
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); wo`.sB&T
ResultSet.absolute(9000); 8:TX9`,
批量更新 B[uyr)$
1、Statement x$LCLP#$H
Statement sm = cn.createStatement(); e@h{Ns.1-
sm.addBatch(sql1); Bq8#'K2i,
sm.addBatch(sql2); i-CJ{l
... V(&L
sm.executeBatch() `LkrG9KV{
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Dmh$@Uu#F
2、PreparedStatement 1mmL`M1
PreparedStatement ps = cn.preparedStatement(sql); eHgr"f*7
{ CF;Gy L1M
ps.setXXX(1,xxx); r)t[QoD1
... 6Ryc&z5
ps.addBatch(); Lvf<g}?4
} Z[@ i/. I
ps.executeBatch(); "uBnK!
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 \tgY2:
e4YfJd
事务的处理 ;?Pz0,{h
1、关闭Connection的自动提交 >|SIqB<%:
cn.setAutoCommit(false); -m`|S q
2、执行一系列sql语句 Km5_P##
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 8>C4w 5kF
Statement sm ; H9T~7e+
sm = cn.createStatement(insert into user...); _A,_RM$Y
sm.executeUpdate(); (>}1t!1
sm.close(); 'Dfs&sm
sm = cn.createStatement("insert into corp...); p\[!=ZXFr\
sm.executeUpdate(); FF8jW1
sm.close(); \m7\}Nbz0/
3、提交 3/RwCtc
cn.commit(); ;#Po}8Y=
4、如果发生异常,那么回滚 F8w7N$/V",
cn.rollback();