java 数据库基本操作 HRh".!lxy
1、java数据库操作基本流程 eZo%q,L
2、几个常用的重要技巧: ObnB6ShKi
可滚动、更新的记录集 \`&fr+x
批量更新 A
2 )%+
事务处理 ~d]7 Cl
jeNEC&J
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Ac%K+Pgk.
1、取得数据库连接 vN+!l3O
1)用DriverManager取数据库连接 }2"k:-g
例子 7 |A,GH
String className,url,uid,pwd; y+<HS]vyV
className = "oracle.jdbc.driver.OracleDriver"; n_Dhq (.
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ;anG
F0x
uid = "system"; |M&/(0
pwd = "manager"; [sRQd;+
Class.forName(className); 6IH^rSUSK
Connection cn = DriverManager.getConnection(url,uid,pwd); ':@qE\(
2)用jndi(java的命名和目录服务)方式 UNae&Zir
例子 2sH5<5G'
String jndi = "jdbc/db"; .`9KB3
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Mf"B!WU>]B
DataSource ds = (DataSource) ctx.lookup(jndi); stScz#!
Connection cn = ds.getConnection(); ujedvw;sO
多用于jsp中 .Dz /MSl
2、执行sql语句 8X5XwFf}
1)用Statement来执行sql语句 #(G&%I A|;
String sql; ^TGHWCK!t
Statement sm = cn.createStatement(); lw{|~m5`
sm.executeQuery(sql); // 执行数据查询语句(select) D\JYa@*?.h
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); TUt)]"h<
2)用PreparedStatement来执行sql语句 fAi113q!
String sql; d29HEu
sql = "insert into user (id,name) values (?,?)"; A
|B](MW%O
PreparedStatement ps = cn.prepareStatement(sql); u ""=9>0
ps.setInt(1,xxx); QO%K`}Q}
ps.setString(2,xxx); Uw!v=n3#!
... WF7RMQ51j
ResultSet rs = ps.executeQuery(); // 查询 8jk*N
int c = ps.executeUpdate(); // 更新 J\BdC];
=W=%!A\g
3、处理执行结果 #</yX5!V
查询语句,返回记录集ResultSet xUUp?]9y
更新语句,返回数字,表示该更新影响的记录数 Z:{Z&HQC
ResultSet的方法 Z^'; xn
1、next(),将游标往后移动一行,如果成功返回true;否则返回false
AHb
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 K.SHY!U}
[%pZM.jFO
4、释放连接 `N0E;=g
cn.close(); ~czt=
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection DDEn63{
Syb:i(Y
可滚动、更新的记录集 iGIaZ!j aW
1、创建可滚动、更新的Statement SF7Kb `>Y
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 622).N4
该Statement取得的ResultSet就是可滚动的 @{G(.S
2、创建PreparedStatement时指定参数 l;ugrAo?
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); !ibp/:x
ResultSet.absolute(9000); e;$s{CNo
批量更新 L [^e<I
1、Statement *4bV8T>0Z
Statement sm = cn.createStatement(); *!/9?M{p
sm.addBatch(sql1); nHX@
sm.addBatch(sql2); ,~!lN yL
... (~#9KA1A}
sm.executeBatch() FVHL;J]nf1
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 )Z#7%,o
2、PreparedStatement e)M1$
PreparedStatement ps = cn.preparedStatement(sql); GUxhCoxb
{ 6ZE]7~X
ps.setXXX(1,xxx); TL5bX+
... /i<g>*82
ps.addBatch(); oUqNA|l
T
} ;AaF ;zPV
ps.executeBatch(); \n5,!,A
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 8`D_"3j3g\
8dv1#F|
事务的处理 1/ a,7Hl
1、关闭Connection的自动提交 mEGMe@37
cn.setAutoCommit(false); q^s$4 q
2、执行一系列sql语句 Ugn"w E
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close nsPM`dz/
Statement sm ; e:#\Oh
sm = cn.createStatement(insert into user...); u=4Rn
sm.executeUpdate(); V\_
&2',t
sm.close(); /#a$4 }2L
sm = cn.createStatement("insert into corp...); l!b#v`
sm.executeUpdate(); >\e11OU0Gy
sm.close(); >y?$aJ8ZV
3、提交 <K43f#%
cn.commit(); ]T$~a8
4、如果发生异常,那么回滚 l}m@9 ~oC
cn.rollback();