java 数据库基本操作 yx-{}Yj^
1、java数据库操作基本流程 zX5p'8-
2、几个常用的重要技巧: #v`G4d
可滚动、更新的记录集 ?W#! S
批量更新 }R>g(q=N
事务处理 J|I|3h<T
S'A~9+
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 MVTU$
65
1、取得数据库连接 yEz2F3[ S
1)用DriverManager取数据库连接
e%qMrR
例子 doe[f_\
String className,url,uid,pwd; ]{y ';MZ
className = "oracle.jdbc.driver.OracleDriver"; C4n5U^
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; r`
3)sc
uid = "system"; ?G3OAx?<
pwd = "manager"; ;hKn$' '
Class.forName(className); 5-+Y2tp}
Connection cn = DriverManager.getConnection(url,uid,pwd); x
&\~4,TN
2)用jndi(java的命名和目录服务)方式 lh5k@\X
例子 2S/^"IM["
String jndi = "jdbc/db"; 8Mp
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); \"f}Fx
DataSource ds = (DataSource) ctx.lookup(jndi); Bd7A-T)q!
Connection cn = ds.getConnection(); ;z[yNW8
多用于jsp中 mMa7Eyaf
2、执行sql语句 Gud!(5'
1)用Statement来执行sql语句 f[%iRfUFw
String sql; Ya>cGaLq
Statement sm = cn.createStatement(); fs`<x*}K
sm.executeQuery(sql); // 执行数据查询语句(select) xXyzzr1[
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); jm*v0kNy
2)用PreparedStatement来执行sql语句 (57x5qP
X
String sql; a1GyI
sql = "insert into user (id,name) values (?,?)"; G&;W
PreparedStatement ps = cn.prepareStatement(sql); eR3!P8t
ps.setInt(1,xxx); ~=c#Ff=Z
ps.setString(2,xxx); 1&m08dZm5
... N/y.=]
ResultSet rs = ps.executeQuery(); // 查询 5v?6J#]2
int c = ps.executeUpdate(); // 更新 1~_]"Y'
PPmZ[N9(;
3、处理执行结果 n'R
8nn6^
查询语句,返回记录集ResultSet V6Q[Y>84~a
更新语句,返回数字,表示该更新影响的记录数 ~fS#)X3 D
ResultSet的方法 d2 d^XMe!
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Xe*
L^8+
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 mWigy`V^~
V#Wd
4、释放连接 'r'uR5jR
cn.close(); .!Z.1:YR
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ,;{mH]"s
%u!#f<"[
可滚动、更新的记录集 7-(tTBH
1、创建可滚动、更新的Statement <x1(}x:u`
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); !IT']kA
该Statement取得的ResultSet就是可滚动的 sSvQatwS
2、创建PreparedStatement时指定参数 ?XeRL<n
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); <iTaJa$0m
ResultSet.absolute(9000); MenI>gd?
批量更新 6)H70VPJ
1、Statement T9(~^}_+9
Statement sm = cn.createStatement(); 2Ejs{KUj
sm.addBatch(sql1); fXL$CgXG\x
sm.addBatch(sql2); @jjp\ ~
... wCkkfTO
sm.executeBatch() &yYK%~}t[
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 9}": }!
2、PreparedStatement ^&.F!
PreparedStatement ps = cn.preparedStatement(sql); 4}l,|7_&I
{ C~:aol i;
ps.setXXX(1,xxx); {)`5*sd
... 6g<JPc
ps.addBatch(); <Q%o}m4Kt
} lM?P8#3
ps.executeBatch(); $3FFb#r
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ?Bk"3{hl
/TpM#hkq/2
事务的处理 gBrIqM i5
1、关闭Connection的自动提交 ZL-@2ZU{1
cn.setAutoCommit(false); ;;UvK
v
2、执行一系列sql语句 lMlXK4-
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close w\85D|u
Statement sm ; cDLS)
sm = cn.createStatement(insert into user...); [5:F
sm.executeUpdate(); rs!J<CRq
sm.close(); -
5A"TNU
sm = cn.createStatement("insert into corp...); |~'{ [?a*
sm.executeUpdate(); `oq
3G }
sm.close(); /(vT49(]
3、提交 -B@jQg@
>
cn.commit(); ncu>
@K$n
4、如果发生异常,那么回滚 Y5(`/
cn.rollback();