java 数据库基本操作 nJC/yS|
1、java数据库操作基本流程 jbZ%Y0km%
2、几个常用的重要技巧: xy;u"JY*
可滚动、更新的记录集 $q%r}Cdg
批量更新 ^}8qPBz
事务处理 ;n`SF~CU
Ti:PKpc
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 RzgA;ZC'
1、取得数据库连接 W:VRLT>w>
1)用DriverManager取数据库连接 3g
ep_aC
例子 ,aq0Q<}~lc
String className,url,uid,pwd; 3V2dN)\
className = "oracle.jdbc.driver.OracleDriver"; D;nm~O%
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Okxuhzn>"
uid = "system"; F5s Pd
pwd = "manager"; X2\1OWR0
Class.forName(className); j%%& G$Tfu
Connection cn = DriverManager.getConnection(url,uid,pwd); I5Vp%mCY
2)用jndi(java的命名和目录服务)方式 T8'm{[C
例子 WOkAma-
String jndi = "jdbc/db"; Pk)>@F<
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); QPr29
DataSource ds = (DataSource) ctx.lookup(jndi); v{tw ;Z#
Connection cn = ds.getConnection(); ~*NG~Kn"s
多用于jsp中 #s%_ L
2、执行sql语句 &pCa{p
1)用Statement来执行sql语句 ;@/^hk{A
String sql; 9+S$,|9
Statement sm = cn.createStatement(); [C@|qAh
sm.executeQuery(sql); // 执行数据查询语句(select) ! W2dMD/
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); A~0eJaq+
2)用PreparedStatement来执行sql语句 lFJDdf2:$C
String sql; 'ip2| UG
sql = "insert into user (id,name) values (?,?)"; (+aU ,EQ
PreparedStatement ps = cn.prepareStatement(sql); P]cC2L@Vbi
ps.setInt(1,xxx); bSJ@
5qS
ps.setString(2,xxx); '/O >#1
... ^W#161&
ResultSet rs = ps.executeQuery(); // 查询 Z /G`8|A
int c = ps.executeUpdate(); // 更新 8=kIN-l_
WtS5i7:<Y
3、处理执行结果 ;8Qx~:c
查询语句,返回记录集ResultSet |[./jg"
更新语句,返回数字,表示该更新影响的记录数 ; ,9:1.L
ResultSet的方法 XSOSy2:
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ,9~=yC
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 e2F{}N
b';oFUU>Q
4、释放连接 ~$PY6s
cn.close(); 8@rddk
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Ar{7H)V:
Rq@M~;p
可滚动、更新的记录集 (Y!{ UNq5
1、创建可滚动、更新的Statement +YD_ L
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); G1tua"Px
该Statement取得的ResultSet就是可滚动的 4>R)2g
2、创建PreparedStatement时指定参数 RwyX,|
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ^L?2y/
ResultSet.absolute(9000); Lqa|9|!
批量更新 <Dk6o`7^N
1、Statement to,\sc
Statement sm = cn.createStatement(); 0^('hS&
sm.addBatch(sql1); omu)s
'8
sm.addBatch(sql2); xu<oQBt
... \0fS;Q^{j
sm.executeBatch() 15J t
@{<r
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 vCX
54
2、PreparedStatement 0]k-0#JM
PreparedStatement ps = cn.preparedStatement(sql); 4"^v]&I
{ }j`#s
ps.setXXX(1,xxx); _<^mi!Y
... JfLoGl;pm
ps.addBatch(); T;C0t9Yew
} 'f_[(o+n
ps.executeBatch(); 8{4SaT.-Rm
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 IoKN.#;^
_jWGwO
事务的处理 g>*P}r~;^b
1、关闭Connection的自动提交
ihp>cl?
cn.setAutoCommit(false); /<
-+*79G
2、执行一系列sql语句 M!4}B
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close .o(S60iH!(
Statement sm ; O&g$dK!Rad
sm = cn.createStatement(insert into user...); CbW>yr
sm.executeUpdate(); uz;zmK
sm.close(); sI<PYi={-6
sm = cn.createStatement("insert into corp...); 1fMl8[!JLu
sm.executeUpdate(); XMlcY;W
sm.close(); b|Sjh;
3、提交 ?v,4seRuz
cn.commit(); 9.>he+
4、如果发生异常,那么回滚 4Ai#$SHLm
cn.rollback();