java 数据库基本操作 p}X87Zq
1、java数据库操作基本流程 DdBrJ x
2、几个常用的重要技巧: ?+L6o C.;
可滚动、更新的记录集 ..mz!:Zs0
批量更新 x"De
9SB
事务处理 9DE)5/c`v
3_/d=ZI\
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 pz =Wq4l
1、取得数据库连接 %z(=GcWm
1)用DriverManager取数据库连接 X/7 49"23
例子 7s3<}
String className,url,uid,pwd; Nuq/_x
className = "oracle.jdbc.driver.OracleDriver"; W)O'( D
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 6E4 L4Vb
uid = "system"; &>t1A5
pwd = "manager"; Xxw.{2Ji!q
Class.forName(className); :\RB ^3;
Connection cn = DriverManager.getConnection(url,uid,pwd); V@f#/"u'
2)用jndi(java的命名和目录服务)方式 P .( X]+
例子 Us.jyg7_c
String jndi = "jdbc/db"; @S):a`J
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); <Ux;dekz}
DataSource ds = (DataSource) ctx.lookup(jndi); :gv#_[k
Connection cn = ds.getConnection(); .C?g nOq
多用于jsp中 I]1fH
2、执行sql语句 .?NAq[H%
1)用Statement来执行sql语句 `rQl{$9IC
String sql; ? GW3E
Statement sm = cn.createStatement(); e0 EJ[bG
sm.executeQuery(sql); // 执行数据查询语句(select) F4Z0g*^x
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ~=*_I4,+r
2)用PreparedStatement来执行sql语句 Mq$=zsj
String sql; /9Xf[<
sql = "insert into user (id,name) values (?,?)"; !I&Sy]G
PreparedStatement ps = cn.prepareStatement(sql); YgDasKFm'
ps.setInt(1,xxx); nfB9M1Svn
ps.setString(2,xxx); hiuPvi}
... R 5zV=N
ResultSet rs = ps.executeQuery(); // 查询 f;a6ux#
int c = ps.executeUpdate(); // 更新 U5=J;[w}N
Ccmbdw,Z5
3、处理执行结果 $<PVzW,$o
查询语句,返回记录集ResultSet \ S R
更新语句,返回数字,表示该更新影响的记录数 >O=V1
ResultSet的方法 dx}!]_mlZ
1、next(),将游标往后移动一行,如果成功返回true;否则返回false THVF@@q
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 V"73^
^;bkU|(`6
4、释放连接 ~qH@Kz\%
cn.close(); ESI}+
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ,;y^|X
o 8U2vMH
可滚动、更新的记录集 'Ud5;?{
1、创建可滚动、更新的Statement zFIKB9NUn
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ]=Q'1%
该Statement取得的ResultSet就是可滚动的 0kfw8Lon
2、创建PreparedStatement时指定参数 [U0c
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 9mZ1 a6,x
ResultSet.absolute(9000); f[D#QC
批量更新 X)+N>8o?N
1、Statement ^xrR3m*d
Statement sm = cn.createStatement(); &-A7%"
sm.addBatch(sql1); 1;V5b+b
sm.addBatch(sql2); nFSa~M
... wDk[)9#A
sm.executeBatch() 3}Pa,uN
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Xs/hqIXB
2、PreparedStatement K(^x)w r-:
PreparedStatement ps = cn.preparedStatement(sql); Lif mYn[
{ \8!HZei
ps.setXXX(1,xxx); xAflcY>Ozs
... '`u1,h
ps.addBatch(); kcb'`<B
} \N)FUYoHg
ps.executeBatch(); =k
z;CS+
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Jo ^o`9
[nrP;
_
事务的处理 L~~aW0,
1、关闭Connection的自动提交 Df9}YI;?
cn.setAutoCommit(false); Bv3v;^
2、执行一系列sql语句 "7DPsPs
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close <Jx{Uv
Statement sm ; "O`;zC
sm = cn.createStatement(insert into user...); ?W(f%/B#
sm.executeUpdate(); yLP0w^Q
sm.close(); EMo6$(
sm = cn.createStatement("insert into corp...); "M
tQj}
sm.executeUpdate(); >*MB_m2|
sm.close(); '%,Re-8O
3、提交 %j,Ny}a
cn.commit(); 7blZAA?-
4、如果发生异常,那么回滚 ='FEC-f95
cn.rollback();