java 数据库基本操作 N%1nii
1、java数据库操作基本流程 AR&l9R[{N
2、几个常用的重要技巧: >B*zzj
可滚动、更新的记录集 ~,xso0
批量更新 @U1t~f^
事务处理 0($On`#
6E^9>
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 }m7$,'C%P
1、取得数据库连接 )ZFc5m^+u
1)用DriverManager取数据库连接 DnW/q
例子 J(=y$8xje
String className,url,uid,pwd; (N)>?r@n`
className = "oracle.jdbc.driver.OracleDriver"; uK1VFW
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr;
a3a:H
uid = "system"; _5$L`&
pwd = "manager"; crSqbL
Class.forName(className); Y4X`(\A
Connection cn = DriverManager.getConnection(url,uid,pwd); @e$EwCV,
2)用jndi(java的命名和目录服务)方式 fE3%$M[V7
例子 }1lZW"{e[
String jndi = "jdbc/db"; o#BI_#b
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ?U1Nm~'UZ
DataSource ds = (DataSource) ctx.lookup(jndi); T1x67 b
u
Connection cn = ds.getConnection(); CJs
~!ww
多用于jsp中 {G<1.
2、执行sql语句 [qkc6sqo
1)用Statement来执行sql语句 -9o7a_Z
String sql; +RkXe;q
Statement sm = cn.createStatement(); K,*-Y)v2W
sm.executeQuery(sql); // 执行数据查询语句(select) Pt-O1$C[
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); aYWUwYB$
2)用PreparedStatement来执行sql语句 /~c9'38
String sql; Fzy#!^9Nu
sql = "insert into user (id,name) values (?,?)"; 1&9w]\Ae7l
PreparedStatement ps = cn.prepareStatement(sql); wByTNA7
ps.setInt(1,xxx); V-X Ty
iv
ps.setString(2,xxx); pqju@FD*
... \YF07L]qs-
ResultSet rs = ps.executeQuery(); // 查询 s vS)7]{cU
int c = ps.executeUpdate(); // 更新 {/>uc,8O
>*n4j:
3、处理执行结果 *m`x/_y+
查询语句,返回记录集ResultSet M
8(w+h{
更新语句,返回数字,表示该更新影响的记录数 Dqd2e&a\
ResultSet的方法 \0 &$n
1、next(),将游标往后移动一行,如果成功返回true;否则返回false %5@>
nC?`[
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 :1@jl2,
j7NOYm5N
4、释放连接 Z
J1@z.
cn.close(); !:tr\L {
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection I#7H)^us
D-x*RRkpp
可滚动、更新的记录集 Ra:UnA
1、创建可滚动、更新的Statement vmo!
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); [
<k&]Kv
该Statement取得的ResultSet就是可滚动的 BJ
fBYH,M
2、创建PreparedStatement时指定参数 5D
XBTpCVM
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); LCq1F(q
ResultSet.absolute(9000); zTi
8 y<}
批量更新 =5YbK1Q^
1、Statement jX*gw6!
Statement sm = cn.createStatement(); +[$Td%6
sm.addBatch(sql1); jyidNPLm4
sm.addBatch(sql2); t2rZ%[O
... r@wE?hK
sm.executeBatch() %*IH~/Ld;]
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 `49!di[
2、PreparedStatement 3Ljj|5.q
PreparedStatement ps = cn.preparedStatement(sql); ^BW8zu@=O
{ wgq=9\+&
ps.setXXX(1,xxx); ejbtdU8N<
... !X-ThKEq
ps.addBatch(); eiRVw5g
} WHfl|e
ps.executeBatch(); -_]Ceq/
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 7vI
ROK~
QXEZ?gx
事务的处理 ^$RpP+d
1、关闭Connection的自动提交 X?/32~\
cn.setAutoCommit(false); _.%g'=14f
2、执行一系列sql语句 n3 Rf:j^R
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close K
6,c||#<
Statement sm ; Uv=)y^H~*A
sm = cn.createStatement(insert into user...); Y|W#VyM-
sm.executeUpdate(); Ln/*lLIOb
sm.close(); 5-S-r9
sm = cn.createStatement("insert into corp...); `FX?P`\@I
sm.executeUpdate(); PQz[IZ
sm.close(); O<dCvH
3、提交 1W}k>t8?h'
cn.commit(); k
,r*xt
4、如果发生异常,那么回滚 st#^pWL
cn.rollback();