java 数据库基本操作 \fr~
1、java数据库操作基本流程 m6K}|j
2、几个常用的重要技巧: 6NuD4Ga
可滚动、更新的记录集 S_4?K)n #
批量更新 ,~$p,ALwN7
事务处理 (sTpmQx,b
Y>T-af49
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 $}q23
1、取得数据库连接 4Zddw0|2
1)用DriverManager取数据库连接 LTCb@L{^i
例子 ~&_z2|UXp
String className,url,uid,pwd; T_
<@..C
className = "oracle.jdbc.driver.OracleDriver"; d-ZJL6-
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; =sU<S,a*
uid = "system"; D~iz+{Q4
pwd = "manager"; -1_)LO&H
Class.forName(className); !bx;Ta.
Connection cn = DriverManager.getConnection(url,uid,pwd); e8!5I,I
2)用jndi(java的命名和目录服务)方式 8oseYH
例子 ")5":V~fN
String jndi = "jdbc/db"; syj0.JD
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); l
-m fFN
DataSource ds = (DataSource) ctx.lookup(jndi); w"|L:8
Connection cn = ds.getConnection(); 1..+F0U
多用于jsp中 a=1@*ID
2、执行sql语句 NC`aP0S
1)用Statement来执行sql语句 nFe<w
String sql; vjCu4+w($Z
Statement sm = cn.createStatement(); aQc leTb
sm.executeQuery(sql); // 执行数据查询语句(select) rmm0/+jY
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); f:w?pE
2)用PreparedStatement来执行sql语句 CL;}IBd a
String sql; OU.6bmWy|
sql = "insert into user (id,name) values (?,?)"; ~2N"#b&J
PreparedStatement ps = cn.prepareStatement(sql); j#x6
ps.setInt(1,xxx); RFc v^Xf
ps.setString(2,xxx); 4Uo&d#o)C-
... su(1<S}
ResultSet rs = ps.executeQuery(); // 查询 rJTa
int c = ps.executeUpdate(); // 更新 F6|]4H.3Q
RVmh6m
3、处理执行结果
(@VMH !3
查询语句,返回记录集ResultSet GPudaF{
更新语句,返回数字,表示该更新影响的记录数 <w9JRpFY
ResultSet的方法 B{#I:Rs9
1、next(),将游标往后移动一行,如果成功返回true;否则返回false vWv"
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 a0E)2vt4
%E>Aw>]v
4、释放连接 hH3RP{'=
cn.close(); s`8= 3]w
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection UHkMn
MrFQ5:=
可滚动、更新的记录集 pa3{8x{9m
1、创建可滚动、更新的Statement iy!=6
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 2- h{N
该Statement取得的ResultSet就是可滚动的
#A/
2、创建PreparedStatement时指定参数 >\#*P'y`d
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); -f^tE,-
ResultSet.absolute(9000); b\!_cb~ "@
批量更新 ie95rZp
1、Statement M"Hf :9Rk
Statement sm = cn.createStatement(); ZJJY8k `
sm.addBatch(sql1); "Gzz4D
sm.addBatch(sql2); lgy<?LI\
... @Uvz8*b6
sm.executeBatch() tSUEZ62EY
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 5Ln,{vsv
2、PreparedStatement G~[x
3L'
PreparedStatement ps = cn.preparedStatement(sql); 1n8/r}q'H
{ &wawr2)}
ps.setXXX(1,xxx); Q"d^_z]K
... &PHTpkaam
ps.addBatch(); Bm<`n;m
} |SSSH
ps.executeBatch(); ,w4(kcg%iQ
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 : *#- %0
o5PO=AN
事务的处理 rXP,\ ]r+
1、关闭Connection的自动提交 AV]2euyn
cn.setAutoCommit(false); my1@41
H
2、执行一系列sql语句 l|[N42+
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close *:7rdzn
Statement sm ; cqkV9f8Ro
sm = cn.createStatement(insert into user...); V2EUW!gn
2
sm.executeUpdate(); f'RX6$}\1X
sm.close(); R) h#Vc(
sm = cn.createStatement("insert into corp...); 'JE`(xD
sm.executeUpdate(); V=l0(03j~
sm.close(); V1zmG y
3、提交 Gb6 'n$g
cn.commit(); _N cR)2
4、如果发生异常,那么回滚 u&vf+6=9Dd
cn.rollback();