java 数据库基本操作 xgv&M:%D-
1、java数据库操作基本流程
Kgu#Mi~
2、几个常用的重要技巧: IL N0/eH
可滚动、更新的记录集 !Zma\Ip
批量更新 TrmU
事务处理 O7GJg;>?
Hp?uYih0
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 8i'EO6
1、取得数据库连接 a0[Mx 4
1)用DriverManager取数据库连接 %!QY:[
例子 ;+iw?"
String className,url,uid,pwd; JBvP {5
className = "oracle.jdbc.driver.OracleDriver"; )6,Pmq~)
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Ncle8=8
uid = "system"; sH{4 .tw
pwd = "manager"; ik Pm,ZN
Class.forName(className); 8f{;oO
Connection cn = DriverManager.getConnection(url,uid,pwd); fN{JLp
2)用jndi(java的命名和目录服务)方式 l/o
4bkV
例子 gCc::[}\Y
String jndi = "jdbc/db"; tA6x
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); @$%[D`Wa<
DataSource ds = (DataSource) ctx.lookup(jndi); TWAt)Q"J
Connection cn = ds.getConnection(); ^Q""N<
多用于jsp中 ]0&ExD\4
2、执行sql语句 !xo; $4
1)用Statement来执行sql语句 C'Z6l^{>
String sql; X6lUFko
Statement sm = cn.createStatement(); Z=\wI:TY1
sm.executeQuery(sql); // 执行数据查询语句(select) )k'4]=d
<
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); @F,8M
2)用PreparedStatement来执行sql语句 gg%9EJpP
String sql; b\H !\A
sql = "insert into user (id,name) values (?,?)"; ThmN^N
PreparedStatement ps = cn.prepareStatement(sql); +_E96`P
ps.setInt(1,xxx); tOf18V{a
ps.setString(2,xxx); %K|+4ZY3
... vaOCH*}h
ResultSet rs = ps.executeQuery(); // 查询 Ci?A4q$.
int c = ps.executeUpdate(); // 更新 Y<oDv`aZ0
T~(AXwaJ
3、处理执行结果 <764|q
查询语句,返回记录集ResultSet yM-3nwk
更新语句,返回数字,表示该更新影响的记录数 Oe:_B/l
ResultSet的方法 FfR%@
V'
1、next(),将游标往后移动一行,如果成功返回true;否则返回false H`028^CH$
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 )>~d`_$dt
U>jLh57
4、释放连接 \:D'u<8E
cn.close(); ~*,e &I
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 1#2B1&
KOM]7%ys1H
可滚动、更新的记录集 Fi*j}4F1
1、创建可滚动、更新的Statement #:6gFfk0<
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Kx@;LRY#
该Statement取得的ResultSet就是可滚动的 1l*O;J9By
2、创建PreparedStatement时指定参数 SF2<
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); cKbsf^R[e
ResultSet.absolute(9000); eLc@w<yB
批量更新 C].w)B
1、Statement n:d7 Tv1Z8
Statement sm = cn.createStatement(); z3X:.%
sm.addBatch(sql1); a'm\6AW2)
sm.addBatch(sql2); v<wR`7xG
... EM&;SQ;C9
sm.executeBatch() Udbz;^(
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 +rA:/!b)Y
2、PreparedStatement ;^`WX}]C(
PreparedStatement ps = cn.preparedStatement(sql); uEPdL':}2
{ z'+k]N9Q^
ps.setXXX(1,xxx); eED@Z/~6
... !c 3li .
ps.addBatch(); ELWm>'Q#9
} t9yjfyk9W
ps.executeBatch(); P:8P>#L
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 HD&Ag
d|c>Y(
事务的处理 1FQ_`wF4
1、关闭Connection的自动提交 tf+5@Zf]4
cn.setAutoCommit(false); n:P5m9T
2、执行一系列sql语句 IFg(Ze~
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close +S3r]D3v/
Statement sm ; {F~:86z(g
sm = cn.createStatement(insert into user...); `aw5"ns^V
sm.executeUpdate(); YPY'[j(p`n
sm.close(); b=-LQkcZhK
sm = cn.createStatement("insert into corp...); iB=v
>8l%
sm.executeUpdate(); <h"*"q|9
sm.close(); uNcE_<
3、提交 lh?TEQ
cn.commit(); r{~@hd'Aj
4、如果发生异常,那么回滚 -P5M(Rt
cn.rollback();