java 数据库基本操作 yo_zc<
1、java数据库操作基本流程 g@O?0,+1
2、几个常用的重要技巧: kn$SG
可滚动、更新的记录集 Ot=nKdP}D
批量更新 9:%')M&Q
事务处理 i\
7JQZ
1)}hzA
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 u-.5rH l
1、取得数据库连接 Q>X1 :Zn3
1)用DriverManager取数据库连接 !j #8zN
例子 u*\QVOF
String className,url,uid,pwd; dw}ge,bBic
className = "oracle.jdbc.driver.OracleDriver"; DI-&P3iGx
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; oEZhKVyc.y
uid = "system"; J7WNgl%
u
pwd = "manager"; zvnd@y{[
Class.forName(className); /!5cf;kl*l
Connection cn = DriverManager.getConnection(url,uid,pwd); evE:FiDm(j
2)用jndi(java的命名和目录服务)方式 r;(^]Soz
例子 OJydt; a
String jndi = "jdbc/db";
StNA(+rT
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); &!:mL],
DataSource ds = (DataSource) ctx.lookup(jndi); 0%rE*h9+
Connection cn = ds.getConnection(); wmbG$T%k
多用于jsp中 (@BB@G
2、执行sql语句 4Af7x6a;
1)用Statement来执行sql语句 DcRoW
String sql; }`0=\cKqn
Statement sm = cn.createStatement(); 6L~5qbQ
sm.executeQuery(sql); // 执行数据查询语句(select) S{XO3
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); \qW^AD(it<
2)用PreparedStatement来执行sql语句 T|$tQgY^
String sql; l9%ckC*q
sql = "insert into user (id,name) values (?,?)"; ZZ}HgPZ
PreparedStatement ps = cn.prepareStatement(sql); B|^=2 >8s
ps.setInt(1,xxx); P"Q6 wdm
ps.setString(2,xxx); dZkKAK:v
... +sZY0(|K8
ResultSet rs = ps.executeQuery(); // 查询 FD~uUZTM
int c = ps.executeUpdate(); // 更新 #Wl9[W/4
'g<FL`iP
3、处理执行结果 g("[wqgG
查询语句,返回记录集ResultSet .db:mSrL
更新语句,返回数字,表示该更新影响的记录数 lUnC+w#[
ResultSet的方法 LChwHkRHJI
1、next(),将游标往后移动一行,如果成功返回true;否则返回false =`MQKh,
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 |gk"~D
LDo~
4、释放连接 )ARV>(
cn.close(); FgP{
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection +*qTZIXj
Y,4?>:39J
可滚动、更新的记录集 K.? S,qg
1、创建可滚动、更新的Statement %gqu7}'
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Ql}#mC.>/
该Statement取得的ResultSet就是可滚动的 sx[mbKj<
2、创建PreparedStatement时指定参数 ZI :wJU:f
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); D_z&G)
ResultSet.absolute(9000); |n s9ziTDI
批量更新 Ln h'y`q
1、Statement N4yQ,tG>aa
Statement sm = cn.createStatement(); LmR OG-9
sm.addBatch(sql1); C91'dM
sm.addBatch(sql2); 5NKyF
... k^UrFl
sm.executeBatch() ^D
{v L
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 >I/~)B`jhE
2、PreparedStatement caTKi8
PreparedStatement ps = cn.preparedStatement(sql); ?|<p^:
{ u]3VK
ps.setXXX(1,xxx); i#U_g:~wC
... d\ 7OtM
ps.addBatch(); ` gor
} uF*tlaV6
ps.executeBatch(); :G<~x8]k0
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 gHvkr?Cg
t<p4H^
事务的处理 XPi5E"
1、关闭Connection的自动提交 NQbgk+&wD
cn.setAutoCommit(false);
Es:oXA
2、执行一系列sql语句 ]MMXpj,9h
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close RL"hAUs_1
Statement sm ; @G>&Gu;5
sm = cn.createStatement(insert into user...); Oh1a'&
sm.executeUpdate(); i@YM{FycX
sm.close(); &xFs0Ri(
sm = cn.createStatement("insert into corp...); j{%'A
sm.executeUpdate(); 8;,(D#p
sm.close(); `C*psS
3、提交 \xk8+= /A
cn.commit(); 3=lQZi<]%
4、如果发生异常,那么回滚 cn$0^7?
cn.rollback();