java 数据库基本操作 BY$L[U;@T
1、java数据库操作基本流程 9S5C{~P4
2、几个常用的重要技巧: O? 7hT!{
可滚动、更新的记录集 b:
I0Zv6
批量更新 tCj\U+;
事务处理 |uJjO>8]|
nbDjoZZ4
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 IY@N
1、取得数据库连接 h;OHpvk
1)用DriverManager取数据库连接 T!1XL7
例子 1CUI6@Cz)
String className,url,uid,pwd; @G|z_
className = "oracle.jdbc.driver.OracleDriver"; 8K\S]SZ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; *4Z! 5iOs
uid = "system"; )<5hga][~a
pwd = "manager"; 0/~{,
Class.forName(className); oSO~72
Connection cn = DriverManager.getConnection(url,uid,pwd); g(o^'f
2)用jndi(java的命名和目录服务)方式 WjvgDNk
例子 6x16?x
String jndi = "jdbc/db"; P
qa;fiJ)
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); u*T#? W?
DataSource ds = (DataSource) ctx.lookup(jndi); 8;3I:z&muQ
Connection cn = ds.getConnection(); h,MaF<~
多用于jsp中 &sJ6k/l
2、执行sql语句 ?:7$c
1)用Statement来执行sql语句 OHH\sA
String sql; Ma ]*Pled
Statement sm = cn.createStatement(); YgQb(umK
sm.executeQuery(sql); // 执行数据查询语句(select) y@ c[S;
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); {@ tO9pc`8
2)用PreparedStatement来执行sql语句 t+Qx-sW
String sql; ;"NW=P&
sql = "insert into user (id,name) values (?,?)"; * YLpC^&
PreparedStatement ps = cn.prepareStatement(sql); d(, M
ps.setInt(1,xxx); cfc=a
ps.setString(2,xxx);
ypTH=]y
... Rvj[Csgi
ResultSet rs = ps.executeQuery(); // 查询 U@LIw6B!KL
int c = ps.executeUpdate(); // 更新 iu`B8yI
T^2o'_:
3、处理执行结果 =o[H2o
y
查询语句,返回记录集ResultSet {t('`z
更新语句,返回数字,表示该更新影响的记录数 oe=W}y_k
ResultSet的方法 suN}6CI
1、next(),将游标往后移动一行,如果成功返回true;否则返回false uLt31G()
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 -]:1zU
`I(5Aj"
4、释放连接 l~x
6R~q
cn.close(); E/C3t2@-
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection A-u}&}l<
8?hj}}H
可滚动、更新的记录集 YG#{/;^nm)
1、创建可滚动、更新的Statement cM=_i{c
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); M1K[6V!
该Statement取得的ResultSet就是可滚动的 =BeJ.8$@VC
2、创建PreparedStatement时指定参数 4B-+DH>{6
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Fw%S%*B8g
ResultSet.absolute(9000); CmtDfE
批量更新 [tJp^?6*
1、Statement 6^z):d#u
Statement sm = cn.createStatement(); xv_Z$&9e>l
sm.addBatch(sql1); ]ia{N
sm.addBatch(sql2); 8@KGc
)k
...
\Bl`;uXb
sm.executeBatch() YcM0A~<
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 p<Vj<6.=?
2、PreparedStatement y6>fK@K~
PreparedStatement ps = cn.preparedStatement(sql); ~@D{&7@
{ i MF-TR
ps.setXXX(1,xxx); z+j3j2
... 7C~g?1
ps.addBatch(); $T*g@]
} #D%l;Ae
ps.executeBatch(); is{H >#+"
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 "]yfx@)_
IG4`f~k^
事务的处理 0He^r
&c3
1、关闭Connection的自动提交 9i!|wkx
cn.setAutoCommit(false); 2nI^fVR%\
2、执行一系列sql语句 uh3<%9#\k
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close H `_{n<
Statement sm ; c,5yH
sm = cn.createStatement(insert into user...); VW**N}1#C
sm.executeUpdate(); -'j|U[&N\
sm.close(); *,Sa*-7(
sm = cn.createStatement("insert into corp...); 8q|T`ac+N
sm.executeUpdate(); )fbYP@9>a
sm.close(); ?b?YiK&yz
3、提交 AN+S6t
cn.commit(); g` 41d
4、如果发生异常,那么回滚 %WFZ&>en&
cn.rollback();