java 数据库基本操作 f@V3\Z/6E
1、java数据库操作基本流程 :14i?4Fd
2、几个常用的重要技巧: 3smM,fi
可滚动、更新的记录集 ":;@Hnb/
批量更新 i6PM<X,{;
事务处理 '/%zi,0
UVuDQ
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 DPHQ,dkp
1、取得数据库连接 ^>$P)=O:v
1)用DriverManager取数据库连接 ]F*3"y?)2
例子 <,%:
String className,url,uid,pwd; `iG,H[t+j
className = "oracle.jdbc.driver.OracleDriver"; VM=+afY5M
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; D&:yMp(
uid = "system"; o4^Fo p
pwd = "manager"; yX/";Oe
Class.forName(className); NYB[Zyp
Connection cn = DriverManager.getConnection(url,uid,pwd); 12`_;[37
2)用jndi(java的命名和目录服务)方式 '3(l-nPiG^
例子 \ZXLX'-
String jndi = "jdbc/db"; ,TC;{ $O5
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); x8#ODuH
DataSource ds = (DataSource) ctx.lookup(jndi); SAv<&
Connection cn = ds.getConnection(); 773/#c
多用于jsp中 {bNXedZ\
2、执行sql语句 omX?Bl
1)用Statement来执行sql语句 $.mQ7XDA9
String sql; ]o/|na*
Statement sm = cn.createStatement(); |$lwkC)O
sm.executeQuery(sql); // 执行数据查询语句(select) o>D
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); e]>ori
8
2)用PreparedStatement来执行sql语句 h5zVGr
String sql; t!;/Z6\Pb
sql = "insert into user (id,name) values (?,?)"; y }2F9=
PreparedStatement ps = cn.prepareStatement(sql); `TKD<&oL
ps.setInt(1,xxx); 3tS~:6-/
ps.setString(2,xxx); )9nElb2
... YE+$H%Jl!
ResultSet rs = ps.executeQuery(); // 查询 - M5=r>1;
int c = ps.executeUpdate(); // 更新 >H|` y@]
e(B9liXM
3、处理执行结果 C'mL&
查询语句,返回记录集ResultSet QDmYSY$
更新语句,返回数字,表示该更新影响的记录数 #=e;?w
ResultSet的方法 c9Es%@]
1、next(),将游标往后移动一行,如果成功返回true;否则返回false =([av7
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 X=X\F@V:u
MQ/
A]EeL
4、释放连接 adEJk
cn.close(); r4 dOK] 0
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection I*[tMzE
V9 }t0$LN
可滚动、更新的记录集 Z'v-F^
1、创建可滚动、更新的Statement T6#"8qz<
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 'W. Vr4
该Statement取得的ResultSet就是可滚动的 Z0,~V
2、创建PreparedStatement时指定参数 d.<~&.-$
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); k)(Biz398E
ResultSet.absolute(9000); UH`h OJ?
批量更新 ?:rx1}:F
1、Statement h rN%
Statement sm = cn.createStatement(); :Og:v#r8=
sm.addBatch(sql1); ?>uew^$d[w
sm.addBatch(sql2); -#&kYK#Ph
... ,t$,idcT+
sm.executeBatch() kUHE\L.Y]
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 d}I(`%%)
2、PreparedStatement #&!G"x7
PreparedStatement ps = cn.preparedStatement(sql); ,2[ra9n
{ M~T.n)x2
ps.setXXX(1,xxx); D vkxI<Xa
... TQ :/RT
ps.addBatch(); d4^`}6@
} wVK*P
-C
ps.executeBatch(); QGnxQ{ko
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 3eIr{xs
'md0] R|
事务的处理 1qdZc_x
1、关闭Connection的自动提交 f>Td)s1
M
cn.setAutoCommit(false); uYO|5a<f~
2、执行一系列sql语句 rjA@U<o
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close PFSLyV*
Statement sm ; W=}Okq)x9I
sm = cn.createStatement(insert into user...); /!FWuRe^
sm.executeUpdate(); *=F(KZ
sm.close(); h\[\\m
O
sm = cn.createStatement("insert into corp...); tV;%J4E'
sm.executeUpdate(); HaNboYW_K
sm.close(); :Waox"#=g
3、提交 "&YYO#YO
cn.commit(); l3i,K^YL
4、如果发生异常,那么回滚 Eh8Pwt7C@
cn.rollback();