java 数据库基本操作 nq{/fD(2
1、java数据库操作基本流程 7,SQz6]
2、几个常用的重要技巧: ?z1v_Jh
可滚动、更新的记录集 Oin9lg-jR
批量更新 (j'\h/
事务处理 n- 2X?<_Z
>IIq_6Z#
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 To*+Z3Wd
1、取得数据库连接 S[K5ofV
1)用DriverManager取数据库连接 p{L;)WTI
例子 1*8;)#%&
String className,url,uid,pwd; /Q3>w -h
className = "oracle.jdbc.driver.OracleDriver"; $Er=i }`
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; g.&B8e
uid = "system"; C{bxPILw
pwd = "manager"; (S!UnBb&
Class.forName(className); Q~]oN
Connection cn = DriverManager.getConnection(url,uid,pwd); x1eC r_
2)用jndi(java的命名和目录服务)方式 (%fQhQ
例子 ]u5TvI,C
String jndi = "jdbc/db"; Hi09?AX
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); x/O;8^b
DataSource ds = (DataSource) ctx.lookup(jndi); E /H%q|q
Connection cn = ds.getConnection(); 8@rYT5e3c
多用于jsp中 4"2%mx:
2、执行sql语句 )5b_>Uy
1)用Statement来执行sql语句 <'4Wne.z!
String sql; )P(S:x'b0
Statement sm = cn.createStatement(); dq '2y
sm.executeQuery(sql); // 执行数据查询语句(select) .h W>#
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); XN<!.RCw
2)用PreparedStatement来执行sql语句 XKTDBaON
String sql; {}$rN@OM$
sql = "insert into user (id,name) values (?,?)"; ~5HT_B U=
PreparedStatement ps = cn.prepareStatement(sql); @4;'>yr(
ps.setInt(1,xxx); lBfthLBa
ps.setString(2,xxx); \na$Sb+
... tKt}]KHV
ResultSet rs = ps.executeQuery(); // 查询 ]00 so`
int c = ps.executeUpdate(); // 更新 \$_02:#
"zcAYg^U
3、处理执行结果 $jMA(e`Ye0
查询语句,返回记录集ResultSet ~
=u8H
更新语句,返回数字,表示该更新影响的记录数 4;L|Ua
ResultSet的方法 Z+k) N
1、next(),将游标往后移动一行,如果成功返回true;否则返回false h A ){>B<;
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 o:#jvi84F
eF%M2:&c;
4、释放连接 9W=(D|,,
cn.close(); &^$@LH3
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection PaSwfjOnqr
MQP9^+f)O?
可滚动、更新的记录集
{>hxmn
1、创建可滚动、更新的Statement 4dbX!0u1l
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ,?yjsJd.
该Statement取得的ResultSet就是可滚动的 f4p*!e
2、创建PreparedStatement时指定参数 0Ye/
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 0hoMf=bb$
ResultSet.absolute(9000); d`=
~8`
批量更新 sGY}(9ED;
1、Statement C)U4Fr ?E:
Statement sm = cn.createStatement(); M1eh4IVE?
sm.addBatch(sql1); sR/Yv
sm.addBatch(sql2); -Hm"Dx
... .8QhJHwd
sm.executeBatch() ug]2wftlQ
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 fR[8O\U~
2、PreparedStatement J~KO#`
PreparedStatement ps = cn.preparedStatement(sql); c$1u
{ JAHg_!
ps.setXXX(1,xxx); U1:m=!S;x
... WuE]pm]c
ps.addBatch(); &n| <NF
} |y7TYjg6
ps.executeBatch(); M<Bo<,!ua
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 n*9QSyJN]
S!A:/(^WB
事务的处理 @2"uJ6o
1、关闭Connection的自动提交 Ct `)R
cn.setAutoCommit(false); #v(As)4^
2、执行一系列sql语句 DTC
IVLV
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close {qHQ_ _Bl
Statement sm ; YQD`4ND
sm = cn.createStatement(insert into user...); Z><+4
'
sm.executeUpdate(); C5(XZscq
sm.close(); #fF5O2E'3
sm = cn.createStatement("insert into corp...); ?xwi2<zz
sm.executeUpdate(); y"H5>
sm.close(); |\Gkhi>;
3、提交 \'=svJ
cn.commit(); P>q~ocq<
4、如果发生异常,那么回滚 _8$xsj4_
cn.rollback();