java 数据库基本操作 >}Fe9Y.o
1、java数据库操作基本流程 oF8#gn_
2、几个常用的重要技巧: {p-&8-
可滚动、更新的记录集 Y2HF
批量更新 rISg`-
事务处理 ZXlW_CGO
v?vm-e
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 G?v]p~6
1、取得数据库连接 `2()Vf
1)用DriverManager取数据库连接 5Ay\s:hb[u
例子 :>+}|(v
String className,url,uid,pwd; XcD$xFDZ
className = "oracle.jdbc.driver.OracleDriver"; K`Vi5hR~c
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; TldqF BX
uid = "system"; +O8rjVg)
pwd = "manager"; RutRA
Class.forName(className); B}Qpqa=_c
Connection cn = DriverManager.getConnection(url,uid,pwd); HN?NY
2)用jndi(java的命名和目录服务)方式 -T$%MX
例子 OXAr..
String jndi = "jdbc/db"; INt]OPD
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 8&t3a+8l
DataSource ds = (DataSource) ctx.lookup(jndi); [+j}:u
Connection cn = ds.getConnection(); SoC3)iqv/
多用于jsp中 l3[2b
Qx
2、执行sql语句 :QGgtTEV""
1)用Statement来执行sql语句 )i|0Ubn[|
String sql; S+9}W/
Statement sm = cn.createStatement(); #k?uY g8
sm.executeQuery(sql); // 执行数据查询语句(select) F8Y_L\q
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); &![3{G"+>l
2)用PreparedStatement来执行sql语句 O1xK\ogv
String sql; {^(h*zxn
sql = "insert into user (id,name) values (?,?)"; >JVdL\3
PreparedStatement ps = cn.prepareStatement(sql); /h6K"w=='!
ps.setInt(1,xxx); lFJDdf2:$C
ps.setString(2,xxx); 8U86-'Pq
... aq,Ab~V]
ResultSet rs = ps.executeQuery(); // 查询 ?/3'j(Gk
int c = ps.executeUpdate(); // 更新 Fw.df<
skeH~-`M@
3、处理执行结果 3:wN^!A}ve
查询语句,返回记录集ResultSet ; ,9:1.L
更新语句,返回数字,表示该更新影响的记录数 \k
9EimT}
ResultSet的方法 %7}ibz4iF
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Rq`d I~5!b
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 "WF@T
Te d1Ky2O
4、释放连接 +%sMd]$,n
cn.close(); Gv\39+9=
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 2pQ29
IEmjWw4
可滚动、更新的记录集 omu)s
'8
1、创建可滚动、更新的Statement }z,f8Yz
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); e|1.-P@
该Statement取得的ResultSet就是可滚动的 0&Z+P?Wb4
2、创建PreparedStatement时指定参数 Gov]^?^D-
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); jCp^CNbA
ResultSet.absolute(9000); Wd>gOE
批量更新 Ci9]#)"c
1、Statement )i/x%^ca$
Statement sm = cn.createStatement(); rK~Obv
sm.addBatch(sql1); taBCE?{
sm.addBatch(sql2); 2I$-&c]
... 328gTP1
sm.executeBatch() Wj INY
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 &"6%D|Z0
2、PreparedStatement 5c
($~EFr
PreparedStatement ps = cn.preparedStatement(sql); wNm 1H[{
{ AFdBf6/"i
ps.setXXX(1,xxx); =wquFA!c
... rO[ Zx'a
ps.addBatch(); $+WMKv@<
} hqc)Ydg_%
ps.executeBatch(); irooFR[L9
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 68QA%m'J
}AGdWt@
事务的处理 >NJ`*M
1、关闭Connection的自动提交 \Xpq=2`
cn.setAutoCommit(false); z8JdA%YBM
2、执行一系列sql语句 IA~wmOF
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close U2CCjAgRs
Statement sm ; yL#2|t(
sm = cn.createStatement(insert into user...); kWZ/O
sm.executeUpdate(); i%#
<Hi7
sm.close(); 9B9:lR
sm = cn.createStatement("insert into corp...); Bhf4 /$
sm.executeUpdate(); s#>``E!
sm.close(); dkAY%z two
3、提交 _i pY;
cn.commit(); GF17oMi
4、如果发生异常,那么回滚 ?TMrnR/d
cn.rollback();