java 数据库基本操作 j71RlS73
1、java数据库操作基本流程 g^[BnP)I
2、几个常用的重要技巧: 3.w &e0Es
可滚动、更新的记录集 67]!xy
批量更新 |G(I,EPag
事务处理 "J>8ZUP
As>P(
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Aga{EKd
1、取得数据库连接 h=ben&m
1)用DriverManager取数据库连接 MTAq}8
例子 DTz)qHd#X
String className,url,uid,pwd; 8]&\FA 8
className = "oracle.jdbc.driver.OracleDriver"; _ pO1XM
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Hgbrlh
uid = "system"; |Pq z0n=v
pwd = "manager"; M s Q=1
Class.forName(className); z,c=."<z
Connection cn = DriverManager.getConnection(url,uid,pwd); H -t" Z}
2)用jndi(java的命名和目录服务)方式 s7s@!~
例子 lX/:e=
String jndi = "jdbc/db"; wG
X\ub#!
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 5v"S v
DataSource ds = (DataSource) ctx.lookup(jndi); %nhE588xf
Connection cn = ds.getConnection(); O:jaA3
多用于jsp中 gb}>x O
2、执行sql语句 C^7M>i
1)用Statement来执行sql语句 csj4?]gI
String sql; )}1S
`*J/O
Statement sm = cn.createStatement(); b_']S0$c\
sm.executeQuery(sql); // 执行数据查询语句(select) ?6 //'bO:%
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); a\tv,Lx
2)用PreparedStatement来执行sql语句 WP >VQZ&
String sql; t(Gg
1
sql = "insert into user (id,name) values (?,?)"; n..R'vNj
PreparedStatement ps = cn.prepareStatement(sql); !'*1;OQ
ps.setInt(1,xxx); 3Uy(d,N
ps.setString(2,xxx); z?
Ck9
... 7',WLuD
ResultSet rs = ps.executeQuery(); // 查询 . H9a
int c = ps.executeUpdate(); // 更新 b}J,&eYD
#]z_pp:
3、处理执行结果 zj2l&)N
查询语句,返回记录集ResultSet EM!9_8 f
更新语句,返回数字,表示该更新影响的记录数 >r.W \
ResultSet的方法 VF:95F;@
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 0X4I-xx#
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 w3jcit|
XPT@ LM
4、释放连接 m.ejGm?
cn.close(); =DwY-Ex
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Lc_cB`
);d"gv(]D
可滚动、更新的记录集 4rUOk"li
1、创建可滚动、更新的Statement aRcVoOq
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 0gH;y+\=*
该Statement取得的ResultSet就是可滚动的 e@{Rlz
2、创建PreparedStatement时指定参数 #sM*<2vj
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); DhN<e7c`
ResultSet.absolute(9000); *H~&hs>k
批量更新 3M5wF6nY[[
1、Statement nx@,oC4
Statement sm = cn.createStatement(); Y'76! Y
sm.addBatch(sql1); USzO):o
sm.addBatch(sql2); oW3|b2D
... m-lTXA(
sm.executeBatch() DVjwY_nG7
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 1@xdzKua1
2、PreparedStatement v0KJKrliGO
PreparedStatement ps = cn.preparedStatement(sql); k1~? }+<e
{ ="de+S8W
ps.setXXX(1,xxx); >*WT[UU
... S#nW )=
ps.addBatch(); B!((N{4H+
} "mc ]^O
ps.executeBatch(); o8fY!C)
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 }A&I@2d
q,>4#J[2;s
事务的处理 @bZ,)R
1、关闭Connection的自动提交 @|<qTci
cn.setAutoCommit(false); _&aPF/
2、执行一系列sql语句 ,$Xhwr
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close uLSuY}K0
Statement sm ; Y=Om0=v
sm = cn.createStatement(insert into user...); /]-a 1
sm.executeUpdate(); \WxBtpbQB
sm.close(); 6@FGt3y
sm = cn.createStatement("insert into corp...); I-m Bj8^;
sm.executeUpdate(); id[caP=`
sm.close(); '3fN2[(
3、提交 ~ nb1c:F
cn.commit(); ;lf $)3%[
4、如果发生异常,那么回滚 Z6 E_Y?
cn.rollback();