java 数据库基本操作 |g,99YIv>
1、java数据库操作基本流程 OT{cP3;0*o
2、几个常用的重要技巧: {ZIEIXWb2
可滚动、更新的记录集 >#~>!cv6D
批量更新 YwnYTt
事务处理 oZwu`~h Y
hWD%_"yhd
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 -b$m<\0*
1、取得数据库连接 4(D/~OG-6
1)用DriverManager取数据库连接 rK} =<R
例子 3P2x%G p
String className,url,uid,pwd; C
5
xsh
className = "oracle.jdbc.driver.OracleDriver"; d !=AS
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ?3=y]Vb+
uid = "system"; tqXr6+!Q
pwd = "manager"; ^R7|x+
Class.forName(className); ^9fY%98
Connection cn = DriverManager.getConnection(url,uid,pwd); %v)O!HC}
2)用jndi(java的命名和目录服务)方式 h 1REL^!c
例子 OH/!Ky\@
String jndi = "jdbc/db"; 6Mh"{N7
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); #Q'j^y7=z
DataSource ds = (DataSource) ctx.lookup(jndi); V18A|]k
Connection cn = ds.getConnection(); ^LAnR>mz^r
多用于jsp中 &Xh_`*]ox
2、执行sql语句 :^H2D=z@
1)用Statement来执行sql语句 N/6!|F
String sql; ^Cy=L]
Statement sm = cn.createStatement(); s@D/.X
sm.executeQuery(sql); // 执行数据查询语句(select) uyDPWnYk
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); @P@{%I
2)用PreparedStatement来执行sql语句 5/YGu=,
String sql; ^i8"eF
sql = "insert into user (id,name) values (?,?)"; u%sfHGrH
PreparedStatement ps = cn.prepareStatement(sql); hh7unHt-
ps.setInt(1,xxx); {j[a'Gb
ps.setString(2,xxx); JBk >|q"
... ^aR^M\38
ResultSet rs = ps.executeQuery(); // 查询 []b=
xRJM
int c = ps.executeUpdate(); // 更新 45A|KaVpg
p!>DA?vF
3、处理执行结果 /^hc8X
查询语句,返回记录集ResultSet Aa4 DJ
更新语句,返回数字,表示该更新影响的记录数 r&3EM[*Iw
ResultSet的方法 %fMFcL#h
1、next(),将游标往后移动一行,如果成功返回true;否则返回false R1vuf*A5,
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 *%CDQx0}
&t:~e" 5<
4、释放连接 g1v=a
cn.close(); $|m'~AmI
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection u5N&W n{
H/}W_ h^^
可滚动、更新的记录集 *aW:Z6N
1、创建可滚动、更新的Statement QWwdtk
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); )|wC 1J!L
该Statement取得的ResultSet就是可滚动的 COA*Q
2、创建PreparedStatement时指定参数 Qv6-,6<
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); P:%r3F
ResultSet.absolute(9000); "</A)y&
批量更新 T^Ol=QCu
1、Statement #
11<=3Yj
Statement sm = cn.createStatement(); t?wVh0gT
sm.addBatch(sql1); T~8kKw
sm.addBatch(sql2); s"5wnp6pW
... @%BsQm
sm.executeBatch() 4^T_" W}
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 P,@/ap7J
2、PreparedStatement ~J HEr48
PreparedStatement ps = cn.preparedStatement(sql); ZRj/lQ2D
{ ^cCNQS}r
ps.setXXX(1,xxx); S$ n?
... x%W%
ps.addBatch(); X`28?
} Yk0/f|>O
ps.executeBatch(); 4*'ZabDD
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 J,:Wv`N:9~
4s6,`-
事务的处理 hc*t Q2
1、关闭Connection的自动提交 ?Ta<.j
cn.setAutoCommit(false); I%l2_hs0V
2、执行一系列sql语句 x>tsI}C
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close @%jY
Statement sm ; YI>9C 76L
sm = cn.createStatement(insert into user...); U".5x~UC
sm.executeUpdate(); W`uq,r0Xsy
sm.close(); ;FJFr*PM
sm = cn.createStatement("insert into corp...); [>KnMi=o)
sm.executeUpdate(); CbwQbJ/v7
sm.close(); Pk>S;KT.
3、提交 i0F6eqe=J
cn.commit(); Qs ysy
4、如果发生异常,那么回滚 j'`-3<k
cn.rollback();