java 数据库基本操作 0)`{]&
1、java数据库操作基本流程 u[q1]]
2、几个常用的重要技巧: -B-?z?+(O
可滚动、更新的记录集 YjN2 ,Xi
批量更新 !
/;@kXN
事务处理 Fk@A;22N
i_Dv+^&zV
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 /. GHR
1、取得数据库连接 FtXd6)_S
1)用DriverManager取数据库连接 d0$dQg
例子 23 j{bK
String className,url,uid,pwd; SQhk)S
className = "oracle.jdbc.driver.OracleDriver"; j&6'sg;n)
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 2`hc0
IE
uid = "system"; C` ?6`$Y
pwd = "manager"; 86NAa6BW
Class.forName(className); k~Qb"6n2
Connection cn = DriverManager.getConnection(url,uid,pwd); 7\m.xWX e
2)用jndi(java的命名和目录服务)方式 sVtxh]
例子 kY*3)KCp
String jndi = "jdbc/db"; ,S5tkTa
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); z/6/
DataSource ds = (DataSource) ctx.lookup(jndi); {U1
j@pKm
Connection cn = ds.getConnection(); gKy@$at&
多用于jsp中 VU3xP2c:
2、执行sql语句 l!CWE
1)用Statement来执行sql语句 b fy `UZr
String sql; 6X2>zUHR
Statement sm = cn.createStatement(); lPF(&pP
sm.executeQuery(sql); // 执行数据查询语句(select) y`O !,kW
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); }1E'a>^|
2)用PreparedStatement来执行sql语句 Rj 2N+59rg
String sql; 4lhoA
sql = "insert into user (id,name) values (?,?)"; [lZo'o
PreparedStatement ps = cn.prepareStatement(sql); d MQ]=
ps.setInt(1,xxx); ^Y z.,!B[
ps.setString(2,xxx); 5[l9`Cn&A
... gZ%wmY
ResultSet rs = ps.executeQuery(); // 查询 ,_;+H*H>"
int c = ps.executeUpdate(); // 更新 l^aG"")TH.
`X[L62D
3、处理执行结果 m8'B7|s
查询语句,返回记录集ResultSet n!=%MgF'*p
更新语句,返回数字,表示该更新影响的记录数 PhF.\Wb
ResultSet的方法 ReE-I/n8f
1、next(),将游标往后移动一行,如果成功返回true;否则返回false zK`fX
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 5N
"fD{v{
XOgl>1O
4、释放连接 R\k=
CoJJ
cn.close(); pwo5Ij,~q
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ?z3c$}
KNT(lA0s
可滚动、更新的记录集 a)J3=Z-
1、创建可滚动、更新的Statement 9l).L L
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); v
Yt-Nx
该Statement取得的ResultSet就是可滚动的 "{>I5<:t
2、创建PreparedStatement时指定参数 %"tLs%"7=P
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ?w'a^+H
ResultSet.absolute(9000); Lt ;!q b.
批量更新 c4QegN
1、Statement 59K%bz5t
Statement sm = cn.createStatement(); 0"q_c-_Bg
sm.addBatch(sql1);
Td tn-
sm.addBatch(sql2); Y@x }b{3
... `L p3snS
sm.executeBatch() ^.bYLF
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Zwy8SD'L
2、PreparedStatement UB[tYZ
PreparedStatement ps = cn.preparedStatement(sql); ngF5ywIG
{ RDU,yTHq
ps.setXXX(1,xxx); O%? TxzX;
... {TT@Mkz_QC
ps.addBatch(); 6&/H
XqP
} F02S(WWo;
ps.executeBatch(); wq&|V
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 [pMJ9
d$
c@u)m}V
事务的处理 i!8 o(!I
1、关闭Connection的自动提交 ~5Wr
|qg%{
cn.setAutoCommit(false); 'Gwa[ |6i
2、执行一系列sql语句 :&D>?{b0
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close {Ic~}>w
Statement sm ; K..L8#SC
sm = cn.createStatement(insert into user...); U-.?+`
sm.executeUpdate(); &4M0 S+.
sm.close(); ?DPNa
sm = cn.createStatement("insert into corp...); 2 mM0\ja
sm.executeUpdate(); :NB|r
sm.close(); v%RcwVt|
3、提交 vt{s"\f
cn.commit(); ;0*T7l
4、如果发生异常,那么回滚 V9xZH5T8^
cn.rollback();