java 数据库基本操作 J,=E5T}U^
1、java数据库操作基本流程 UWWD8~:
2、几个常用的重要技巧: k+R?JWC:
可滚动、更新的记录集 /L|}Y242
批量更新 K7O?{/
事务处理 hL{B9?
g/X=#!
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ]qza*ba
1、取得数据库连接 UH^wyKbM
1)用DriverManager取数据库连接 vS t=Ax3]
例子 ;=9vmQA
String className,url,uid,pwd; 7}1Kafs
className = "oracle.jdbc.driver.OracleDriver"; e"adkV
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 645C]l
uid = "system"; ]o+|jgkt]
pwd = "manager"; 5 EuJ
Class.forName(className); i+x6aQ24
Connection cn = DriverManager.getConnection(url,uid,pwd); x>9EVa)
2)用jndi(java的命名和目录服务)方式 cKYvRe
例子 ]ifHA# z`~
String jndi = "jdbc/db"; z3jzpmz
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); muX4 Y1M_
DataSource ds = (DataSource) ctx.lookup(jndi); @1ta`7#
Connection cn = ds.getConnection(); vlN. OQ
多用于jsp中 KZ}4<{3
2、执行sql语句 H6JMN1#t$
1)用Statement来执行sql语句 KW6" +,Th
String sql; [k=9 +0p
Statement sm = cn.createStatement(); :(p
rx
sm.executeQuery(sql); // 执行数据查询语句(select) M)pi)$&c
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); rtF6Lg
2)用PreparedStatement来执行sql语句 h> %JG'DV
String sql; j<P%Uy+
sql = "insert into user (id,name) values (?,?)"; uv!qE1z@':
PreparedStatement ps = cn.prepareStatement(sql); RF2XJJ
ps.setInt(1,xxx); *B<I> <'G
ps.setString(2,xxx); 7%!KAtc
... Iw|[*Nu-
ResultSet rs = ps.executeQuery(); // 查询 >T^v4A
int c = ps.executeUpdate(); // 更新 a[cH@7W.#
[rsAY&.
3、处理执行结果 Sn&%epi
查询语句,返回记录集ResultSet ^dD?riFAk
更新语句,返回数字,表示该更新影响的记录数 7SZs/wWh%
ResultSet的方法 p~ItHwiT
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Lr:K0A.Ch
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Bx>@HU
tH(#nx8
4、释放连接 b] V=wZ
o
cn.close(); 3)\qts5
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection B=|sLs`I
RBwV+X[B
可滚动、更新的记录集 c= uORt>
1、创建可滚动、更新的Statement Yg.u8{H
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); cn:VEF:l
该Statement取得的ResultSet就是可滚动的 4*X$Jle|
2、创建PreparedStatement时指定参数 h+(s/o?\
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 2fB@zF
ResultSet.absolute(9000); a@J:*W
批量更新 h %S#+t(Bf
1、Statement W:J00rsv=`
Statement sm = cn.createStatement(); DlI|~
sm.addBatch(sql1); ~O$]y5
sm.addBatch(sql2); iX p8u**
... ^XVa!s,d
sm.executeBatch() ?]N&H90^5
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 UUq9UV-h
2、PreparedStatement +%v4Ci"%y
PreparedStatement ps = cn.preparedStatement(sql); sNVD"M,
{ +i =78
ps.setXXX(1,xxx); BW 7[JD
... ^5}3FvW
ps.addBatch(); _Hk`e}}
} ]du~V?N
ps.executeBatch(); t:7jlD!d
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 >w2u
qa0Zgn5 q
事务的处理 >0oc=9H8
1、关闭Connection的自动提交 M(f'qFY=K
cn.setAutoCommit(false); r%i{a
2、执行一系列sql语句 ' M!_k+e
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close :9Pqy
pd+
Statement sm ; mgWtjV 8
sm = cn.createStatement(insert into user...); z16++LKmM
sm.executeUpdate(); sx\7Z#|
sm.close(); ]\lw^.%
sm = cn.createStatement("insert into corp...); add-]2`
sm.executeUpdate(); Op{Mc$5a
sm.close(); +qec>ALAg
3、提交 DJ^JUVi
cn.commit(); uItKs u
4、如果发生异常,那么回滚 RJSgts "F
cn.rollback();