java 数据库基本操作 4^OY
C
1、java数据库操作基本流程 ;Nj7qt
2、几个常用的重要技巧:
4J([6<
可滚动、更新的记录集 pK'V9fD5J
批量更新 3+fp2
事务处理 xDoC(
} c}_<#I
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ^vO+(p
1、取得数据库连接 "s_lP&nq
1)用DriverManager取数据库连接 EeRX+BM,
例子 #PQB(=299P
String className,url,uid,pwd; t9:0TBt-[
className = "oracle.jdbc.driver.OracleDriver"; 6Yxh9*N~]
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; -rli(RR)|
uid = "system"; zY!j:FT1HY
pwd = "manager"; tX %5BTv
Class.forName(className); =k0_eX0
Connection cn = DriverManager.getConnection(url,uid,pwd); K]"#C
2)用jndi(java的命名和目录服务)方式 /j|G(vt5
例子 o,8TDg
String jndi = "jdbc/db"; ,lA s
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 6U,O*WJ%e
DataSource ds = (DataSource) ctx.lookup(jndi); ndz]cx
Connection cn = ds.getConnection(); %pd ,%pg
多用于jsp中 +sUFv)!4
2、执行sql语句 C-MjJ6D<
1)用Statement来执行sql语句 4X
|(5q?
String sql; z] ?N+NHOA
Statement sm = cn.createStatement(); %H&@^Tt a
sm.executeQuery(sql); // 执行数据查询语句(select) mFaZio0GK
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); (/j/>9iro
2)用PreparedStatement来执行sql语句 .1Al<OLL
String sql; m(#LhlX
sql = "insert into user (id,name) values (?,?)"; 5Qn
'
PreparedStatement ps = cn.prepareStatement(sql); f;gw"onx8F
ps.setInt(1,xxx); ?Yk.$90
ps.setString(2,xxx); u5: q$P
... $m1z-i;/
ResultSet rs = ps.executeQuery(); // 查询 (#RHB`h5
int c = ps.executeUpdate(); // 更新 8UyMVY
\GZM&Zd
3、处理执行结果 K&70{r
查询语句,返回记录集ResultSet 0rDh}<upjk
更新语句,返回数字,表示该更新影响的记录数 % <*g!y `
ResultSet的方法 @u]rWVy;\[
1、next(),将游标往后移动一行,如果成功返回true;否则返回false kDN:ep{/
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 DYxCQ
D
_EMwm&!
4、释放连接 X4E%2-m@'
cn.close(); IS
2^g>T#1
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 48qV>Gwf
A?%H=>v$
可滚动、更新的记录集 lWc:$qnR-K
1、创建可滚动、更新的Statement /.M N
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); K3;nY}\>
该Statement取得的ResultSet就是可滚动的 aV?@s4
2、创建PreparedStatement时指定参数 f[a}aZ9)
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ,J>5:ht(6
ResultSet.absolute(9000); J)~L
批量更新 <55g3>X
1、Statement x+x40!+\
Statement sm = cn.createStatement(); pd7NF-KD
sm.addBatch(sql1); -[!P!d=
sm.addBatch(sql2); 7=WT69,&
... 7~aM=8r
sm.executeBatch() ]<pjXVRt"
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 0F|AA"mMT
2、PreparedStatement m{uxIza
PreparedStatement ps = cn.preparedStatement(sql); Hp|_6hO 2
{ Q&g^c2
ps.setXXX(1,xxx); $lIz{ySJv
... "a1n_>#Fb
ps.addBatch(); ul2")HL];
} Nkl_Ho,
ps.executeBatch(); kg3EY<4i
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 !l 1fIc
_/!y)&4"
事务的处理 ;@Z#b8aM}
1、关闭Connection的自动提交 Boz@bl mCB
cn.setAutoCommit(false); A"D,Kg
S
2、执行一系列sql语句 >U*T0FL7
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Upd3-2kr&J
Statement sm ; (%xwl
sm = cn.createStatement(insert into user...); %r6y
;vAf
sm.executeUpdate(); kO{s^_qR^c
sm.close(); C
#6dC0
sm = cn.createStatement("insert into corp...);
1/-43B
sm.executeUpdate(); ICkp$u^
sm.close(); a@* S+3
3、提交 nwaxz>;
cn.commit(); GBFtr
4、如果发生异常,那么回滚 x{c/$+Z[
cn.rollback();