java 数据库基本操作 Z>Mv$F"p:
1、java数据库操作基本流程 va'F '|
2、几个常用的重要技巧: E3]WRF;l
可滚动、更新的记录集 So'.QWzX
批量更新 =4a:)g'
事务处理 fzQR0
$R1I(sJ
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ,0q1Id
1、取得数据库连接 HOF$(86zqA
1)用DriverManager取数据库连接 X["xC3 i
例子 %.<_+V#h
String className,url,uid,pwd; W%-XN
className = "oracle.jdbc.driver.OracleDriver"; ng"=vmu
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ]b!n ;{5
uid = "system"; -` U|5
pwd = "manager"; EZ]4cd/i
Class.forName(className); )J}v.8
Connection cn = DriverManager.getConnection(url,uid,pwd); |uqI}6h.
2)用jndi(java的命名和目录服务)方式 9ziFjP+1
例子 I/MY4?(T
String jndi = "jdbc/db"; IrqM_OjC
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); oDz|%N2s|
DataSource ds = (DataSource) ctx.lookup(jndi); @we1#Vz.
Connection cn = ds.getConnection(); DylO;+
多用于jsp中 C;N6",s!
2、执行sql语句 =abcLrf2G
1)用Statement来执行sql语句 yXJ25Axb
String sql; MMs~f*
Statement sm = cn.createStatement(); /[.V( K
D
sm.executeQuery(sql); // 执行数据查询语句(select) -HG.GA
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); :~vodh
2)用PreparedStatement来执行sql语句 JhFbze>
String sql; |JxVfX8^
sql = "insert into user (id,name) values (?,?)"; KBmO i
PreparedStatement ps = cn.prepareStatement(sql); u ;-&r'J>
ps.setInt(1,xxx); +*]$PVAFA
ps.setString(2,xxx); ,=P&{38\q
... Qs6Vu)U=
ResultSet rs = ps.executeQuery(); // 查询 5M0Q'"`F:
int c = ps.executeUpdate(); // 更新 A51
a/p#
zVq!M-e
3、处理执行结果 f
+{=##'0
查询语句,返回记录集ResultSet <m]0!ii
更新语句,返回数字,表示该更新影响的记录数 =cS&>MT
ResultSet的方法 jtP*C_Scv/
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 25$_tZPAI
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 G?1GkR
>u&D@7~c
4、释放连接 %o0b~R
cn.close(); si]VM_w6
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Fo.Y6/}
]?tRO
可滚动、更新的记录集 -WlYHW
1、创建可滚动、更新的Statement c$Kc,`2m7
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); #1DEZ4]jjY
该Statement取得的ResultSet就是可滚动的 e0zP LU}
2、创建PreparedStatement时指定参数 Z8#nu
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); u
]e-IYH
ResultSet.absolute(9000); OlOOg
批量更新 i/x |c!E
1、Statement x#D%3v"l_*
Statement sm = cn.createStatement(); .B:ZyTI
sm.addBatch(sql1); K381B5_h
sm.addBatch(sql2); J:yv82
... [a2]_]E%
sm.executeBatch() ""0Y^M2I
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Rql/@j`JX
2、PreparedStatement mgAjD.
PreparedStatement ps = cn.preparedStatement(sql); P}v
;d]
{ u2 s
ps.setXXX(1,xxx); pAE
(i7
... e= IdqkJ%
ps.addBatch(); ]F4QZV(
M
} &<VU}c^!
ps.executeBatch(); gjDNl/r/
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 MA`nFkVK
Z-PBCU
事务的处理 '~D4%WKT
1、关闭Connection的自动提交 k$3pmy*
cn.setAutoCommit(false); WNGX`V,d
2、执行一系列sql语句 >Ku4Il+36
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close :?6HG_9X
Statement sm ; pl`4&y%Me
sm = cn.createStatement(insert into user...); &n6{wtBP
sm.executeUpdate(); wk|+[Rl;L
sm.close(); GY%9V5GB
sm = cn.createStatement("insert into corp...); ^k=<+*9
sm.executeUpdate(); NfV|c~?d
sm.close(); v -}f
P
3、提交 EN!C5/M{&
cn.commit(); 41X`.
4、如果发生异常,那么回滚 "cKD#
cn.rollback();