java 数据库基本操作 =AT."$r>
1、java数据库操作基本流程 _GPe<H
2、几个常用的重要技巧: DH=hH&[e(d
可滚动、更新的记录集 FwK]$4*
批量更新 NHt\
U9l'
事务处理 rjP/l6
~'
f^e)O$N9]
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 3^ClAE"8
1、取得数据库连接 7=uj2.J6
1)用DriverManager取数据库连接 iCoX&"lb
例子 "tZe>>I
String className,url,uid,pwd; _g8yDfcLG
className = "oracle.jdbc.driver.OracleDriver"; ^Pf WG*
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr;
y7{?Ip4[
uid = "system"; AX INThJ
pwd = "manager"; "MsIjSu
Class.forName(className); l] vm=7:
Connection cn = DriverManager.getConnection(url,uid,pwd); _aphkeqd
2)用jndi(java的命名和目录服务)方式 xk5]^yDp
例子 _{>vTBU4F
String jndi = "jdbc/db"; wL1MENzp*z
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 4| f*eO
DataSource ds = (DataSource) ctx.lookup(jndi); Y2TtY;
Connection cn = ds.getConnection(); ,6/V"kqIP
多用于jsp中 u
+hX
2、执行sql语句 s.rm7r@#
1)用Statement来执行sql语句 b>W%t
String sql; R_KH"`q
Statement sm = cn.createStatement(); V#HuIgf-
sm.executeQuery(sql); // 执行数据查询语句(select) im8 CmQ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); B~mj 8l4
2)用PreparedStatement来执行sql语句 :s,Z<^5a)g
String sql; ~u{uZ(~
sql = "insert into user (id,name) values (?,?)"; ,uvRi)O>a
PreparedStatement ps = cn.prepareStatement(sql); zA 3_Lx!
ps.setInt(1,xxx); kM6
Qp
ps.setString(2,xxx); NbobliC=
... e.> P8C<&
ResultSet rs = ps.executeQuery(); // 查询 #E[0ys1O
int c = ps.executeUpdate(); // 更新 W^Yxny
(Z*!#}z`
3、处理执行结果 .`lCWeHN
查询语句,返回记录集ResultSet |pK!S
更新语句,返回数字,表示该更新影响的记录数 I]575\bA
ResultSet的方法 ' QG?nu
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 7pd$\$
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 txpgO1
pmM9,6P4@
4、释放连接 Z;i:](
cn.close(); F2WKd1U
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection W!X@
|4JEU3\$
可滚动、更新的记录集 45e~6",
1、创建可滚动、更新的Statement 7v kL1IA
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); s%S
该Statement取得的ResultSet就是可滚动的
Hz~zu{;{J
2、创建PreparedStatement时指定参数 g-A-kqo9
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); r$1Qf}J3=
ResultSet.absolute(9000); yevPHN"M
批量更新 ;jXgAAz7
1、Statement *hx
Statement sm = cn.createStatement(); yfSmDPh
sm.addBatch(sql1); d$RIS+V
sm.addBatch(sql2); `A >@]d
... +TJCLZ..
sm.executeBatch() M{@(G5
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 =(Mch~
2、PreparedStatement -~0^P,yQ
PreparedStatement ps = cn.preparedStatement(sql); f 2.HF@
{ \zkg
ps.setXXX(1,xxx); Wri<h:1
... %;_MGae
ps.addBatch(); UpG~[u)%@
} :]KAkhFkbb
ps.executeBatch(); L#J1b!D&<6
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 fl(wV.Je|
\Z/@C lCm
事务的处理 s#11FfF`
1、关闭Connection的自动提交 o4X{L`m
cn.setAutoCommit(false); Wc#24:OKe3
2、执行一系列sql语句 +2{Lh7Ks
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 6t$8M[0-U
Statement sm ; khe}*y
sm = cn.createStatement(insert into user...); u[YGm:}
sm.executeUpdate(); L_T5nD^D
sm.close();
)2.Si#
sm = cn.createStatement("insert into corp...); UfGkTwoo=
sm.executeUpdate(); 29KiuP
sm.close(); wj,=$RX
3、提交 +whDU2 "
cn.commit(); q1,~
4、如果发生异常,那么回滚 <YY 14p
cn.rollback();