java 数据库基本操作 =gv/9ce)3
1、java数据库操作基本流程 r[4F?W
2、几个常用的重要技巧: `1v!sSR0R
可滚动、更新的记录集 $aI MQ[(
批量更新 \gQ+@O&+
事务处理 _89G2)U=C
fQA)r
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 64j 4P 7
1、取得数据库连接 ovo I~k'
1)用DriverManager取数据库连接 eii7pbc
例子 m%(JRh
String className,url,uid,pwd; `A{~}6jw
className = "oracle.jdbc.driver.OracleDriver"; ;p"XCLHl
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 9i)mv/i
uid = "system"; <ORz`^27o
pwd = "manager"; |]3);^0
Class.forName(className); -6 Si
Connection cn = DriverManager.getConnection(url,uid,pwd); j/IZm)\
2)用jndi(java的命名和目录服务)方式 %~VIxY|d
例子 j1CD;9i)%
String jndi = "jdbc/db"; {OoNhN9
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); toZI.cSg4
DataSource ds = (DataSource) ctx.lookup(jndi); n#'',4f
Connection cn = ds.getConnection(); R[-:-8
多用于jsp中 )Nd:PnA
2、执行sql语句 \4X{\p<
1)用Statement来执行sql语句 TB[2!ZW
String sql; ?vNS!rY2&
Statement sm = cn.createStatement(); s H[34gCh;
sm.executeQuery(sql); // 执行数据查询语句(select) ~{!!=@6
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); M#2U'jy
2)用PreparedStatement来执行sql语句 uM<+2S
String sql; jCv+m7Z
sql = "insert into user (id,name) values (?,?)"; VQx-gm8}!
PreparedStatement ps = cn.prepareStatement(sql); %4^/.) Q
ps.setInt(1,xxx); >
V}NG
ps.setString(2,xxx); pr89zkYw
... '^Np<
ResultSet rs = ps.executeQuery(); // 查询 a~EEow;A
int c = ps.executeUpdate(); // 更新 VQ3&
o=2`N2AL
3、处理执行结果 HUI!IOh
查询语句,返回记录集ResultSet ZKTBjOa]*
更新语句,返回数字,表示该更新影响的记录数 $iJ
#%&D
ResultSet的方法 r+Cha%&D
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 7+-}8&syu
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 sb5kexGxkc
[B<{3*R_
4、释放连接 XArLL5_L
cn.close(); yYtki
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 7NqV*
O]!DNN
可滚动、更新的记录集 ;BvWU\!
1、创建可滚动、更新的Statement .lS6KBf@
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ]qRz!D%@^
该Statement取得的ResultSet就是可滚动的 NFPkK?+
2、创建PreparedStatement时指定参数 9K(b Z{
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); qT%E[qDS
ResultSet.absolute(9000); 2yc\A3ft#
批量更新 C@W0fz
1、Statement |@|D''u>6
Statement sm = cn.createStatement(); <[~M|OL9q,
sm.addBatch(sql1); q=(wK&
sm.addBatch(sql2); h {btT
... A
76yz`D
sm.executeBatch() ~vS.D r
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 @@&;gWr;
2、PreparedStatement 2O>iAzc
PreparedStatement ps = cn.preparedStatement(sql); $5O&[/L
{ 8t; nU;E*
ps.setXXX(1,xxx); h2K
... ~8E
rl3=5{
ps.addBatch(); #2iA-5
} ;kA2"c]m
ps.executeBatch(); 8a1{x(\z.
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 .kV/0!q?
cl5 :|)
事务的处理 C5FtJquGN)
1、关闭Connection的自动提交 )VrHP9fu
cn.setAutoCommit(false); r v>6k:(
2、执行一系列sql语句 wvY$s;
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close XZJx3!~fm
Statement sm ; ~C3-E %h@Z
sm = cn.createStatement(insert into user...); wu3ZSLY
sm.executeUpdate(); {fs(+
0ei
sm.close(); `. Z".
sm = cn.createStatement("insert into corp...); -#h
\8Xl
sm.executeUpdate(); O,PHAwVG%L
sm.close(); :mL.Y em*'
3、提交 r\?*?sL
cn.commit(); EhoR.
4、如果发生异常,那么回滚 + `xp+Q
cn.rollback();