java 数据库基本操作 :.+?v*%;n
1、java数据库操作基本流程 v=~=Q*\l
2、几个常用的重要技巧: cN{-&\
6L
可滚动、更新的记录集 .Fy f4^0
批量更新 Uv-xP(X
事务处理 osJ;"B36
UO&
p2
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 JERWz~n}
1、取得数据库连接 6L~tUe.G
1)用DriverManager取数据库连接 !lf:x
例子 5 E%dF9q
String className,url,uid,pwd; }/%(7Ff{
className = "oracle.jdbc.driver.OracleDriver"; r] +V:l3
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 8qEK6-
uid = "system"; `z=I}6){
pwd = "manager"; ml|[xM8
Class.forName(className); AU@XpaPWh
Connection cn = DriverManager.getConnection(url,uid,pwd); N|,6<|
2)用jndi(java的命名和目录服务)方式 e6n^l$'
例子 zk[%YG&
String jndi = "jdbc/db"; v;9VX
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); V8z91
DataSource ds = (DataSource) ctx.lookup(jndi); ]Y3|*t(\
Connection cn = ds.getConnection(); n%Vt r
多用于jsp中 b ;Vy=f
2、执行sql语句 S >P TD@
1)用Statement来执行sql语句 Lmy ^/P%
String sql; ugM,wT&~Y
Statement sm = cn.createStatement(); dz',!|>
sm.executeQuery(sql); // 执行数据查询语句(select) v@43%`"Gj
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ~$0Qvyb>
2)用PreparedStatement来执行sql语句 |/?)u$U<
String sql; B}.G(-u?7
sql = "insert into user (id,name) values (?,?)"; r$~w3yN)v
PreparedStatement ps = cn.prepareStatement(sql); N{]|!#
ps.setInt(1,xxx); {e4ILdXM
ps.setString(2,xxx); f!`,!dZgkd
... 4MVa[0Y
ResultSet rs = ps.executeQuery(); // 查询 DcN s`2
int c = ps.executeUpdate(); // 更新 M'=27!D^
2EubMG
3、处理执行结果 3
;F=EMz{
查询语句,返回记录集ResultSet sLV bFN`
更新语句,返回数字,表示该更新影响的记录数 ^AWM/aY
ResultSet的方法 GdqT4a\S
1、next(),将游标往后移动一行,如果成功返回true;否则返回false oEHUb?(p
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Y
9eGDpW
U$J l5[`F^
4、释放连接 nj*B-M\p
cn.close(); H1PW/AW
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection *pMgjr
9w
-t9X>X
可滚动、更新的记录集 (mvAEN+y
1、创建可滚动、更新的Statement -f.<s!a
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Tc6H%itV
该Statement取得的ResultSet就是可滚动的 PrIS L[@
2、创建PreparedStatement时指定参数 !b"#`O%`
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); E%M~:JuKd?
ResultSet.absolute(9000); ':71;^zXf
批量更新 Q"UQv<
1、Statement G)b6Rit
Statement sm = cn.createStatement(); :^DuB_
sm.addBatch(sql1); ellj/u61bj
sm.addBatch(sql2); V4GcW|P4y
... eKlh }v
sm.executeBatch() #c5 NFU}9
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 C3af>L@}
2、PreparedStatement =GpO}t">
PreparedStatement ps = cn.preparedStatement(sql); a;eV&~
{ Kc= &jCn
ps.setXXX(1,xxx); tVUoUl
... o$4n D#P3
ps.addBatch(); n&x#_B-
} 5N(/K. ^
ps.executeBatch(); 3QDz0ct
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 -Cxk#-sb#
n&=3Knbd@d
事务的处理 lvi~GZ
1、关闭Connection的自动提交 C7`FM@z
cn.setAutoCommit(false); r%hnl9
2、执行一系列sql语句 BzL>,um
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Qo{Ez^q@J
Statement sm ; Oslbt8)U6
sm = cn.createStatement(insert into user...); d18%zY>
sm.executeUpdate(); 2G8f4vsC[
sm.close(); U}7a;4?
sm = cn.createStatement("insert into corp...); }O<u
sm.executeUpdate(); V.kUFTCvf
sm.close(); ![Z'jCpy
3、提交 =<I 90j~)
cn.commit(); tY<D\T
4、如果发生异常,那么回滚 !tGXh9g
cn.rollback();