java 数据库基本操作 m[s$) -T
1、java数据库操作基本流程 06[HE7
2、几个常用的重要技巧: ZNJ<@K-
可滚动、更新的记录集 lg*?w/JX+
批量更新 `Nv P)|
事务处理 iKG,"
u4ZOHy_O^
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 $0Un'"`S
1、取得数据库连接 mnFmShu
1)用DriverManager取数据库连接 3;3 cTXR?=
例子 5.
+_'bF|
String className,url,uid,pwd; \6%`)p
className = "oracle.jdbc.driver.OracleDriver";
9s?gI4XN
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; NYc ;Zwv9
uid = "system"; Av!xI
pwd = "manager"; m+xub*/
Class.forName(className); HF*j=qt!
Connection cn = DriverManager.getConnection(url,uid,pwd); 0 KA@]!
2)用jndi(java的命名和目录服务)方式 ,>Dpt<
例子 DSlO.)dHu
String jndi = "jdbc/db"; |qpFR)l
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ubMN
DataSource ds = (DataSource) ctx.lookup(jndi); SNSHX2
Connection cn = ds.getConnection(); 9V>C %I
多用于jsp中 2x~Pq_?y
2、执行sql语句 FSYs1Li_C
1)用Statement来执行sql语句 F:8@ ]tA&
String sql; Q;GcV&f;f
Statement sm = cn.createStatement(); 0 gR_1~3
sm.executeQuery(sql); // 执行数据查询语句(select) .9vt<<Kwh
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); _%(.OR
2)用PreparedStatement来执行sql语句 dF*M"|[
String sql; GU]kgwSfi
sql = "insert into user (id,name) values (?,?)"; Xh }G=1}
PreparedStatement ps = cn.prepareStatement(sql); #"fn;
ps.setInt(1,xxx); QwL*A `@
ps.setString(2,xxx); 4K*st8+bl-
... V>c !V9w
ResultSet rs = ps.executeQuery(); // 查询 |-z"6F r-
int c = ps.executeUpdate(); // 更新 m]c1DvQb
Y$s4 *)%
3、处理执行结果 =,8nfJ+x
查询语句,返回记录集ResultSet e$E>6Ngsr
更新语句,返回数字,表示该更新影响的记录数 35 L\
ResultSet的方法 -Ua&/Yd/}
1、next(),将游标往后移动一行,如果成功返回true;否则返回false (L:Mdo
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 |Qn>K
stiYC#b I:
4、释放连接 \["I.gQ
cn.close(); p3e=~{v*
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection taMcm}*T1
tlB-s;
可滚动、更新的记录集 [~c_Aa+6N
1、创建可滚动、更新的Statement $F NH:r<
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); J"$U$.W=
该Statement取得的ResultSet就是可滚动的 >=;hnLu
2、创建PreparedStatement时指定参数 X"7x_yOZ
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 3#y`6e=5
ResultSet.absolute(9000); 5
ed|]LP
批量更新 1DGl[k/zv
1、Statement JP^\
Statement sm = cn.createStatement(); I'[;E.KU
sm.addBatch(sql1); }<&?t;
sm.addBatch(sql2); QL*RzFAD3
... t+\<i8
sm.executeBatch() `I(ap{
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ^# 4e_&4
2、PreparedStatement xzOn[.Fi
PreparedStatement ps = cn.preparedStatement(sql); =woP~+
{ i:jns>E
ps.setXXX(1,xxx);
A[F_x*S
... lCTXl5J5
ps.addBatch(); D1@yW}
4
} fzOh3FO+
ps.executeBatch(); *9aI\#}
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Ya(3Z_f+VZ
2p4iir
事务的处理 '-cayG
1、关闭Connection的自动提交 U@D\+T0
cn.setAutoCommit(false); ?*ZQ:jH
2、执行一系列sql语句 T3LVn<Lm\
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close OR37
Statement sm ; Ql9>i;AGV
sm = cn.createStatement(insert into user...); {Ppb ;
sm.executeUpdate(); fjY:u,5V_
sm.close(); kDxI7$]E
sm = cn.createStatement("insert into corp...); PZO.$'L|7
sm.executeUpdate(); O+/{[9s
sm.close(); e+:X%a4\
3、提交 J^S!GG'gb
cn.commit(); /Ak\Q5O'3
4、如果发生异常,那么回滚 g^7zDU&'
cn.rollback();