java 数据库基本操作 ]uh/ !\
1、java数据库操作基本流程 PGYx]r
2、几个常用的重要技巧: +tg${3ti_
可滚动、更新的记录集 6iEg]FI
批量更新 >nvK{6xR:
事务处理 JHZjf7g$k
vAeVQ~
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ~Ij/vyB_
1、取得数据库连接 ,v=pp;
1)用DriverManager取数据库连接 .Xe_Gp"x
例子 368 g>/#'
String className,url,uid,pwd; rqm":N8@
className = "oracle.jdbc.driver.OracleDriver"; -w)v38iX!
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; /f+BeQ3#/
uid = "system"; hPgYKa8u
pwd = "manager"; pSYEC,0B
Class.forName(className); SsfC
m C
Connection cn = DriverManager.getConnection(url,uid,pwd); CMv8n@ry
2)用jndi(java的命名和目录服务)方式 V;J3lV<
例子 /"~UGn]R
String jndi = "jdbc/db"; Q:y'G9b
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); =9p3^:S
DataSource ds = (DataSource) ctx.lookup(jndi); 4_'B oU4
Connection cn = ds.getConnection(); Wy/h"R\=
多用于jsp中 l4iklg3
2、执行sql语句 ]8Xip/uE
1)用Statement来执行sql语句 Q6
m.yds
String sql; lU$0e09
Statement sm = cn.createStatement(); [[';Hi^
sm.executeQuery(sql); // 执行数据查询语句(select) aZtM
_
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); V
joVC$ZX
2)用PreparedStatement来执行sql语句 oY; C[X
String sql; eC6wrpZO
sql = "insert into user (id,name) values (?,?)"; pY\=f0]
PreparedStatement ps = cn.prepareStatement(sql); *1_Ef).
ps.setInt(1,xxx); ,zK E$
ps.setString(2,xxx); ;3bUgI}.J
... 3QdCu<eBZ
ResultSet rs = ps.executeQuery(); // 查询 QX=x^(M$m
int c = ps.executeUpdate(); // 更新 :c8d([)$
0&2`)W?9
3、处理执行结果 YZtd IG
查询语句,返回记录集ResultSet uAoZ&8D6
更新语句,返回数字,表示该更新影响的记录数 @^g~F&Ta
ResultSet的方法 H ="I=}
1、next(),将游标往后移动一行,如果成功返回true;否则返回false in K;n
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 tAY{+N]f
WlGT&m&2
4、释放连接 d 79 2#Dc
cn.close(); C'Y2kb
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection [U"/A1p
JB.U&
可滚动、更新的记录集 uq54+zC
1、创建可滚动、更新的Statement ]0|A\bE\S
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 7~k=t!gTY
该Statement取得的ResultSet就是可滚动的 t&EY$'c
2、创建PreparedStatement时指定参数 Nqz6_!
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); \ptjnwC^O
ResultSet.absolute(9000); SN\c2^#
批量更新 0O*kC43E_
1、Statement "Y- WY,H
Statement sm = cn.createStatement(); qn |~YXn
sm.addBatch(sql1); cKoW5e|u
sm.addBatch(sql2); ` QW=<Le?
... 5nsoWqnE8
sm.executeBatch() >&7^yXS
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ?`O^;f
2、PreparedStatement S QGYH
PreparedStatement ps = cn.preparedStatement(sql); {I?)ODx7qC
{ HXZ,"S
ps.setXXX(1,xxx); O.xtY@'"
... /Bh*MH
ps.addBatch(); ?k;htJcGv
} &CN(PZv
ps.executeBatch(); $p$p C/:%
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 iJmzVR+
fz2}M:u
事务的处理 8gt&*;'}*D
1、关闭Connection的自动提交 ~mi4V
cn.setAutoCommit(false); '!,(G3
2、执行一系列sql语句 wQ@:0GJH
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close uxh>r2Xr=
Statement sm ; Eciu^
sm = cn.createStatement(insert into user...); V@O)7ND
sm.executeUpdate(); M:iH7K
sm.close(); "VU/Ucb7
sm = cn.createStatement("insert into corp...); !H9^j6|
sm.executeUpdate(); WLfDXx2A
sm.close(); ae]6F_Qtc*
3、提交 UEfY'%x
cn.commit(); X|ZAC!J5>
4、如果发生异常,那么回滚 =_ b/g
cn.rollback();