java 数据库基本操作 97))'gC
1、java数据库操作基本流程 })0 7u
2、几个常用的重要技巧: ,nChwEn
可滚动、更新的记录集 7+!7]'V
批量更新 Y\z\{JW
事务处理 $-9@ /%Y
S.F=$z.%
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 (jE:Q2"
1、取得数据库连接 wh m tEY
1)用DriverManager取数据库连接 vsz^B
:j
例子 b;{"lJ:+Z
String className,url,uid,pwd; zI:5I @ X
className = "oracle.jdbc.driver.OracleDriver"; d,rEEc Y
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; dbUZGn~
uid = "system"; |^k1hX2?W
pwd = "manager"; 'GzhZ`E6
Class.forName(className); \;:@=9`
Connection cn = DriverManager.getConnection(url,uid,pwd); "`3^MvC
2)用jndi(java的命名和目录服务)方式 ,8o*!(uO2
例子 :6k DUFj}
String jndi = "jdbc/db"; 7(g&z%
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); |UDD/e
DataSource ds = (DataSource) ctx.lookup(jndi); X>GY*XU
Connection cn = ds.getConnection(); 5<?c_l9X^
多用于jsp中 rWfurB5f
2、执行sql语句
T!xy^n]}
1)用Statement来执行sql语句 Q%VR@[`\
String sql; P "_}F
Statement sm = cn.createStatement(); 6BN(^y#-X
sm.executeQuery(sql); // 执行数据查询语句(select) j _9<=Vu
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); >.wd)
2)用PreparedStatement来执行sql语句 #M^Yh?~%w
String sql; ;6 qdOD6
sql = "insert into user (id,name) values (?,?)"; s>``-
]3
PreparedStatement ps = cn.prepareStatement(sql); = 4WZr
ps.setInt(1,xxx); Nl<,rD+KSD
ps.setString(2,xxx); ^}7t:
... 7RFkHME
ResultSet rs = ps.executeQuery(); // 查询 IS
9q 5/]
int c = ps.executeUpdate(); // 更新 ~5!TV,>ls
f<sPh>n
3、处理执行结果 d<'Yt|zt
查询语句,返回记录集ResultSet @gjdyz
更新语句,返回数字,表示该更新影响的记录数 @bCiaBdi
ResultSet的方法 0#/
6P&6
1、next(),将游标往后移动一行,如果成功返回true;否则返回false $z,DcO.vz
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 VrE5^\k<a
1LIV/l^}f
4、释放连接 ftH%, /,
cn.close(); TIhzMW\/K
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection _%Ld
Ez
Eg29|)qsz
可滚动、更新的记录集 :aqskeT
1、创建可滚动、更新的Statement EM
w(%}8w
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); })SdaZ
该Statement取得的ResultSet就是可滚动的 T_%]#M
2、创建PreparedStatement时指定参数 5
^z ,'C
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); $(L7/M
ResultSet.absolute(9000); sfPN\^k2
批量更新 71&+dC
1、Statement gG;W:vR}l
Statement sm = cn.createStatement(); to|9)\
sm.addBatch(sql1); RZh)0S>J
sm.addBatch(sql2); NP'DuzC
... 4"(zi5`e
sm.executeBatch() O Lup`~
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 G( \1{"!
2、PreparedStatement }~'Wz*Gm
PreparedStatement ps = cn.preparedStatement(sql); "}+/0$F
{ ;L%~c4`l~m
ps.setXXX(1,xxx); &p4<@k\L
... Tn-]0hWkP
ps.addBatch(); ]]o[fqD-Zn
} sLqvDH?V
ps.executeBatch(); Rs[]i;
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 LhRe?U\
*+Q*&-$
事务的处理 l{o{=]x1
1、关闭Connection的自动提交 Vot+gCZ
cn.setAutoCommit(false); %ys}Q!gR
2、执行一系列sql语句 @5G7bY7Nz
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close y]4`d
Statement sm ; ly%B!P|
sm = cn.createStatement(insert into user...); i O|,,;_
sm.executeUpdate(); rg/vxTl
sm.close(); azc:C
sm = cn.createStatement("insert into corp...); Hbc&.W;g7[
sm.executeUpdate(); 7O^ S.(
sm.close(); Bic {
H
3、提交 X
hX'*{3k
cn.commit(); kK|+W,
4、如果发生异常,那么回滚 VDY1F_Fk
cn.rollback();