java 数据库基本操作 ]1k"'XG4,
1、java数据库操作基本流程 &3t[p=
2、几个常用的重要技巧: g!*5@k|C
可滚动、更新的记录集 7Fd`MTo
批量更新 |>U:Pb(
事务处理 01^+HEbm
]/klKqz
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ~?#B(t
1、取得数据库连接
+91j 1?
1)用DriverManager取数据库连接 bxrT[]
例子 N(W;\>P
String className,url,uid,pwd; ^}PG*h|
className = "oracle.jdbc.driver.OracleDriver"; ~Y.I;EPKt
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; vz1yH%~E
uid = "system"; 2@~hELkk/E
pwd = "manager"; `\vqDWh8-
Class.forName(className); {Jx-Zo>'
Connection cn = DriverManager.getConnection(url,uid,pwd); vdt ":
2)用jndi(java的命名和目录服务)方式 bB->7.GXu
例子 XVwJr""+
String jndi = "jdbc/db"; ;p_@%*JAx
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); m:
DataSource ds = (DataSource) ctx.lookup(jndi); _hz}I>G@B
Connection cn = ds.getConnection(); V~%C me
多用于jsp中 6 J
B"qd
2、执行sql语句 pSC\[%K
1)用Statement来执行sql语句 d)yu`U
String sql; iXsX@ S^F
Statement sm = cn.createStatement(); 6";ew:Ih^
sm.executeQuery(sql); // 执行数据查询语句(select) "7X[@xX@
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); {k"t`uo_
2)用PreparedStatement来执行sql语句 9>I&Z8J$M
String sql; (O@fgBM
sql = "insert into user (id,name) values (?,?)"; Vhi4_~W3j]
PreparedStatement ps = cn.prepareStatement(sql); DY(pU/q
ps.setInt(1,xxx); h%*@82DKK
ps.setString(2,xxx); 3)6&)7`*
... G3wkqd
ResultSet rs = ps.executeQuery(); // 查询 "!F%X%/
int c = ps.executeUpdate(); // 更新 818,E
RNMd,?dj
3、处理执行结果 SE7mn6,%\
查询语句,返回记录集ResultSet bMp[:dw`y
更新语句,返回数字,表示该更新影响的记录数 i]
I{7k
ResultSet的方法 _yN&+]c
1、next(),将游标往后移动一行,如果成功返回true;否则返回false hq|I%>y
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 hzcSKRm
L%Mj{fJ>Wm
4、释放连接 :I!}ZD+Z
cn.close(); [0M`uf/u
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection oH]_2[
!
d"0=.sA
可滚动、更新的记录集 5ca!JLs
1、创建可滚动、更新的Statement 1&.q#,EMn(
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); $c0<I59&|
该Statement取得的ResultSet就是可滚动的 N7 ox#=g
2、创建PreparedStatement时指定参数 hC
D6
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Svl;Ul
ResultSet.absolute(9000); $2J[lt?%
批量更新 h; "pAE
1、Statement F+ Dke>j
Statement sm = cn.createStatement(); UrRYK-g
sm.addBatch(sql1); h7a/]~
sm.addBatch(sql2); \~BYY|UB;W
... r>;(\_@
sm.executeBatch() XEe$Wh
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 gCL?{oVU
2、PreparedStatement S\dG>F>S
PreparedStatement ps = cn.preparedStatement(sql); ya'Ma<4
{ 4o69t
ps.setXXX(1,xxx); ]]^r)&pox
... R}E$SmFg
ps.addBatch(); ]]eI80u[
} |QHIB?C?`
ps.executeBatch(); \`oP\|Z
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 s/\<;g:u^
me+u"G9I;
事务的处理 m8Y>4:Nw
1、关闭Connection的自动提交 Y~Z&h?H'}
cn.setAutoCommit(false); qF3s&WI
2、执行一系列sql语句 K0'= O
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close TR&7AiqB
Statement sm ; ZuNUha&a
sm = cn.createStatement(insert into user...); 9
M90X8
sm.executeUpdate(); [U@;EeS
sm.close(); -2qI2Z
sm = cn.createStatement("insert into corp...); Ov~vK\
sm.executeUpdate(); "UUoT
sm.close(); &ev#C%Nu
3、提交 CsX@u#
cn.commit(); ^OrO&w|
4、如果发生异常,那么回滚 l[Ko>
cn.rollback();