java 数据库基本操作 wB;'+d&
1、java数据库操作基本流程 ep<2u
x
2、几个常用的重要技巧: VoJelyzh
可滚动、更新的记录集 "HQH]?!k
批量更新 mTzzF9n"Y
事务处理 X;ZR"YgT
1!E+(Iq
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 N|ut^X+|\
1、取得数据库连接 ^Q?I8,4}
1)用DriverManager取数据库连接 7^~pOFdH
例子 $bU|'}QR
String className,url,uid,pwd; TvWhy`RQ
className = "oracle.jdbc.driver.OracleDriver"; .#;;pu7W
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; iM Xl}3
uid = "system"; $W8
pwd = "manager"; sS $- PX
C
Class.forName(className); snBC +`-
Connection cn = DriverManager.getConnection(url,uid,pwd); O>Nop5#o
2)用jndi(java的命名和目录服务)方式 X3:-+]6,d
例子 96Tc:#9i
String jndi = "jdbc/db"; N3nk\)V\E
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); /y,~?
DataSource ds = (DataSource) ctx.lookup(jndi); ,diV;d
Connection cn = ds.getConnection(); rY>{L6d
多用于jsp中 F~ n}Ep~1
2、执行sql语句 OwQ 9y<v
1)用Statement来执行sql语句 +mP3y~|-j
String sql; 3X{=*wvt
Statement sm = cn.createStatement(); zy#E qv
sm.executeQuery(sql); // 执行数据查询语句(select) h@z(yB
j:0
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 56o?=|
2)用PreparedStatement来执行sql语句 (0qdU;
String sql; sDCa&"6+@
sql = "insert into user (id,name) values (?,?)"; (o\:rLZu
PreparedStatement ps = cn.prepareStatement(sql); `\&qk)ZP
ps.setInt(1,xxx); {nbD5 ?
ps.setString(2,xxx); Ox&g#,@h
... HFx8v!^5N
ResultSet rs = ps.executeQuery(); // 查询 3yXF|
yV
int c = ps.executeUpdate(); // 更新 q5[%B K
hSD)|
3、处理执行结果 S[NV-)r=
查询语句,返回记录集ResultSet / vge@bsE
更新语句,返回数字,表示该更新影响的记录数 .l*]W!L]
ResultSet的方法 8*)zoT*A
1、next(),将游标往后移动一行,如果成功返回true;否则返回false B{|P}fN5}
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 y-"*[5{W
$xS `i-|
4、释放连接 {61NLF\0H
cn.close(); -?!Z/#i4
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection q01zN:|-1
;2}0Hr'|
可滚动、更新的记录集 ~]A';xH&
1、创建可滚动、更新的Statement
mYb8
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); )j@k[}R#g
该Statement取得的ResultSet就是可滚动的 wLU w'Ai
2、创建PreparedStatement时指定参数 0sq/_S
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); bs]ret$?(q
ResultSet.absolute(9000); Eln"RKCt}9
批量更新 bsPw Tp^
1、Statement c?eV8h1G
Statement sm = cn.createStatement(); ;oULtQ
sm.addBatch(sql1); s iv
KXd
sm.addBatch(sql2); lV$U!v:b
... ,+*8@>c
sm.executeBatch() dp2".
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 8R:H{)o~s}
2、PreparedStatement #joU}Rj|
PreparedStatement ps = cn.preparedStatement(sql); GwwxSB&y
{ OV>T}Fq
ps.setXXX(1,xxx); S,3e|-&$
... h.4;-&
ps.addBatch(); Sd^e!?bp
} Cz?N[dhh
ps.executeBatch(); [gzw<b:`
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 v<tH 3I+
0wZLkU_(
事务的处理 >H5BY9]I
1、关闭Connection的自动提交 ahS*YeS7
cn.setAutoCommit(false); R`ZU'|
2、执行一系列sql语句 [4Glt>Nj>
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close /n?5J`6
Statement sm ; cdP+X'Y4D
sm = cn.createStatement(insert into user...); / vje='[!
sm.executeUpdate(); xHykU;p@
sm.close(); XT~JP
sm = cn.createStatement("insert into corp...); A>OL5TCl
sm.executeUpdate(); :'I mz
sm.close(); k%:]PQjYT
3、提交 5&2=;?EO
cn.commit(); qJ"dkT*
4、如果发生异常,那么回滚 fPK|Nw]b
cn.rollback();