java 数据库基本操作 vPR1
TMi>
1、java数据库操作基本流程 nUQcoSY#
2、几个常用的重要技巧: 6.6~w\fR8
可滚动、更新的记录集 si/F\NDT
批量更新 zpZlA_
事务处理 WnLgpt2G
\u2K?wC
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 vYL{5,t {1
1、取得数据库连接 @~ N:F~
1)用DriverManager取数据库连接 4(R O1VWsb
例子 a)(j68c
String className,url,uid,pwd; +N5G4t#.
className = "oracle.jdbc.driver.OracleDriver";
UQ$dO2^
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; m1gJ"k6
`j
uid = "system"; :)c >5
pwd = "manager"; YdV5\!
Class.forName(className); j^1T3 +
Connection cn = DriverManager.getConnection(url,uid,pwd); [NFg9y;{h
2)用jndi(java的命名和目录服务)方式 ;} gvBI2e
例子 ""^9WLH4g-
String jndi = "jdbc/db"; $&qB,>5=X
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 1i_~ZzX8
DataSource ds = (DataSource) ctx.lookup(jndi); N$/{f2iC
Connection cn = ds.getConnection(); A%"XN k
多用于jsp中 s Ce7ni
2、执行sql语句 )"WImf:*
1)用Statement来执行sql语句 T5z %X:VD(
String sql; BtBo%t&
Statement sm = cn.createStatement(); "ltvD\
sm.executeQuery(sql); // 执行数据查询语句(select) =oluw|TCe7
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); )"&-vg<
2)用PreparedStatement来执行sql语句 ?p. dc~tZ
String sql; .'lc[iI9)d
sql = "insert into user (id,name) values (?,?)"; Bo`fy/x#
PreparedStatement ps = cn.prepareStatement(sql); lBR6O!sBP
ps.setInt(1,xxx); Jb6rEV>
ps.setString(2,xxx); Wv77ef
... 9K#.0
ResultSet rs = ps.executeQuery(); // 查询 P;VR[d4e/
int c = ps.executeUpdate(); // 更新 j~\\,fl=
)P[B!
3、处理执行结果 T)3#U8sT
查询语句,返回记录集ResultSet MQQiQ 2
更新语句,返回数字,表示该更新影响的记录数 u,PrEmy-
ResultSet的方法 CUnZ}@?d
1、next(),将游标往后移动一行,如果成功返回true;否则返回false H5, {Z
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 =V"ags
L
FHyiIO
4、释放连接 |O+R%'z'<
cn.close(); E5jK}1t4V
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection /Or76kE
y@~.b^?_u
可滚动、更新的记录集 `y;&M8.
1、创建可滚动、更新的Statement z:+Xs!S
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ,T|iA/c
该Statement取得的ResultSet就是可滚动的 oFoG+H"&7\
2、创建PreparedStatement时指定参数 ~NpnRIt
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); csRba;Z[
ResultSet.absolute(9000); 1Lqs>*
批量更新 +O j28vR
1、Statement bTA<AoW9="
Statement sm = cn.createStatement(); 5 f/[HO)
sm.addBatch(sql1); 2}[rc%tV:?
sm.addBatch(sql2); @`%.\_
... /P^@dL
sm.executeBatch() *%B%BJnX
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 "y
"C#:5
2、PreparedStatement ]K XknEaxl
PreparedStatement ps = cn.preparedStatement(sql); M[<O]p6
{ 6@H&S
ps.setXXX(1,xxx); d>@{!c-
... b2U[W#
ps.addBatch(); TCmWn$LeE
} BAzc'x&<
ps.executeBatch(); m"86O:S#d
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 9tl Fbu
LFen!FnM
事务的处理 d`({z]W;
1、关闭Connection的自动提交 ut3jIZ1]
cn.setAutoCommit(false); D@DK9?#
2、执行一系列sql语句 @m6pAo4P
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close (>WV)
Statement sm ; p7.@ez ;
sm = cn.createStatement(insert into user...); qaw5<
sm.executeUpdate(); G?3S_3J2
sm.close(); u:g(x+u4:
sm = cn.createStatement("insert into corp...); "Hgn2o.;5
sm.executeUpdate(); "q#(}1Zd
sm.close(); Bfi9%:eG
3、提交 KC }B\~ +
cn.commit(); S:Yo9~
4、如果发生异常,那么回滚 BOt\"N
cn.rollback();