java 数据库基本操作 "6Nma)8
1、java数据库操作基本流程 x7L$x=8s
2、几个常用的重要技巧: U.crRrN
可滚动、更新的记录集 _;yp^^S
批量更新 ~uq J@#o{
事务处理 8{6KWqG\
o83HR[
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 -qs.'o
;2
1、取得数据库连接 5L42'gJ
1)用DriverManager取数据库连接 W;,UhE
例子 |m"2B]"@
String className,url,uid,pwd; -F4CHpua
className = "oracle.jdbc.driver.OracleDriver"; O#H `/z
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; YCeE?S1gk3
uid = "system"; ZJP.-` U
pwd = "manager"; A_{QY&%m
Class.forName(className); Fw!5hR`,
Connection cn = DriverManager.getConnection(url,uid,pwd); |LcN_,}6
2)用jndi(java的命名和目录服务)方式 cwz
% LKh
例子 KB&t31aq
String jndi = "jdbc/db"; @>qzRo
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Pgr>qcbql
DataSource ds = (DataSource) ctx.lookup(jndi); \hc}xy
0
Connection cn = ds.getConnection(); JR$Dp&]I
多用于jsp中 )qn
=
2、执行sql语句 NrgN{6u;
1)用Statement来执行sql语句 }qmZ
String sql; qX0IHe
Statement sm = cn.createStatement(); I:]s/r7
sm.executeQuery(sql); // 执行数据查询语句(select) Vd)iv\a
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); e&8pTD3
2)用PreparedStatement来执行sql语句 }Da8S|)H
String sql; 9gn_\!Mp
sql = "insert into user (id,name) values (?,?)"; CYEqH2"3
PreparedStatement ps = cn.prepareStatement(sql); YXg:cXE8e
ps.setInt(1,xxx); _:c8YJEG{
ps.setString(2,xxx); $$A{|4,aI
... y`mE sj
ResultSet rs = ps.executeQuery(); // 查询 *.Y!ZaK
int c = ps.executeUpdate(); // 更新 |B)e!#
nDiD7:e7=
3、处理执行结果
Y_p
查询语句,返回记录集ResultSet M7eO5
更新语句,返回数字,表示该更新影响的记录数 kR-N9|>i
ResultSet的方法 WyA>OB<Zeq
1、next(),将游标往后移动一行,如果成功返回true;否则返回false mf,mKgfG
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 X~ P0Q
[k@D}p
x
4、释放连接 Gw~^6( Qu
cn.close(); J^
P/2a#a
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection cP$b>3O
G&/}P$
可滚动、更新的记录集 fyYv}z
1、创建可滚动、更新的Statement O(~`fN?n
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Q'*-gg&)
该Statement取得的ResultSet就是可滚动的 }}cVPB7
2、创建PreparedStatement时指定参数 BtBy.bR
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); f|Z3VS0x
ResultSet.absolute(9000); iWCN2om
批量更新 H3QAIsGS
1、Statement \
CV(c]
Statement sm = cn.createStatement(); WT'P[RU2
sm.addBatch(sql1); lLmVat(
sm.addBatch(sql2); ? RB~%^c!
... ]B3 0d
sm.executeBatch() MO9}Itg
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 xPQO}wKa
2、PreparedStatement 0Ny0#;P
PreparedStatement ps = cn.preparedStatement(sql); ;?=nr 5;q
{ KT{<iz_
ps.setXXX(1,xxx); RNRMw;cT
... Lt@4F
ps.addBatch(); #c+N}eX{
} QMy;?,
ps.executeBatch();
*ErTDy(
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 aZ*b"3
~<Gs<c}z
事务的处理 9s73mu`Twg
1、关闭Connection的自动提交 R(k6S
cn.setAutoCommit(false); z;#}uC
2、执行一系列sql语句 q&jZmr
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close [53@'@26
Statement sm ; +]I;C
sm = cn.createStatement(insert into user...); _#f/VE
sm.executeUpdate(); q,aWF5m@
sm.close(); `r_qvrC
sm = cn.createStatement("insert into corp...); ^ T(l3r
sm.executeUpdate(); =ub&@~E
sm.close(); mgG0uV
3、提交 ^yy\CtG
cn.commit(); O4\GL
4、如果发生异常,那么回滚 |rW}s+Kcr
cn.rollback();