java 数据库基本操作 AKejWh
1、java数据库操作基本流程 YOd0dKe
2、几个常用的重要技巧: fMy7pXa_
可滚动、更新的记录集 b~z1%?
批量更新 ,aU_bve
事务处理 ^3^n|T7le
"oz qfh
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ^g"G1,[%w
1、取得数据库连接 A7C+-N
1)用DriverManager取数据库连接
T32C=7
例子 S)T~vK(n
String className,url,uid,pwd; iG!tRNQ{y
className = "oracle.jdbc.driver.OracleDriver"; Dqs{n?@n
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; cR*D)'/tl
uid = "system"; ~K 5eO-
pwd = "manager"; X3P~z8_
Class.forName(className); 4 bw8^
Connection cn = DriverManager.getConnection(url,uid,pwd); !"Jne'f
2)用jndi(java的命名和目录服务)方式 Ivmiz{Oii
例子 lQ
{k
String jndi = "jdbc/db"; .i)
H1sD
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); <j+DY@*
DataSource ds = (DataSource) ctx.lookup(jndi); bx#GOK-
Connection cn = ds.getConnection(); !uL z%~F
多用于jsp中 ZBUEg7c
2、执行sql语句 ~xerZQgc
1)用Statement来执行sql语句 Rt} H.D
#
String sql; zW+X5yK
Statement sm = cn.createStatement(); d,tGW
sm.executeQuery(sql); // 执行数据查询语句(select) %wzDBsX
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 9nN$%(EO5;
2)用PreparedStatement来执行sql语句 _0Qp[l-
String sql; 9w9[0BX#
sql = "insert into user (id,name) values (?,?)"; wM9HZraB<
PreparedStatement ps = cn.prepareStatement(sql); @GNNi?EY
ps.setInt(1,xxx); &Op_!]8`U
ps.setString(2,xxx); 9~/k25P
... ;'~U5Po8
ResultSet rs = ps.executeQuery(); // 查询 >4b:`L
int c = ps.executeUpdate(); // 更新 0K<y
}
{OtD+%
3、处理执行结果 M_lQ^7/
查询语句,返回记录集ResultSet &mXJL3iN
更新语句,返回数字,表示该更新影响的记录数 3#<b!Yz
ResultSet的方法 A)/8j2
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ^lud2x$O^C
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 S:aAR*<6
<=[,_P6|
4、释放连接 FrT.<3
cn.close(); {]BPSj{B
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ek\8u`GC
+L03.rf
可滚动、更新的记录集 6[b'60CuZL
1、创建可滚动、更新的Statement jeXP|;#Una
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); C,r[H5G#
该Statement取得的ResultSet就是可滚动的 -}#=L@
2、创建PreparedStatement时指定参数 Jh`Pq,B:
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); W6%\Zwav?)
ResultSet.absolute(9000); ur7sf$
批量更新 ?-C=_eZJ
1、Statement g?&_5)&
Statement sm = cn.createStatement(); 1?%Q"*Y&
sm.addBatch(sql1); s&&8~
)H
sm.addBatch(sql2); 5-qk"@E W
... :59fb"^$
sm.executeBatch() @-ps[b`z
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Hj(ay48
2、PreparedStatement Lu?MRF
f
PreparedStatement ps = cn.preparedStatement(sql); }x!=F<Q!r
{ ]z3!hgTj
ps.setXXX(1,xxx); Ck.LsL-
... rHYSS0*3
ps.addBatch(); s2F<H#
} }.*"ezaZw
ps.executeBatch(); T-,T)R`R
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 +U9m
l Oxz&m
事务的处理 n@%Q 2_
1、关闭Connection的自动提交 t7#lRp&
cn.setAutoCommit(false); r'*x><m'
2、执行一系列sql语句 3kqO5+,C
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ,'!x9 `
Statement sm ; Rn?Yz^
1q
sm = cn.createStatement(insert into user...); ', +YWlW
sm.executeUpdate(); st4z+$L
sm.close(); 3mef;!q
sm = cn.createStatement("insert into corp...); 8[v9|r
sm.executeUpdate(); y950Q%B]
sm.close(); GO&~)Vh&7
3、提交 .kwz$b+h
cn.commit(); fL$U%I3
4、如果发生异常,那么回滚 8`g@
)]Iy
cn.rollback();