java 数据库基本操作 ,m8mh)K?0>
1、java数据库操作基本流程 L5'?.9]
2、几个常用的重要技巧: THARr#1b};
可滚动、更新的记录集 O?O=]s
u
批量更新 mVFo2^%v
事务处理 BOWBD@y
<_c8F!K)T
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 bObsj]
1、取得数据库连接 Nz}PcWF/
1)用DriverManager取数据库连接 d^f rKPB
例子 *%Fu/
String className,url,uid,pwd; 5+Ao.3Xn
className = "oracle.jdbc.driver.OracleDriver"; txvo7?Y*4
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Ra"hdxH
uid = "system"; >7PNl\=gG
pwd = "manager"; u-_1)'
Class.forName(className); .)SR3?
Connection cn = DriverManager.getConnection(url,uid,pwd); f!#+cM
2)用jndi(java的命名和目录服务)方式 }*C*!?pcd
例子 3I(;c ,S
String jndi = "jdbc/db"; [2Zl
'+
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); skBD2V4
DataSource ds = (DataSource) ctx.lookup(jndi); 7WwE] ^M
Connection cn = ds.getConnection(); b;%t*?t
多用于jsp中 ?(n v_O
2、执行sql语句 Xdwpn+7s
1)用Statement来执行sql语句 ,ga6
String sql; |-;VnC&UY
Statement sm = cn.createStatement(); <uxLG;R
sm.executeQuery(sql); // 执行数据查询语句(select) On54!m
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ({Pjz;xM
2)用PreparedStatement来执行sql语句 P8Wv&5A
String sql; Bhv$
sql = "insert into user (id,name) values (?,?)"; ^,#my<{
PreparedStatement ps = cn.prepareStatement(sql); !JyY&D~`
ps.setInt(1,xxx); ]jYFrOMy4S
ps.setString(2,xxx); tJ
2GSZ`
... .`Q^8|$-K
ResultSet rs = ps.executeQuery(); // 查询 tbWfm5$
int c = ps.executeUpdate(); // 更新 wJNm}Wf
!-.GfI:q
3、处理执行结果 |-)8=QDz)r
查询语句,返回记录集ResultSet #=VYq4B=
更新语句,返回数字,表示该更新影响的记录数 Nke!!A}\|
ResultSet的方法 b+|3nc!
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 2:_6nWl
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 dt^h9I2O
fvcS=nRQv
4、释放连接 ?^M,Mt
cn.close(); 7YR|6{@
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection y$_@C8?H
R|v'+bv
可滚动、更新的记录集 H]pI$t3~
1、创建可滚动、更新的Statement FJ-H
;
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); XbqMWQN*
该Statement取得的ResultSet就是可滚动的 ]8}51y8
2、创建PreparedStatement时指定参数 o<G#%9j
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); "VZXi_P
ResultSet.absolute(9000); u*TC8!n
批量更新 B\v+C!/f|
1、Statement
B6Eu."T
Statement sm = cn.createStatement(); 993f6
sm.addBatch(sql1); 8;V9%h`P>
sm.addBatch(sql2); tq}45{FH3
... FY ms]bv
sm.executeBatch() I# &r5Q
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ZZ7qSyBs?
2、PreparedStatement s2#Ia>5!
PreparedStatement ps = cn.preparedStatement(sql); i'7+
?YL
{ |1RVm?~i
ps.setXXX(1,xxx); LP=j/qf|
... T!8^R|!a6
ps.addBatch(); ](A2,F
9(U
} @p
L9a1PJv
ps.executeBatch(); >WIc"y.
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 m3gv %h
'gvR?[!t
事务的处理 X!p`|i
1、关闭Connection的自动提交 ocFk#FW
cn.setAutoCommit(false); Sk E <V0
2、执行一系列sql语句 ;Mup@)!j
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close -cM1]soT
Statement sm ; b:D92pH
sm = cn.createStatement(insert into user...); 8.[F3Tk=
sm.executeUpdate(); Fq@o_bI
sm.close(); B*,)@h
sm = cn.createStatement("insert into corp...); Y.\x.Hg
sm.executeUpdate(); $[A\i<#
sm.close(); pYx,*kG:HW
3、提交 D]]wJQU2
cn.commit(); viG,z4Zf
4、如果发生异常,那么回滚 )63
$,y-;$
cn.rollback();