java 数据库基本操作 ?(n v_O
1、java数据库操作基本流程 uaz!ze+
2、几个常用的重要技巧: 050,S`%<g8
可滚动、更新的记录集 tHAe
批量更新 L^r & .N\
事务处理 }8POm#
NJ]3qH
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 XT4Gz|k
1、取得数据库连接 .T)wG;+
1)用DriverManager取数据库连接 S8Y\@C?5
例子 -i1 f
]Bd
String className,url,uid,pwd; J!2j]?D/e
className = "oracle.jdbc.driver.OracleDriver"; :.r_4$F:
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; `<7!Rh,tS^
uid = "system"; Ij$C@hH
pwd = "manager"; T@Y, 7ccpd
Class.forName(className); yYaoA/0
Connection cn = DriverManager.getConnection(url,uid,pwd); G[`1Yw$
2)用jndi(java的命名和目录服务)方式 ;1s+1G}_z
例子 #n}~u@,o_
String jndi = "jdbc/db"; 6i2%EC9
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); L7d1)mV
DataSource ds = (DataSource) ctx.lookup(jndi); 7}g4ePYag
Connection cn = ds.getConnection(); |Fi5/$S.
多用于jsp中 1`YU9?
2、执行sql语句 (0B?OkQ
1)用Statement来执行sql语句 DzQ
String sql; l#`G4Vf
Statement sm = cn.createStatement(); &w#!
sm.executeQuery(sql); // 执行数据查询语句(select) j:xC\b47"
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); iaCV8`&q%
2)用PreparedStatement来执行sql语句 ~MBPN4r
String sql; \+l*ZNYM3
sql = "insert into user (id,name) values (?,?)"; N+h05`
PreparedStatement ps = cn.prepareStatement(sql); l?=\9y
ps.setInt(1,xxx); jj1\oyQ8
ps.setString(2,xxx); "4;nnq
... 8!rdqI
ResultSet rs = ps.executeQuery(); // 查询 ICvV}%d
int c = ps.executeUpdate(); // 更新 pF4Z4?W
=E5bM_P<K
3、处理执行结果 __2<v?\
查询语句,返回记录集ResultSet ==& y9e
更新语句,返回数字,表示该更新影响的记录数 Qr9;CVW
ResultSet的方法 ?oFd%|I
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 6,aH[>W
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ,/D}a3JD
Z*q9vX
4、释放连接 gf1+yJ^d!
cn.close(); i=cST8!8N
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection KWZhCS?[(
Zym6btc
可滚动、更新的记录集 qh:Bc$S
1、创建可滚动、更新的Statement 2lCFE)
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 3f] ;y<Km
该Statement取得的ResultSet就是可滚动的 QYboX~g~p
2、创建PreparedStatement时指定参数 0z8?6~M;<
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Jsysk $R
ResultSet.absolute(9000); V`1,s~"q
批量更新 8HQ.MXKP
1、Statement TK
fN`6
Statement sm = cn.createStatement(); )](ls@*
sm.addBatch(sql1); I5_HaC>
sm.addBatch(sql2); /\c'kMAW!
... BG+i tyH
sm.executeBatch() $2Whb!7Z(
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 4P&2Z0
2、PreparedStatement "FWx;65CR
PreparedStatement ps = cn.preparedStatement(sql); u3C_Xz
{ RqtBz3v
ps.setXXX(1,xxx); l! F$V;R
... U}RBgPX!
ps.addBatch(); &ASR2J
} ujZ`T0
ps.executeBatch(); #cu{AdK
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 _cX}!d!j
@"-\e|[N
事务的处理 \</!kY*3@t
1、关闭Connection的自动提交 V0=%$tH
cn.setAutoCommit(false); [b:&y(
2、执行一系列sql语句 gvA}s/
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close -2M~KlYl
Statement sm ; S^eem_C
sm = cn.createStatement(insert into user...); x9vSekV
sm.executeUpdate(); G}fBd
sm.close(); (?fU l$q\
sm = cn.createStatement("insert into corp...); <X:JMj+
sm.executeUpdate(); }l|S]m!
sm.close(); 6OAs%QZ
3、提交 #$I@V4O;#
cn.commit(); D\AVZ76F1
4、如果发生异常,那么回滚 Uj):}xgi'
cn.rollback();