java 数据库基本操作 "7-}#_!g
1、java数据库操作基本流程 |QZ
E
2、几个常用的重要技巧: #+<YFm\i
可滚动、更新的记录集 x'-gvbj!
批量更新 ;~1xhpTk
事务处理 w.rcYywI
Swf%WuDj
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 (<.\v@7HC
1、取得数据库连接 papMC"<g$
1)用DriverManager取数据库连接 7Tp+]"bL
例子 fNda&
String className,url,uid,pwd; 3K||(
className = "oracle.jdbc.driver.OracleDriver"; %V1j M
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; N~b0 b;e
uid = "system"; {.U:Ce
pwd = "manager"; |"}7)[BW}
Class.forName(className); 8@doKOA~T
Connection cn = DriverManager.getConnection(url,uid,pwd); I@qGDKz;
2)用jndi(java的命名和目录服务)方式 jp"Q[gR##
例子 M:.+^.h
String jndi = "jdbc/db"; ]*MVC/R,
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); %O!xrA{
DataSource ds = (DataSource) ctx.lookup(jndi); F7<u1Rx]
Connection cn = ds.getConnection(); 3;jxIo$,
多用于jsp中 83]m/Iz
2、执行sql语句 ]D~Ibv{Y
1)用Statement来执行sql语句 K/(QR_@?
String sql; @[v,q_^8
Statement sm = cn.createStatement(); R:l &2
sm.executeQuery(sql); // 执行数据查询语句(select) X!{K`~DRX
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); |7KWa(V5I
2)用PreparedStatement来执行sql语句 Sz|kXk6&9
String sql; $[Ut])4
~
sql = "insert into user (id,name) values (?,?)"; ZJ+ad,?,
PreparedStatement ps = cn.prepareStatement(sql); o;
6^:
ps.setInt(1,xxx); 4C?4M;
ps.setString(2,xxx); oP
T)vN?
... ?x 0gI
ResultSet rs = ps.executeQuery(); // 查询 $v_&jE
int c = ps.executeUpdate(); // 更新 n2_;:=
#%%!r$UL
3、处理执行结果 ePq (.o
查询语句,返回记录集ResultSet t>a D;|Y
更新语句,返回数字,表示该更新影响的记录数 HNc/p4z
ResultSet的方法 LB({,0mcX
1、next(),将游标往后移动一行,如果成功返回true;否则返回false .*n*eeD,
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 2rC&
e ?7NW
4、释放连接 :,yC\,H^
cn.close(); >\~Er@
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection "*`!.9pt
2z$!}
可滚动、更新的记录集 hwvi tD!0
1、创建可滚动、更新的Statement }(DH_0
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 1=T;6 8B
该Statement取得的ResultSet就是可滚动的 @*|UyK.
2、创建PreparedStatement时指定参数 ]a.^F
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ;"#y HP`
ResultSet.absolute(9000); KT 6ppo
批量更新 #=0 BjW*
1、Statement bLGC
Statement sm = cn.createStatement(); 1he5Zevm}
sm.addBatch(sql1); $!$If(
7
sm.addBatch(sql2); o7Z8O,;
... 2yFT` 5+H4
sm.executeBatch() _E8Cvaob
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 :.=j)ljTx
2、PreparedStatement eU`O=uE
PreparedStatement ps = cn.preparedStatement(sql); ^7i7yM}6(
{ +Q"~2_q5/;
ps.setXXX(1,xxx); $;$vcV9*
... jAcKSx$}y"
ps.addBatch(); Q`.q,T8I
} r|]YS6
ps.executeBatch(); WrRY3X
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 BHU$QX
/ece}7M
事务的处理 IG\Cj7{K^
1、关闭Connection的自动提交 VR1[-OE
cn.setAutoCommit(false); z6;hFcO
2、执行一系列sql语句 oC}
u
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close q7_Ttjn-DV
Statement sm ; /s+IstW
sm = cn.createStatement(insert into user...); /:{4,aX2
sm.executeUpdate(); RL\?i~'KH
sm.close(); `:EhYj.
sm = cn.createStatement("insert into corp...); G,B4=[Y
sm.executeUpdate(); ;!=i|"PG
sm.close(); X@:Y. /
3、提交 ?*xH
HI/
cn.commit(); ypGt6t(;
4、如果发生异常,那么回滚 oP4+:r)LKD
cn.rollback();