java 数据库基本操作 EJ;0ypbG
1、java数据库操作基本流程 m<,G:?RM
2、几个常用的重要技巧: 3et2\wOX1x
可滚动、更新的记录集 V& j.>Y
批量更新 C\^<v&
事务处理 A.C278^O8
imCl{vt(kj
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 xnuv4Z}]t
1、取得数据库连接 lJ] \
1)用DriverManager取数据库连接 4OZ5hH
h
例子 mx(%tz^t
String className,url,uid,pwd; O-!fOdX8_k
className = "oracle.jdbc.driver.OracleDriver"; Nw>T$RzS
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Nk7e iQ
uid = "system"; VO;UV$$
pwd = "manager"; | ]!Ky[P
Class.forName(className); &J/4J
Connection cn = DriverManager.getConnection(url,uid,pwd); G9y12HV
2)用jndi(java的命名和目录服务)方式 NuS|X
例子 {}J@+Zsi
String jndi = "jdbc/db"; G<^]0`"+)t
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); )\D40,p
DataSource ds = (DataSource) ctx.lookup(jndi); e]*=sp!T
Connection cn = ds.getConnection(); _QMHPRELk
多用于jsp中 _?]BVw
2、执行sql语句 ['4\O43yv
1)用Statement来执行sql语句 JGO$4DK-1
String sql; ogc('HqF^'
Statement sm = cn.createStatement(); ks%7W
-
sm.executeQuery(sql); // 执行数据查询语句(select) h6T/0YhWLP
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ['OCw {<
2)用PreparedStatement来执行sql语句 1S[5#ewB;j
String sql; ^'u;e(AaE
sql = "insert into user (id,name) values (?,?)"; 7fW=5wc
PreparedStatement ps = cn.prepareStatement(sql); )Rhf f$
ps.setInt(1,xxx); ADv"_bB:h
ps.setString(2,xxx); {Sr=SE
... +G!jKta7B
ResultSet rs = ps.executeQuery(); // 查询 r0g/ :lJi
int c = ps.executeUpdate(); // 更新 97]a-)SA
F@K*T2uh
3、处理执行结果 q~Q)'*m
查询语句,返回记录集ResultSet d7_ g
u
更新语句,返回数字,表示该更新影响的记录数 0n<(*bfW
ResultSet的方法 w^dueP7J
1、next(),将游标往后移动一行,如果成功返回true;否则返回false *e-ptgO
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ,y8I)+
4/`h@]8P
4、释放连接 A M1C
$
cn.close(); 4I#eC#"
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection \Ul.K!b7
|DFvZ6}
可滚动、更新的记录集 e@,u`{C[
1、创建可滚动、更新的Statement }$0xt' q&
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); QLB1:O>
该Statement取得的ResultSet就是可滚动的 g<rKV+$6
2、创建PreparedStatement时指定参数
>NH4A_
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Oa}V>a
ResultSet.absolute(9000); VTJIaqw
批量更新 [C+Gmu
1、Statement HL(U~Q6JQ
Statement sm = cn.createStatement(); r}y[r}vk
sm.addBatch(sql1); V@f6Lj
sm.addBatch(sql2); N7~)qqb
... (
*9Ip
sm.executeBatch() | ,1bkJt
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 da00p-U
2、PreparedStatement hSkc9jBF
PreparedStatement ps = cn.preparedStatement(sql); W3jXZ>
{ uK;K{
ps.setXXX(1,xxx); |YE,) kiF
... ,XeyE;||
ps.addBatch(); U50s!Zt45
} $/, BJ/9
ps.executeBatch(); Y[iDX#
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 )H;pGM:
C?w<$DU
事务的处理 EREolCASb
1、关闭Connection的自动提交 43J\8WBn@
cn.setAutoCommit(false); 9@#h}E1$
2、执行一系列sql语句 3C rQBIj1
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close /B,:<&_-
Statement sm ; (2 T#/$
sm = cn.createStatement(insert into user...); +9CEC1-l
sm.executeUpdate(); *%T)\\H2
sm.close(); I #M%%5e
sm = cn.createStatement("insert into corp...); "K|)<6J
sm.executeUpdate(); 2gd<8a' '
sm.close(); 861i3OXVE>
3、提交 Gh]_L+
cn.commit(); E\]OySC%C$
4、如果发生异常,那么回滚 Y8)E]D
cn.rollback();