java 数据库基本操作 &6@#W]_
1、java数据库操作基本流程 TOH+JL8L
2、几个常用的重要技巧: JS!`eO/8
可滚动、更新的记录集 -"CXBKHb
批量更新 E,}(jAq7
事务处理 %a=^T?8
it.'.aK4
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 *[|a$W
1、取得数据库连接 =C(((T.
1)用DriverManager取数据库连接 BO%aCK&
例子 Y& p
~8
String className,url,uid,pwd; Hob n{E
className = "oracle.jdbc.driver.OracleDriver"; :z^,>So :
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 1sIPhOIys
uid = "system"; }m -A #4.
pwd = "manager"; Lz/{
q6>
Class.forName(className); p Lwtm@
Connection cn = DriverManager.getConnection(url,uid,pwd); olxnQYFo
2)用jndi(java的命名和目录服务)方式 FoW|BGA~
例子 xbNL <3"a
String jndi = "jdbc/db"; <*3#nA-O>i
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); '},
8x?
DataSource ds = (DataSource) ctx.lookup(jndi);
PKg>|]Rf.
Connection cn = ds.getConnection(); PNp-/1Cx
多用于jsp中 VkD}gJY
2、执行sql语句 /J5)_>R:
1)用Statement来执行sql语句 ]kir@NMv>
String sql; >Tp`Kri
Statement sm = cn.createStatement(); 2[X\*"MQ2
sm.executeQuery(sql); // 执行数据查询语句(select) G_E \p%L>]
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); "nA~/t=
2)用PreparedStatement来执行sql语句 3%(BZ23
String sql; ?ZAynZF|#
sql = "insert into user (id,name) values (?,?)"; 4XNdsb
PreparedStatement ps = cn.prepareStatement(sql); CQns:.`$`
ps.setInt(1,xxx); T( z/Jm3
ps.setString(2,xxx); G6XDPr:}
... Vpe\Okt:
ResultSet rs = ps.executeQuery(); // 查询
'E)g )@^
int c = ps.executeUpdate(); // 更新 ec&K}+p@
l
Zz%W8"
3、处理执行结果 0..]c-V(G
查询语句,返回记录集ResultSet 3Hi[Y[O`%P
更新语句,返回数字,表示该更新影响的记录数 oIv\Xdc8 1
ResultSet的方法 .FeVbZW
1、next(),将游标往后移动一行,如果成功返回true;否则返回false z5g4+y,
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 N
Wf IRL
RQ;}+S
4、释放连接 H$k2S5,,z
cn.close(); 8zrLl:{
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ?BnX<dbi&
uwc@~=;
可滚动、更新的记录集 [;pL15-}4
1、创建可滚动、更新的Statement I\~sE Jwj
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); K#kMz#B+i
该Statement取得的ResultSet就是可滚动的 .H}#,pQ}l
2、创建PreparedStatement时指定参数 zF@/8#
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); uhvn1"
ResultSet.absolute(9000); o#QS: '|
批量更新 `&jG8lHa
1、Statement nC5]IYL|
Statement sm = cn.createStatement(); VLcwBdo
sm.addBatch(sql1); ,DD}o
sm.addBatch(sql2); 6=p!`DOd
... h'"~t#r
sm.executeBatch() hH~GH'dnaE
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 2v`Q;%7O
2、PreparedStatement s-Qq#T
PreparedStatement ps = cn.preparedStatement(sql); kLe{3>}j
{ 6^sH3=#
ps.setXXX(1,xxx); i'3)5
... b6d}<b9#
ps.addBatch(); 7qLB 9r
} M-/2{F[
ps.executeBatch(); S#b)RpY
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 NJmyp!8
>^GAfvW
事务的处理 "V<WC"
1、关闭Connection的自动提交
NArr2o2
cn.setAutoCommit(false); xp
F(de
2、执行一系列sql语句 v!j%<H`NI
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close eL1)_M;{
Statement sm ; w^^8*b<
sm = cn.createStatement(insert into user...); }=fls=c/0
sm.executeUpdate(); :U,-v
sm.close(); UG=],\E2
sm = cn.createStatement("insert into corp...); @e2P3K gg
sm.executeUpdate(); jP\5bg-}
sm.close(); jE2EoQi,
3、提交 hg-M>|s7
cn.commit(); 'x u!t'l&
4、如果发生异常,那么回滚 ke2}@|?t
cn.rollback();