java 数据库基本操作 #+"D?
1、java数据库操作基本流程 IYptNR
2、几个常用的重要技巧: p|0SA=?k"
可滚动、更新的记录集 >3 p8o@:
批量更新 *hFJI9G
事务处理 UDkH'x$=
+('xzW
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Xsb.xxK.
1、取得数据库连接 (Y&gse1}!
1)用DriverManager取数据库连接 ;gJAxVD<
例子 IwbV+mWQ
String className,url,uid,pwd; Vfq-H /+
className = "oracle.jdbc.driver.OracleDriver"; g(jn
/Cx
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; {KTZSs $n
uid = "system"; hQzT
=0
pwd = "manager"; o4rf[.z
Class.forName(className); bTYR=^9
Connection cn = DriverManager.getConnection(url,uid,pwd); g rQ,J
2)用jndi(java的命名和目录服务)方式 Rdj3dg'<
例子 J+Y?'"r
String jndi = "jdbc/db"; Bq4@I_b
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); #cD$
DA
DataSource ds = (DataSource) ctx.lookup(jndi); )cOBP}j+
Connection cn = ds.getConnection(); ?gK|R
多用于jsp中 :[_k .1-+
2、执行sql语句 f0g_Gn $
1)用Statement来执行sql语句 <[gN4x>'
String sql; :%fnJg(
Statement sm = cn.createStatement(); SZxnYVY
sm.executeQuery(sql); // 执行数据查询语句(select) HsG3s?*
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); V+})$m*>
2)用PreparedStatement来执行sql语句 LsMq&a-j2
String sql; WT 5 2
sql = "insert into user (id,name) values (?,?)"; tC+11M
PreparedStatement ps = cn.prepareStatement(sql); rP(;^8l"
ps.setInt(1,xxx); +r"fv*g"
ps.setString(2,xxx); lYm00v6y
... ^#h ;bX#
ResultSet rs = ps.executeQuery(); // 查询 nGJ+.z
int c = ps.executeUpdate(); // 更新 c;
1f$$>b
'vZWkeo
3、处理执行结果 |F=.NY
查询语句,返回记录集ResultSet 0eA|Uq~
更新语句,返回数字,表示该更新影响的记录数 L[+4/a!HQ
ResultSet的方法 @9]TjZd
1、next(),将游标往后移动一行,如果成功返回true;否则返回false (r.y
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 tOQnxKzu
77]Fp(uI
4、释放连接 6%c]{eTd9
cn.close(); a}k5[)et
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection `- 9p)@'8k
3P'Wk|j
可滚动、更新的记录集 zb!RfQ,
1、创建可滚动、更新的Statement \%W"KLP
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 0o@eE3^
该Statement取得的ResultSet就是可滚动的 %NhZTmWm
2、创建PreparedStatement时指定参数 0)vX
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 6D4u?P,
ResultSet.absolute(9000); `Z@qWB<
批量更新 w/ID yQ
1、Statement pe\]}&
Statement sm = cn.createStatement(); Wjd_|Kui
sm.addBatch(sql1); 5G#2#Al(F
sm.addBatch(sql2); UQT=URS
... \VAS<?3
sm.executeBatch() .T~Oc'wGo
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 *APTgXYR
2、PreparedStatement a0wpsl
iF
PreparedStatement ps = cn.preparedStatement(sql); UtB~joaR
{ _6sSS\
ps.setXXX(1,xxx); s<LYSr d
... :RX zqC
ps.addBatch(); <q4<3A
} VF:<q
ps.executeBatch(); n--s[Kdo8
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 {9./-
)3!z2f: e
事务的处理 Q,>]f@m
1、关闭Connection的自动提交 R6irL!akAd
cn.setAutoCommit(false); yzL6oU-{&
2、执行一系列sql语句 =|3*Y0
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 8/CK(G
Statement sm ; \2 `|eo
sm = cn.createStatement(insert into user...); mv`ND&
sm.executeUpdate(); srIt_Wq
sm.close(); = iWn
T
sm = cn.createStatement("insert into corp...); f2M}N
sm.executeUpdate(); Zx%6pZ(.
sm.close(); R\lUE,o]<q
3、提交 f]kG%JEK
cn.commit(); -j}zr yG-
4、如果发生异常,那么回滚 *)qxrBc0
cn.rollback();