java 数据库基本操作 yXXvs'$R \
1、java数据库操作基本流程 0T1ko,C!,e
2、几个常用的重要技巧: *) }
:l
可滚动、更新的记录集 bHJoEYY^
批量更新 QnP{$rT
事务处理 I)rGOda{
3XGB+$]C
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 55,=[
1、取得数据库连接 2x6<8J8v*
1)用DriverManager取数据库连接
Lxz
例子 :4iU^6
String className,url,uid,pwd; 7y;u} 1
className = "oracle.jdbc.driver.OracleDriver"; yIa[yJq
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; nIR*_<ow
uid = "system"; WT?b Bf
pwd = "manager"; DH/L`$
Class.forName(className); HlF}
Connection cn = DriverManager.getConnection(url,uid,pwd); \boL`X
2)用jndi(java的命名和目录服务)方式 $kIo4$.Y$
例子 %awVVt{aG
String jndi = "jdbc/db"; []rT? -
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ru DP529;
DataSource ds = (DataSource) ctx.lookup(jndi); ?n&$m
Connection cn = ds.getConnection(); _l<|1nH
多用于jsp中 QS5H>5M)
2、执行sql语句 .P8-~?&M
1)用Statement来执行sql语句 mw ?{LT
String sql; }R`Irxv4
Statement sm = cn.createStatement(); 2H3(HZv
sm.executeQuery(sql); // 执行数据查询语句(select) Dw*Arc+3V
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); -}< d(c
2)用PreparedStatement来执行sql语句 :;q>31:h
String sql;
A<2I!
sql = "insert into user (id,name) values (?,?)"; R|$[U
PreparedStatement ps = cn.prepareStatement(sql); xHm/^C&px
ps.setInt(1,xxx); Ou? r {$(b
ps.setString(2,xxx); 2q/nAQ+
... XN4oL[pO
ResultSet rs = ps.executeQuery(); // 查询 e/ WBgiLw
int c = ps.executeUpdate(); // 更新 U|9U(il
m:b^,2"g
3、处理执行结果 6TY){Pw
查询语句,返回记录集ResultSet (lieiye^
更新语句,返回数字,表示该更新影响的记录数 M q76]I%
ResultSet的方法 xkF$D:sP
1、next(),将游标往后移动一行,如果成功返回true;否则返回false jzMhJ
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ~c!Rx'
ot]>}[
4、释放连接 jT{f<P0
cn.close(); Lr wINVa
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection wInY7uBd!
kpl~/i`4
可滚动、更新的记录集 =?wMESU
1、创建可滚动、更新的Statement Gee~>:_Q{J
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); I Jqv w
该Statement取得的ResultSet就是可滚动的 692Rw}/
2、创建PreparedStatement时指定参数 &3WkH W
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 2rF?Q?$,B
ResultSet.absolute(9000); 4 |FRg
批量更新 NP$e-" 1
1、Statement ^v
]UcnB0
Statement sm = cn.createStatement(); `}[VwQ
sm.addBatch(sql1); yLjV[qP
sm.addBatch(sql2); +g)_4fV0|
... N&?T0Ge;
sm.executeBatch() lt{lHat1
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 kV_#9z7%
2、PreparedStatement =d}gv6v2S
PreparedStatement ps = cn.preparedStatement(sql); *Yj~]E0`1
{ +:fqL
ps.setXXX(1,xxx); D&4u63^
... D~5yj&&T;
ps.addBatch(); (D0C#<4P
} 3fm;r5
ps.executeBatch(); u82h6s<'W
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 fS5GICx8R
hyJ
ded&D
事务的处理 79TPg
1、关闭Connection的自动提交 '$n:CNha
cn.setAutoCommit(false); wTB)v !
2、执行一系列sql语句 a3Z:C!|O'
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close mYiSR
Statement sm ; UaH26fWs
sm = cn.createStatement(insert into user...); lTxY6vi
sm.executeUpdate(); @c6"RHG9
sm.close(); c"sj)-_
sm = cn.createStatement("insert into corp...); P#w}3^
sm.executeUpdate(); r hiS
sm.close(); <\E"clZI
3、提交 +8Of-ZUx
cn.commit(); m5X3{[a:
4、如果发生异常,那么回滚 u+I3IdU3
cn.rollback();