java 数据库基本操作 j4IVIj@$`
1、java数据库操作基本流程 {VAih-y
2、几个常用的重要技巧: p{Q6g>?[
可滚动、更新的记录集 k o@ej^
批量更新 }StzhV{GS
事务处理 ?I?G+(bq
>W> rhxU
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ?L }>9$"
1、取得数据库连接 _*~F1% d
1)用DriverManager取数据库连接 JX0M3|I=
例子 SWrTM
String className,url,uid,pwd; S#]]h/
className = "oracle.jdbc.driver.OracleDriver"; t2,II\Kl
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; +0Q
uid = "system"; +JErc)%
pwd = "manager"; 58Ibje
Class.forName(className); dBI-y6R
Connection cn = DriverManager.getConnection(url,uid,pwd); }T[@G6#
2)用jndi(java的命名和目录服务)方式 7$<pdayd
例子 3l=q@72
String jndi = "jdbc/db"; 6La[( )
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); &%fcGNzJQ
DataSource ds = (DataSource) ctx.lookup(jndi); |5vcT,A
Connection cn = ds.getConnection(); U =J5lo
多用于jsp中 z)T-<zWO;
2、执行sql语句 yx8G9SO?
1)用Statement来执行sql语句 fAJyD`]Z
String sql; Q# hRnM
Statement sm = cn.createStatement(); 1>e30Ri,g
sm.executeQuery(sql); // 执行数据查询语句(select) ;
$rQ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); /<-PW9X?
2)用PreparedStatement来执行sql语句 O: :FB.k
String sql; 3#t9pI4
sql = "insert into user (id,name) values (?,?)"; |!(8c>]Bo
PreparedStatement ps = cn.prepareStatement(sql); k1,k 9BK
ps.setInt(1,xxx); <PSz`)SN
ps.setString(2,xxx); 9(]_so24,
... v:SHaUS
ResultSet rs = ps.executeQuery(); // 查询 w"0$cL3
int c = ps.executeUpdate(); // 更新 bkJ bnW=
z<eu=OD4t
3、处理执行结果 tz]0F5
查询语句,返回记录集ResultSet ~k34#j:J65
更新语句,返回数字,表示该更新影响的记录数 5x@ U<
ResultSet的方法 eY3:Nl^
1、next(),将游标往后移动一行,如果成功返回true;否则返回false |va@&;#wf
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Z`*V9
)FwOg;=3M"
4、释放连接 "22./vWV|i
cn.close(); vGyQ306
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Q%O9DCi
_ %mm
可滚动、更新的记录集 DAq
H
1、创建可滚动、更新的Statement #w L(<nE
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ;d<XcpK}
该Statement取得的ResultSet就是可滚动的 q tOuA
2、创建PreparedStatement时指定参数 %# uw8V
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); k?h{6Qd
ResultSet.absolute(9000); >IQ&*Bb
批量更新 :(enaHn#~
1、Statement ^RnQX#+
Statement sm = cn.createStatement(); F-@yH
sm.addBatch(sql1); 2>"{El|PbN
sm.addBatch(sql2); X:Y1g)|K
... %enJ[a%Qg
sm.executeBatch() ~^.,Ftkb@7
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 7eq.UyUxs
2、PreparedStatement :C;fEJN
PreparedStatement ps = cn.preparedStatement(sql); t>]W+Lx#
{ NH/jkt&F[
ps.setXXX(1,xxx); "^t7]=q
... RCqL~7C+ k
ps.addBatch(); ' q9Ejig
} toF6 Z
ps.executeBatch(); e77s?WxbK
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 rREev
aJm5`az)
事务的处理 .~'q
yD2V
1、关闭Connection的自动提交 @lB1t=
D
cn.setAutoCommit(false); /_fZ2$/
2、执行一系列sql语句 w}}+8mk[
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close .f!'>_
Statement sm ; M-Nn \h$,
sm = cn.createStatement(insert into user...); m";8 nm
sm.executeUpdate(); /XRgsF
sm.close(); >y+j!)\
sm = cn.createStatement("insert into corp...); Kc9)Lzu+
sm.executeUpdate(); -GgV&%'a
sm.close(); -NG9?sI\U
3、提交 TuMZHB7h;
cn.commit(); ,^xsdqpe
4、如果发生异常,那么回滚 UIQ=b;J9
cn.rollback();