java 数据库基本操作 o]*#|4-
1、java数据库操作基本流程 zc#aQ.
2、几个常用的重要技巧: .q7o7J%
可滚动、更新的记录集 ;7Y4v`m
批量更新 )o8]MWT\;
事务处理 _!*??B6u
C_DXg-a2lu
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 OmX(3>:9
1、取得数据库连接 ueazAsk3g
1)用DriverManager取数据库连接 ]p2M!N,?
例子 ,] ,dOIOwn
String className,url,uid,pwd; 9W<I~
className = "oracle.jdbc.driver.OracleDriver"; >w"k:O17
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; CwVORf,uA
uid = "system"; :Vf :_;
pwd = "manager"; PKM8MYvo
Class.forName(className); 9Iod[ x
Connection cn = DriverManager.getConnection(url,uid,pwd); Lk|%2XGO&
2)用jndi(java的命名和目录服务)方式 nE3'm[)
例子 S20L@e"U
String jndi = "jdbc/db"; `by\@xQ)
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 5b2_{6t
DataSource ds = (DataSource) ctx.lookup(jndi); tk
<R|i
Connection cn = ds.getConnection(); eO:wx.PW
多用于jsp中 7R=cxD&
2、执行sql语句 -?$Hr\
1)用Statement来执行sql语句 z!GLug*j`
String sql; qEoa%O
Statement sm = cn.createStatement(); ?xuhN
G@
sm.executeQuery(sql); // 执行数据查询语句(select) J,k|_JO
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); }XiV$[xHd
2)用PreparedStatement来执行sql语句 .UuCTH;6`
String sql; n^AQ!wC
sql = "insert into user (id,name) values (?,?)"; 2& l~8,
PreparedStatement ps = cn.prepareStatement(sql); hs"=>(P)
ps.setInt(1,xxx); "NamP\hj
ps.setString(2,xxx); hkq[xgX
... ZsPT!l,
ResultSet rs = ps.executeQuery(); // 查询 =i/7&gC
int c = ps.executeUpdate(); // 更新 uxd5 XS
Y&Sk/8
3、处理执行结果 Z'vGX,:
查询语句,返回记录集ResultSet Je#vl4<L
更新语句,返回数字,表示该更新影响的记录数 X^U)j
N2
ResultSet的方法 Kf$%C"
1、next(),将游标往后移动一行,如果成功返回true;否则返回false TYQ7jt0=.-
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 9_z u*
D^knN-nZ*
4、释放连接 g=
ql 3N
cn.close(); ?m?DAd~ZY
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 02_%a1g
#FBq8iJ
可滚动、更新的记录集 U]Vu8$W
1、创建可滚动、更新的Statement [BpIzhy&}
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); L+&eY?A
该Statement取得的ResultSet就是可滚动的 ^Z{W1uYi
2、创建PreparedStatement时指定参数 0]c 2 T
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); s3*h=5bX=
ResultSet.absolute(9000); M@V.?;F},
批量更新 x05yU
1、Statement VE<&0d<
Statement sm = cn.createStatement(); m\88Etl@
sm.addBatch(sql1); o#-K,|-
sm.addBatch(sql2); /^kZ}}9baU
... .'q0*Pe
sm.executeBatch() J<<0U;
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 <=
xmJx-V
2、PreparedStatement +|N!(H
PreparedStatement ps = cn.preparedStatement(sql); >+w(%;i;
{ ,3t('SE
ps.setXXX(1,xxx); 8()L }@y
... 8T:|~%Sw
ps.addBatch(); n\#RI9#\
} \/J7U|@Lt
ps.executeBatch(); ~L G).
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 8 ]N
?X1vU0c
事务的处理 uj_ OWre
1、关闭Connection的自动提交 <(YmkOS+
cn.setAutoCommit(false); Y7yh0r_
2、执行一系列sql语句 4 |ryt4B
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close cvR|qHNX
Statement sm ; !}D!_z,)u
sm = cn.createStatement(insert into user...); Lzzf`jN]
sm.executeUpdate(); uM\(#jZ
sm.close(); m/)Wn
sm = cn.createStatement("insert into corp...); }vRs n-E@
sm.executeUpdate(); =gCv`SFW
sm.close(); bY4~\cP.
3、提交 3d^zLL
cn.commit(); 2Rc'1sCth-
4、如果发生异常,那么回滚 xD}ha
cn.rollback();