java 数据库基本操作 0^o/cSF
1、java数据库操作基本流程 `kQosQV
2、几个常用的重要技巧: ,z/aT6M?H
可滚动、更新的记录集 [{u3g4`}
批量更新 v7./u4S|V
事务处理 LFHJj-nk
=_|G q|
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ml1%C%
1、取得数据库连接 |M5#jVXj
1)用DriverManager取数据库连接 [yQ%g;m
例子 9.M'FCd~M
String className,url,uid,pwd; o#f"wQH;p
className = "oracle.jdbc.driver.OracleDriver"; U-fxlg|-C
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; _r\M}lDh*
uid = "system"; QNU~G3
pwd = "manager"; fpo{`;&F
Class.forName(className); 7(.Z8AO
Connection cn = DriverManager.getConnection(url,uid,pwd); X`Q+,tx$
2)用jndi(java的命名和目录服务)方式 I(pq3_9$
例子 x@rQ7K>
String jndi = "jdbc/db"; `DgK$ QM
Context ctx = (Context) new InitialContext().lookup("java:comp/env");
-NN=(p!<
DataSource ds = (DataSource) ctx.lookup(jndi); R`a~8QVh&5
Connection cn = ds.getConnection(); J$1H3#VVG
多用于jsp中 \b(&-=(
2、执行sql语句 ~KMah
1)用Statement来执行sql语句 Yn="vpM1
String sql; d:K\W[$Bz
Statement sm = cn.createStatement(); F.$z7ee@
sm.executeQuery(sql); // 执行数据查询语句(select) }p2iF2g9`
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Gg9MAK\ C9
2)用PreparedStatement来执行sql语句 =cjO]
String sql; ]Rxo}A
sql = "insert into user (id,name) values (?,?)"; V)/J2 -w
PreparedStatement ps = cn.prepareStatement(sql); ,/b!Xm:
ps.setInt(1,xxx); q q&U)-`
ps.setString(2,xxx); H@xS<=:lM
... 3_XLx{["'
ResultSet rs = ps.executeQuery(); // 查询 s)qrlv5H
int c = ps.executeUpdate(); // 更新 1a{3k#}
&Z]}rn
3、处理执行结果 Z@+nkTJ9&t
查询语句,返回记录集ResultSet /v5A)A$7
更新语句,返回数字,表示该更新影响的记录数 8ex;g^e
ResultSet的方法 NC-K`)
1、next(),将游标往后移动一行,如果成功返回true;否则返回false _`\!+qGq
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 YWH>tt9
;NRh0)%|o
4、释放连接 [C6ba{9B
cn.close(); g3NUw/]#
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection $ -1ajSVJ
ye$_=KARP
可滚动、更新的记录集 kpn|C 9r
1、创建可滚动、更新的Statement 9Tt%~m^
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); pK3A/ry<
该Statement取得的ResultSet就是可滚动的 @y;VV*
2、创建PreparedStatement时指定参数 .@OQ$D <
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); r]p3DQ
ResultSet.absolute(9000); 8N'hG,
批量更新 {ac$4#Bp[B
1、Statement ]}rNxT4<
Statement sm = cn.createStatement(); T@yQOD7
sm.addBatch(sql1); BkXv4|UE
sm.addBatch(sql2); xNOKa*
... .i4aM;Qy
sm.executeBatch() zT,@PIC(
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 WC~;t4
2、PreparedStatement OmWEa
PreparedStatement ps = cn.preparedStatement(sql); f't.?M
{ K)LoZ^x0)
ps.setXXX(1,xxx); mv8H:T
... =exCpW>
ps.addBatch(); e*}zl>f
} Ie^Ed`
ps.executeBatch(); > U?\WgE$
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 )9yQ
C
6J,h}S
事务的处理 apa&'%7
1、关闭Connection的自动提交 :Pdh##k
cn.setAutoCommit(false); S#C-j D
2、执行一系列sql语句 #2_FM!e
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close .-rz30xT
Statement sm ; u$a K19K/
sm = cn.createStatement(insert into user...); c%doNY9Q
sm.executeUpdate(); Ln,<|,fZN
sm.close(); }NC$Ce
sm = cn.createStatement("insert into corp...); :[n~(~7?
sm.executeUpdate(); ,nteIR'??
sm.close(); u?72]?SM
3、提交 /r~2KZE
cn.commit(); <p b
4、如果发生异常,那么回滚 _D4qnb@
cn.rollback();