java 数据库基本操作 3b)T}g
1、java数据库操作基本流程 oB06{/6
2、几个常用的重要技巧: *!]Epb
可滚动、更新的记录集 199hQxib:
批量更新 _2X6bIE
事务处理 8wpwJs&V
H"GE\
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 7cmr
*y
1、取得数据库连接 ]7S7CVDk4
1)用DriverManager取数据库连接 , HI%Xn
例子 ym*#ZE`B!
String className,url,uid,pwd; Y0X94k.u
className = "oracle.jdbc.driver.OracleDriver"; W[X!P)=w]
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 5?{ >9j5
uid = "system"; _l!U[{l*d
pwd = "manager"; )-?uX.E{
Class.forName(className); J%f=A1Q
Connection cn = DriverManager.getConnection(url,uid,pwd); &PBWJ?@O)r
2)用jndi(java的命名和目录服务)方式 a.}:d30
例子 4R*<WdT(
String jndi = "jdbc/db"; m wEVEx24
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); BRU9LS
DataSource ds = (DataSource) ctx.lookup(jndi); .`Old{<
Connection cn = ds.getConnection(); qe6C|W~n
多用于jsp中 _
U8OIXN
2、执行sql语句 9Ajgfy>
1)用Statement来执行sql语句 $Y 4ch ko
String sql; gc2|V6(
Statement sm = cn.createStatement(); n?e@):
sm.executeQuery(sql); // 执行数据查询语句(select) o eJC
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Z!RRe]"y
2)用PreparedStatement来执行sql语句 `YmI'
String sql; Q0q)n=i}]
sql = "insert into user (id,name) values (?,?)"; )'
x/q
PreparedStatement ps = cn.prepareStatement(sql); H&yFSz}6a
ps.setInt(1,xxx); \|pK Z6*s
ps.setString(2,xxx); wO_pcNYZ8
... A.$VM#
ResultSet rs = ps.executeQuery(); // 查询 1_j<%1{sZ
int c = ps.executeUpdate(); // 更新 Tu=eQS|'
@[>+Dzn[6
3、处理执行结果 uU[[[LQq
查询语句,返回记录集ResultSet bV )PT`-,
更新语句,返回数字,表示该更新影响的记录数 $;)noYo
ResultSet的方法 i^sDh>$J
1、next(),将游标往后移动一行,如果成功返回true;否则返回false qSC~^N`
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 f}lT|.)?VD
DA4edFAuE
4、释放连接 jWv3O&+?X
cn.close(); U8WHE=Kk\h
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ))CXjwLj;
M89-*1
可滚动、更新的记录集 )Vg{Y [!
1、创建可滚动、更新的Statement 8!&ds~?
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); }W@#S_-e8
该Statement取得的ResultSet就是可滚动的 ,Og[[0g
2、创建PreparedStatement时指定参数 VO @
4A6
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); zy5s$f1IA
ResultSet.absolute(9000); fVA=<:
批量更新 cFI7}#,5
1、Statement ^`TKvcgIc
Statement sm = cn.createStatement(); 3D$\y~HU
sm.addBatch(sql1); 4iYKW2a
sm.addBatch(sql2); v't6
yud
... c_-" Qo
sm.executeBatch() ,Y g5X
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 DX&lBV
2、PreparedStatement zO).<xIq+
PreparedStatement ps = cn.preparedStatement(sql); A4#3O5kij
{ mV**9-"
ps.setXXX(1,xxx); -n=$[-w
... "u Of~e"
ps.addBatch(); J I+KS
} eHR&N.2
ps.executeBatch(); <i:*p1#Bm
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 hyk|+z`B
H)j[eZP
事务的处理 _>jrlIfc
1、关闭Connection的自动提交 e}](6"t`5
cn.setAutoCommit(false); i3M?D}(Bs
2、执行一系列sql语句 ]uStn
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close U!a!|s>
Statement sm ; As6)_8w
sm = cn.createStatement(insert into user...); oRT
sm.executeUpdate(); r}_Lb.1]
sm.close(); ;l/}Or2
sm = cn.createStatement("insert into corp...); .y %pGi
sm.executeUpdate(); M9(ez7Z
sm.close(); {.aK{
V
3、提交 W2F+^
cn.commit(); up+.@h{
4、如果发生异常,那么回滚 ?dJ/)3I%F
cn.rollback();