java 数据库基本操作 kZ5;Fe\*
1、java数据库操作基本流程 fj"1TtPq#
2、几个常用的重要技巧: c`,'[Q5(O
可滚动、更新的记录集 7C / ^Gw
批量更新 yrvV<}
事务处理 AcHr X=O
aoqG*qh}b
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 [Z]%jABR
1、取得数据库连接 \0j-p
1)用DriverManager取数据库连接 2Sgv
例子 Oz{FM6
String className,url,uid,pwd; /dI8o
className = "oracle.jdbc.driver.OracleDriver"; qzk!'J3*r<
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; "~2SHM@q
uid = "system"; ?COLjk
pwd = "manager"; zy'e|92aO
Class.forName(className); &s^t~>Gpr
Connection cn = DriverManager.getConnection(url,uid,pwd); FHbyL\Q
2)用jndi(java的命名和目录服务)方式 t4d^DZDh!
例子 OV2/?
String jndi = "jdbc/db"; +,xluwv$ 9
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); xyzYY}PS
DataSource ds = (DataSource) ctx.lookup(jndi); :;Xh`br
Connection cn = ds.getConnection(); \JLea$TM:
多用于jsp中 _9f7@@b
2、执行sql语句 yOTC>?p%
1)用Statement来执行sql语句 TGDrTyI?y
String sql; Yj"{aFK#u@
Statement sm = cn.createStatement(); 0?,<7}"<X
sm.executeQuery(sql); // 执行数据查询语句(select) S\M+*:7
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); >BWe"{ ;
2)用PreparedStatement来执行sql语句 n:"0mWnL$y
String sql; !-HJ%(5:F
sql = "insert into user (id,name) values (?,?)";
i"`N5
PreparedStatement ps = cn.prepareStatement(sql); :lU#Dm]
ps.setInt(1,xxx); "W^+NeLc
ps.setString(2,xxx); gT_tR_g
... ;UpdkY
1
ResultSet rs = ps.executeQuery(); // 查询 u u$Jwn!S
int c = ps.executeUpdate(); // 更新 Yr)<1.K4,M
DFMf"_p
3、处理执行结果
%w#z
查询语句,返回记录集ResultSet H-iCaXT
更新语句,返回数字,表示该更新影响的记录数 {zIcEN$ ~
ResultSet的方法 ##6u
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 7 I/a
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 )">uI\bi
#;0F-pt
4、释放连接 z!G?T(SpA
cn.close(); XwZR
Kh\>=
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ,K15KN.'
a)S{9q}%
可滚动、更新的记录集 <5!)5+G
1、创建可滚动、更新的Statement \_)[FC@
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Hkrh d
该Statement取得的ResultSet就是可滚动的 XUVBD;"f!
2、创建PreparedStatement时指定参数 =d BK,/
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY);
CH$K_\
ResultSet.absolute(9000); <:>[24LJ{
批量更新 zDf96eK
1、Statement zI= 9
Statement sm = cn.createStatement(); S&F[\4w5]
sm.addBatch(sql1); |R;`
sm.addBatch(sql2); m1D,#=C,_
... 8b"vXNB.f
sm.executeBatch() 9K>~9Za
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ,7Dm p7
2、PreparedStatement 5cj&D74o
PreparedStatement ps = cn.preparedStatement(sql); l0r^LK$
{ B{K_?ae!
ps.setXXX(1,xxx); g;~$xXn
... fQxlYD'peb
ps.addBatch(); Z|B`n
SzH
} Gs/G_E(T
ps.executeBatch(); ,(B/R8ZF~
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 emHaZhh
p
~pl|
事务的处理 "^)$MAZ
1、关闭Connection的自动提交 /Yj; '\3
cn.setAutoCommit(false); pS "A{k)i
2、执行一系列sql语句 JLGC'mbJ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Ip0`R+8
Statement sm ; "
1h~P,
sm = cn.createStatement(insert into user...); 0HI0/Tvu$<
sm.executeUpdate(); z
s\N)LyM
sm.close(); FwV5{-(
sm = cn.createStatement("insert into corp...); I@kMM12>c
sm.executeUpdate(); 8iPA^b|sz{
sm.close(); z
$iI
3、提交 79 \SbB
cn.commit(); ]P2Wa
4、如果发生异常,那么回滚 s(:N>K5*
cn.rollback();