java 数据库基本操作 )A%* l9\nG
1、java数据库操作基本流程 y$bY
8L
2、几个常用的重要技巧: $T#fCx/
可滚动、更新的记录集 5-ED\-
批量更新 {tl{j1d|
事务处理 _yJz:pa
?<BI)[B
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 %'i_iF8.
1、取得数据库连接 Q\}-MiI/
1)用DriverManager取数据库连接 SrB>_0**
例子 f8SO:ihXL
String className,url,uid,pwd; IY8<^Q']
className = "oracle.jdbc.driver.OracleDriver"; i].E1},%
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; TmftEw>u
uid = "system"; z;P#
pwd = "manager"; F!g1.49""
Class.forName(className); rNJU &
.]
Connection cn = DriverManager.getConnection(url,uid,pwd); o~e_M-
2)用jndi(java的命名和目录服务)方式 !hM`Oe`S
例子 ;-JF b$m
String jndi = "jdbc/db"; !ht2*8$lQ
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Wu<;QY($5
DataSource ds = (DataSource) ctx.lookup(jndi); @k)J
i!7
Connection cn = ds.getConnection(); P7zUf
多用于jsp中 6M`gy|"(~
2、执行sql语句 )eT>[['fm
1)用Statement来执行sql语句 hu} vYA7ZH
String sql; :j .:t
Statement sm = cn.createStatement(); tY]?2u%)
sm.executeQuery(sql); // 执行数据查询语句(select) N>YSXh`W`y
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); uF|_6~g
2)用PreparedStatement来执行sql语句 i/n
ee_
String sql; ZO/Jf Jn~
sql = "insert into user (id,name) values (?,?)"; _q1\8y
PreparedStatement ps = cn.prepareStatement(sql); "adic?5
ps.setInt(1,xxx); )`{m |\b
ps.setString(2,xxx); xM!9$v
... VD@$y^!H
ResultSet rs = ps.executeQuery(); // 查询 <uS/8MP{
int c = ps.executeUpdate(); // 更新 3Mm_xYDud
J^CAQfcx
3、处理执行结果 eR>8V8@
查询语句,返回记录集ResultSet %AtT(G(n
更新语句,返回数字,表示该更新影响的记录数 L7aVj&xM
ResultSet的方法 s@iY'11
1、next(),将游标往后移动一行,如果成功返回true;否则返回false o6;
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Z2yO /$<
4H,c;g=!
4、释放连接 p`A2^FS)
cn.close(); QD{1?aY
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection VpYD/Oj4;
r5UVBV8T
可滚动、更新的记录集 (0#$%US\
1、创建可滚动、更新的Statement *yw!Y{e!9
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); U^GVz%\
该Statement取得的ResultSet就是可滚动的 axt;}8
2、创建PreparedStatement时指定参数 ]S]W|m7=.Z
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); J
;z`bk^
ResultSet.absolute(9000); l3ogMRq@
批量更新 Kw;gQk~R!
1、Statement u6?9#L(
Statement sm = cn.createStatement(); *S.FM.r
sm.addBatch(sql1); 8@LWg d
sm.addBatch(sql2); 2cQ~$
... 6lg]5d2CD
sm.executeBatch() n{MTh_C4n
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 EATVce]T
2、PreparedStatement #oa>Z.?_V
PreparedStatement ps = cn.preparedStatement(sql);
D8u`6/^
{ r ~UDK]?V
ps.setXXX(1,xxx); )sdHJ
... w.aEc}@(^
ps.addBatch(); DpA)Vdj
} e21J9e6z
ps.executeBatch(); '"\n,3h
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 tbR
^78N25RU(
事务的处理 ;Wy03}K4J
1、关闭Connection的自动提交 hZ>m:es
cn.setAutoCommit(false); KWjhkRK4]
2、执行一系列sql语句 g9JZ#B gZ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 7?uDh'utt
Statement sm ; ]g ;+7
sm = cn.createStatement(insert into user...); b(R.&X
sm.executeUpdate(); ko[d axUB
sm.close(); =hb)e}l
sm = cn.createStatement("insert into corp...); !',%kvJI
sm.executeUpdate(); b/m.VL
sm.close(); BQ u8$W
3、提交 {D",ao
cn.commit(); @ewi96
4、如果发生异常,那么回滚
X)iI]
cn.rollback();