java 数据库基本操作 &fh.w]\
1、java数据库操作基本流程 O7E;W| ]
2、几个常用的重要技巧: %Td+J`|U+
可滚动、更新的记录集 G>9'5Lt
批量更新 mOgx&ns;j
事务处理 <PH3gyC
W\z L
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 9p!d Q x
1、取得数据库连接 $H
%+k?
1)用DriverManager取数据库连接 Au%Wrk3j
例子 m mw)C"
String className,url,uid,pwd; N$L&|4r
className = "oracle.jdbc.driver.OracleDriver"; !:`Ra
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; a'(lVZA;
uid = "system"; C&qDvvk
pwd = "manager"; gqKC 4'G0
Class.forName(className); 1mkQ"E4
Connection cn = DriverManager.getConnection(url,uid,pwd); zcbA)
2)用jndi(java的命名和目录服务)方式 9;'>\ImI
例子 jFK9?cLT
String jndi = "jdbc/db"; uT@8 _9
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); xQcMQ{&;
DataSource ds = (DataSource) ctx.lookup(jndi); !dYX2!lvT
Connection cn = ds.getConnection(); p2M?pV
多用于jsp中 EC:x,i
2、执行sql语句 sP=2NqU3Q
1)用Statement来执行sql语句 kY0g}o'<
String sql; AF07KA#
Statement sm = cn.createStatement(); S<)RVm,!e
sm.executeQuery(sql); // 执行数据查询语句(select) $]`'Mi
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ~%::r_hQ
2)用PreparedStatement来执行sql语句 Ra*k
String sql; INeWi= 1
sql = "insert into user (id,name) values (?,?)"; %u<&^8EL+#
PreparedStatement ps = cn.prepareStatement(sql); AX^3uRQJ
ps.setInt(1,xxx); xf{C'uF/
ps.setString(2,xxx); 'R-JQE-]
... #m[w=Pu}
ResultSet rs = ps.executeQuery(); // 查询 FlM.D u
int c = ps.executeUpdate(); // 更新 ?`BED6$`G9
Yn?2,^?N
3、处理执行结果 3w6J V+?
查询语句,返回记录集ResultSet `"1{Sx.
更新语句,返回数字,表示该更新影响的记录数 S(YHwH":
ResultSet的方法 xw/h~:NT
1、next(),将游标往后移动一行,如果成功返回true;否则返回false UOOR0$4
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 P+D|_3j
C'xU=OnA8
4、释放连接 jn#N7%{Mk
cn.close(); G> 5=`
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection )PanJHtU
8EVF<@{]
可滚动、更新的记录集 }(hYG"5
1、创建可滚动、更新的Statement *=KexOa9
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Jh/M}%@|
该Statement取得的ResultSet就是可滚动的 Dq_{O
2、创建PreparedStatement时指定参数 4jue_jsle
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); e`gGzyM
ResultSet.absolute(9000); Q?I"J$]&L
批量更新 ADJ5ZD<Q
1、Statement dk,
I?c&
Statement sm = cn.createStatement(); UO7a}Tz<
sm.addBatch(sql1); Iu)(Huv
sm.addBatch(sql2); 2e D\_IW
... S{r)/~/
sm.executeBatch() ^FyvaO
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 R*c0NJF
2、PreparedStatement [b\lcQ8O
PreparedStatement ps = cn.preparedStatement(sql); hr
6LB&d_
{ _|Kv~\G!
ps.setXXX(1,xxx); vVvt
]h
... .w*{=x0k
ps.addBatch(); oW\7q{l2)
} &t=>:C$1Y
ps.executeBatch(); =G3J.S*Riy
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 1V?Sj
6DiA2'{f
事务的处理 Vzv.e6_
1、关闭Connection的自动提交 f%"_U'
cn.setAutoCommit(false); "Ee/q :`
2、执行一系列sql语句 c`N`xU+z
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ]$`s}BN
Statement sm ; o^"d2=
sm = cn.createStatement(insert into user...); 7l|>
sm.executeUpdate(); ~QQ23k&
sm.close(); R4J>M@-0v
sm = cn.createStatement("insert into corp...); 86)
3XE[5
sm.executeUpdate(); hZF&PV5H
sm.close(); Ot:\h
3、提交 ztxQv5=:,
cn.commit(); FlA$ G3
4、如果发生异常,那么回滚 VAB&&AL
cn.rollback();