java 数据库基本操作 ShV#XnQ
1、java数据库操作基本流程 *+ql{\am4N
2、几个常用的重要技巧: ?B"k9+%5ej
可滚动、更新的记录集 5HZ t5="+
批量更新 .MzVc42<
事务处理 hv.$p5UY*
\Y0o~JD
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 [%alnY
1、取得数据库连接 '51 8S"T @
1)用DriverManager取数据库连接 axSJ:j8
例子 M[^
String className,url,uid,pwd; ueyz@{On~
className = "oracle.jdbc.driver.OracleDriver"; +;P8QZK6
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 75+#)hNa!P
uid = "system"; ;|.^_Xs
pwd = "manager"; J.r^"K\
Class.forName(className); -r6cK,WVU
Connection cn = DriverManager.getConnection(url,uid,pwd); t0 1@h_WS
2)用jndi(java的命名和目录服务)方式 NT6OGBl&
例子 1gwnG&
String jndi = "jdbc/db"; "+g9}g
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); IezOal
DataSource ds = (DataSource) ctx.lookup(jndi); O#,Uz2
Connection cn = ds.getConnection(); GxL;@%B
多用于jsp中 R; wq
2、执行sql语句 *oC],4y~D
1)用Statement来执行sql语句 pu:Ie#xTDf
String sql; jo8hVWJ7V*
Statement sm = cn.createStatement(); <,r|*pkhp~
sm.executeQuery(sql); // 执行数据查询语句(select) 6 K+DgNK
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 7S_rN!E1i*
2)用PreparedStatement来执行sql语句 sO,%Ok1
String sql; >VQP,J{
sql = "insert into user (id,name) values (?,?)"; Kyz!YB
PreparedStatement ps = cn.prepareStatement(sql); #E?T E
ps.setInt(1,xxx); e'FBV[e
ps.setString(2,xxx); "B~c/%#PH
... =q1=.VTn
ResultSet rs = ps.executeQuery(); // 查询 OR &'
int c = ps.executeUpdate(); // 更新 G,#]`W@qhK
<QlpIgr
3、处理执行结果 }9k/Y/.
查询语句,返回记录集ResultSet 4&}V3"lg
更新语句,返回数字,表示该更新影响的记录数 H]6i1j
ResultSet的方法 2qw -:
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Tq\S-K}4!
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Fgf5OHX
9w^lRbn
4、释放连接 3C,G~)=
x
cn.close(); u?(@hUV.
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection TY(B]Q_o
raWs6b4Q
可滚动、更新的记录集 ^PnXnH?
1、创建可滚动、更新的Statement r\OunGUP
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); WIe7>wkC
该Statement取得的ResultSet就是可滚动的 cBZKt
2、创建PreparedStatement时指定参数 4GA9oLl
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); $>PXX32
ResultSet.absolute(9000); qqL :#]lV5
批量更新 #JmVq-)
1、Statement 9Q~9C9{+
Statement sm = cn.createStatement(); M bj{C
sm.addBatch(sql1); q#{.8H-X'
sm.addBatch(sql2); vD=>AAvG
... Tz\ PQ)!
sm.executeBatch() 64)Fz}
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 laRcEXj
2、PreparedStatement #Tz$ona
PreparedStatement ps = cn.preparedStatement(sql); a.n;ika]-
{ FeW}tKH
ps.setXXX(1,xxx); @%(Vi!Cv"R
... SdOa#U)
ps.addBatch(); )\
`AD#
} zTgY=fuz
ps.executeBatch(); j20/Q)=h
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Lro[ |A
|K|[>[?Z/
事务的处理 $+ z3
1、关闭Connection的自动提交 Q]JWWKt6rV
cn.setAutoCommit(false); aG"j9A~ &
2、执行一系列sql语句 (i1JDe
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 1JRM@ !x
Statement sm ; rq>}]
U
sm = cn.createStatement(insert into user...); BBV"nm_(/
sm.executeUpdate(); Ic 5TtN~/>
sm.close(); !2.(iuE
sm = cn.createStatement("insert into corp...); \kDQ[4mGq
sm.executeUpdate(); N\,[(LbA&
sm.close(); P3Wnso
3、提交 PykVXZ7j;
cn.commit(); ;6 ?a8t@
4、如果发生异常,那么回滚 @q98ac*{
cn.rollback();