java 数据库基本操作 ]lC%HlID
1、java数据库操作基本流程 m8fj\,X
2、几个常用的重要技巧: g,+e3f
可滚动、更新的记录集 X`D2w:
批量更新 h-P|O6@Ki
事务处理 <c}@lj-j
KyyRHf5
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Y*c]C;%=
1、取得数据库连接 2l)"I
1)用DriverManager取数据库连接 .H)H9cmf
例子 X+;[Gc}(W
String className,url,uid,pwd; ?Zb+xN KJ(
className = "oracle.jdbc.driver.OracleDriver"; dQj/Sr
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; i5}Z k r
uid = "system"; DO:,PZX
pwd = "manager"; bCw{9El!K4
Class.forName(className); ?#K.D vGJ
Connection cn = DriverManager.getConnection(url,uid,pwd); *C*ZmC5
2)用jndi(java的命名和目录服务)方式 GY]P(NU
例子 RM|J |R
String jndi = "jdbc/db"; tY)L^.* 7
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); kZw"a*6
DataSource ds = (DataSource) ctx.lookup(jndi); +5zXbfO
Connection cn = ds.getConnection(); gs'M^|e)
多用于jsp中 -%`~3*L
2、执行sql语句 (TT=i
1)用Statement来执行sql语句 6|jZv~rS$
String sql; ^~H}N$W"-q
Statement sm = cn.createStatement(); eg;7BZim{
sm.executeQuery(sql); // 执行数据查询语句(select) !vwio!
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ]UvB+M]Lv)
2)用PreparedStatement来执行sql语句 6iU&9Z<%
String sql; 8o5[tl
?w
sql = "insert into user (id,name) values (?,?)"; [{7#IZL
PreparedStatement ps = cn.prepareStatement(sql); ps{4_V-3 u
ps.setInt(1,xxx); K}l3t2uk
ps.setString(2,xxx); =
7y-o
... arL>{mj
ResultSet rs = ps.executeQuery(); // 查询 7H3v[ f^Q
int c = ps.executeUpdate(); // 更新 59Pc:Gg;
R0-0
3、处理执行结果 *igmi9A
查询语句,返回记录集ResultSet T3{O+aRt
更新语句,返回数字,表示该更新影响的记录数 TWRP|i!i
ResultSet的方法 z0 9Gp}^;
1、next(),将游标往后移动一行,如果成功返回true;否则返回false oV%:XuywT
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 VExhN';
B(W~]i
4、释放连接 ;"MChk
cn.close(); +dCDk* /m
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 0/Q_%
:
3:WqUb\QK
可滚动、更新的记录集 %OBW/Ti
1、创建可滚动、更新的Statement 0<m7:D
Gd
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); V+`kB3GV
该Statement取得的ResultSet就是可滚动的 gRY#pRT6d
2、创建PreparedStatement时指定参数 <<
6GE
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Cf[tNq
ResultSet.absolute(9000); A^OwT#
批量更新 c]9gf\WW
1、Statement Zy(i_B-b
Statement sm = cn.createStatement(); 5T;LWS
sm.addBatch(sql1); ahl|N`
sm.addBatch(sql2); gnp.!-
... &nmBsl3Q.
sm.executeBatch() c-$rB_t+
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 +fVv H
2、PreparedStatement 1bV
G%N
PreparedStatement ps = cn.preparedStatement(sql); D:@W*,
{ ,%9XG077
ps.setXXX(1,xxx); .Pm5nS
... UXct+l
ps.addBatch(); .\XRkr'-
} ]K(a32V CH
ps.executeBatch(); ,j%\3g`
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 QEJu.o
oZ%uq78#[%
事务的处理 &hWELZe0vv
1、关闭Connection的自动提交 b-&rMML
cn.setAutoCommit(false); iE'_x$i
2、执行一系列sql语句 lju5+0BSb
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 2y!n c%
Statement sm ; Ij#mmj NW
sm = cn.createStatement(insert into user...); {I{ 0rV
sm.executeUpdate(); 6Ryc&z5
sm.close(); |ty&}'6C
sm = cn.createStatement("insert into corp...); )U\i7[k>
sm.executeUpdate(); ]ae(t`\l^
sm.close(); !`{?qQ[=
3、提交 @D9O<x
cn.commit(); zB%~=@Q^6
4、如果发生异常,那么回滚 0!\gK<,z
cn.rollback();