java 数据库基本操作 m0^~VK |
1、java数据库操作基本流程 yWT1CID
2、几个常用的重要技巧: T@zp'6\H
可滚动、更新的记录集 )!G 10
批量更新 nT}i&t!q8@
事务处理 Q{miI
N
\.P#QVuQ
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 :w4N*lV-
1、取得数据库连接 TXs&*\
1)用DriverManager取数据库连接 WqCj;Tj|
例子 N_+D#Z.g
String className,url,uid,pwd; adgd7JjI*
className = "oracle.jdbc.driver.OracleDriver"; s%5XBI
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ,u-9e4
uid = "system"; E4.A$/s8[
pwd = "manager"; pY%KI
Class.forName(className); 4V
mUTMY
Connection cn = DriverManager.getConnection(url,uid,pwd); n 1^h;2gz
2)用jndi(java的命名和目录服务)方式 BXz g33
例子 f3.oc9G
String jndi = "jdbc/db"; I9#l2<DYlX
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); t47;X}y f
DataSource ds = (DataSource) ctx.lookup(jndi); P^lzbWj^
Connection cn = ds.getConnection(); Li 9$N"2
多用于jsp中 Tn\{*A
2、执行sql语句 ]ZI@?H?
O
1)用Statement来执行sql语句 )g]A
'A=
String sql; V<PH5'^$j
Statement sm = cn.createStatement(); j*GS')Cm
sm.executeQuery(sql); // 执行数据查询语句(select) |}X[Yg=FG
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ;.R)
uCd{=
2)用PreparedStatement来执行sql语句 ?T|0"|\"'
String sql; EyBTja(4
sql = "insert into user (id,name) values (?,?)"; 3mg:9]X9
PreparedStatement ps = cn.prepareStatement(sql); [?$tu%Q(Z
ps.setInt(1,xxx); 23Q 88z
ps.setString(2,xxx); E7B?G3|z3
... s8';4z
ResultSet rs = ps.executeQuery(); // 查询 GI:!,9
int c = ps.executeUpdate(); // 更新 !>kg:xV
%`/F>`
3、处理执行结果 z XU r34jF
查询语句,返回记录集ResultSet #60gjHYaV
更新语句,返回数字,表示该更新影响的记录数 L[`8 :}M
ResultSet的方法 P9q=tC3^
1、next(),将游标往后移动一行,如果成功返回true;否则返回false
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 $ma@z0%8}
%):pfM;b
4、释放连接 h2?\A%
cn.close(); 3m$Qd#|
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection VT#`l0I}
|S:erYE,G
可滚动、更新的记录集 @,W5K$Ka=
1、创建可滚动、更新的Statement p&HO~J<w
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); EV|W:;Sg
该Statement取得的ResultSet就是可滚动的 _[wG-W/9R
2、创建PreparedStatement时指定参数 hVd_1|/X
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 8;f5;7Mn
ResultSet.absolute(9000); [O]rf+NZ(5
批量更新 #v6<9>%
1、Statement u1.0-Y?
Statement sm = cn.createStatement(); Y&DoA0/y
sm.addBatch(sql1); # |OA>[
sm.addBatch(sql2); s<3M_mt
... q; C6ID`
sm.executeBatch() OF-g7s6VH
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 slP>;
2、PreparedStatement \
*g3j
PreparedStatement ps = cn.preparedStatement(sql); 3Lv5>[MnN
{ y*=Ipdj
ps.setXXX(1,xxx); VG50n<m9
... Z=a~0&G
ps.addBatch(); k6RH]Ha
} ho^jmp
ps.executeBatch(); d(KK7SQg
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 g{K \
M+lr [,c
事务的处理 j;-2)ZLm
1、关闭Connection的自动提交 2dbn~j0
cn.setAutoCommit(false); J
L1]auO*
2、执行一系列sql语句 Gj[5ew?@
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close k_gl$`A
Statement sm ; 79h'sp6;
sm = cn.createStatement(insert into user...); oc[z dIk
sm.executeUpdate(); !>GDp >0
sm.close(); jQBn\^w
sm = cn.createStatement("insert into corp...); HLc3KYIk
sm.executeUpdate(); U% ?+N
sm.close(); 3l$ D%y
3、提交 by,3A
cn.commit(); vRDs~'f
4、如果发生异常,那么回滚 M(^ e)7a1
cn.rollback();