java 数据库基本操作 O4mWsr
1、java数据库操作基本流程 aKr4E3`
2、几个常用的重要技巧: n :kxG
可滚动、更新的记录集 ~36XJ
批量更新 uoc-qmm
事务处理 )@M|YM1+
*9^k^h(r&4
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ,1h(k<-
1、取得数据库连接 c{ (%+
1)用DriverManager取数据库连接 ')~HOCBSE
例子 IWnW(>V
String className,url,uid,pwd; D"5~-9<
className = "oracle.jdbc.driver.OracleDriver"; :$d 3a"]
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 1nG"\I5N}
uid = "system"; rVmO/Y#Hx$
pwd = "manager"; y%Ah"UY
Class.forName(className); aKcV39brr
Connection cn = DriverManager.getConnection(url,uid,pwd); Q-CVq_\3I
2)用jndi(java的命名和目录服务)方式 Gl1$W=pR:
例子 Ia"
Mi+{
String jndi = "jdbc/db"; $7g(-W
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ^@eCT}p{
DataSource ds = (DataSource) ctx.lookup(jndi); zxHfQ(
Connection cn = ds.getConnection(); Y:BrAa[
多用于jsp中 24l9/v'
2、执行sql语句 K*RRbtb
1)用Statement来执行sql语句 FQ^uX]<3j
String sql; ^S$w,
Statement sm = cn.createStatement(); mt7:`-
sm.executeQuery(sql); // 执行数据查询语句(select) :7*\|2zA
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); r${a
S@F
2)用PreparedStatement来执行sql语句 <!$Cvx\U
String sql; wt,N<L
sql = "insert into user (id,name) values (?,?)"; {
)K(}~VD
PreparedStatement ps = cn.prepareStatement(sql); m!if_Iq
ps.setInt(1,xxx); "$9ZkADO
ps.setString(2,xxx); .<hv&t
... l>q.BG
ResultSet rs = ps.executeQuery(); // 查询 V^5 t~)#46
int c = ps.executeUpdate(); // 更新 Cvy;O~)
]UTP~2N
3、处理执行结果 /m:}rD
查询语句,返回记录集ResultSet 8yl/!O,v
更新语句,返回数字,表示该更新影响的记录数 tJ3s#q6
ResultSet的方法 EB,>k1IJ
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Yb*}2
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Xu0*sQK
#y%Ao\~kG
4、释放连接 =B2=UF
cn.close(); vS<e/e+
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ST.W{:X
qxh\umm+2
可滚动、更新的记录集 RzRLrfV
1、创建可滚动、更新的Statement ' 'N@ <|
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); S?$T=[yY)
该Statement取得的ResultSet就是可滚动的 )I_I?e
2、创建PreparedStatement时指定参数 af{K4:I
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); c8MNo'h
ResultSet.absolute(9000); *x!5I$~J
批量更新 UI'eD)WR
1、Statement B$j,: ^
Statement sm = cn.createStatement(); =r8(9:F!
sm.addBatch(sql1); c:5BQr
'
sm.addBatch(sql2); ]T`qPIf;yJ
... 7ac3N
sm.executeBatch() /8R1$7
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 9G9lSj5>
2、PreparedStatement '@bA_F(
PreparedStatement ps = cn.preparedStatement(sql); zvWQ&?&o2
{ 38^_(N
ps.setXXX(1,xxx); #'oKkrl
... [g_@<?zg
ps.addBatch(); 7)#/I
} 4B]a8
ps.executeBatch(); @hv]
[(<
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 -Zh+5;8g
f5v|}gMAX
事务的处理 *']RYu?X
1、关闭Connection的自动提交 @P>@;S
cn.setAutoCommit(false); C+j+q648>
2、执行一系列sql语句 `{":*V
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ufOaD7
Statement sm ; 8*ysuL#
sm = cn.createStatement(insert into user...); `P~RG.HO
sm.executeUpdate(); nq;)!Wry
sm.close(); U_?RN)>j
sm = cn.createStatement("insert into corp...); w,7
GC5j\
sm.executeUpdate(); 3z<t#
sm.close(); tuSgh!
3、提交
LWE
!+(n
cn.commit(); '7^_$M3$\
4、如果发生异常,那么回滚 :|g{gi
cn.rollback();