java 数据库基本操作 5))?,YkrrI
1、java数据库操作基本流程 np)-Yzr
2、几个常用的重要技巧: a Y{E'K=
可滚动、更新的记录集 S :oZ&
批量更新 P}aJvFlmP
事务处理 T!/$@]%\7
ZegsV|
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 H,\c"
1、取得数据库连接 X}?cAo2N
1)用DriverManager取数据库连接 op"Cc
例子 AWf zMJ;VS
String className,url,uid,pwd; SmtH2%y I
className = "oracle.jdbc.driver.OracleDriver"; q Rtgk
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; .[CXW2k
uid = "system"; 4>,
<b1Y
pwd = "manager"; S&]JY
Class.forName(className); QtX ->6P>
Connection cn = DriverManager.getConnection(url,uid,pwd); n*-#VKK^
2)用jndi(java的命名和目录服务)方式 m_St"`6 .
例子 <27e7H*6
String jndi = "jdbc/db"; 7dW9i7Aj
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ) d\Se9!
DataSource ds = (DataSource) ctx.lookup(jndi); E8?Q>%_
Connection cn = ds.getConnection(); 0gt/JI($
多用于jsp中 H:0-.a^ZS
2、执行sql语句 )6!SFj>.O
1)用Statement来执行sql语句 OBj.-jL
String sql; snN1
Statement sm = cn.createStatement(); P;A"`Il
sm.executeQuery(sql); // 执行数据查询语句(select) N\xqy-L9
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); D* Vr)J
2)用PreparedStatement来执行sql语句 *y`^Fc
String sql; Z\@vN[[
sql = "insert into user (id,name) values (?,?)"; xat)9Yb}0
PreparedStatement ps = cn.prepareStatement(sql); A$^}zP'u0<
ps.setInt(1,xxx); G19FSLrtA
ps.setString(2,xxx); _c%~\LOk
... g fO.Ky6
ResultSet rs = ps.executeQuery(); // 查询 U);
,Opr
int c = ps.executeUpdate(); // 更新 /e\}
qq
O9g{XhMv>f
3、处理执行结果 bz<wihZj
查询语句,返回记录集ResultSet I.\u2B/?
更新语句,返回数字,表示该更新影响的记录数 \yM[?/<
ResultSet的方法 kQ4%J,7e4
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Ij4\* D!
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 dqG+hh^
gS"@P:wYzs
4、释放连接 {;z3$/JB
cn.close(); OlV>zam
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection N%>/
e'(
a0AIq44
可滚动、更新的记录集 PJb_QL!9
1、创建可滚动、更新的Statement hJaqW'S
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY);
F\>`j
该Statement取得的ResultSet就是可滚动的 i8A5m@,G
2、创建PreparedStatement时指定参数 ^t#]E#
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); _}Z*%sT
ResultSet.absolute(9000); &A%#LVjf
批量更新 xb1)ZJH
1、Statement 8xL-j2w
Statement sm = cn.createStatement(); mp@ JsCU
sm.addBatch(sql1); LfF<wDvXf
sm.addBatch(sql2); 'jmcS0f
-
... dJCu`34Y'|
sm.executeBatch() uOZ+9x(
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 lr^-
2、PreparedStatement KnU "49
PreparedStatement ps = cn.preparedStatement(sql); T@k&YJ
{ t6js@Ih
ps.setXXX(1,xxx); :*Ckq~[Hg
... M@csB. '
ps.addBatch(); `W|2Xi=^5
} "7gS*v,r
ps.executeBatch(); ;'cv?3Y
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 \Lh,dZ}d
r;S%BFMJS
事务的处理 #JTi]U6`
1、关闭Connection的自动提交 U:8^>_
cn.setAutoCommit(false); ^S, "iV
2、执行一系列sql语句 #<se0CJB
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close \'1%"JWK
Statement sm ; b6g,mzqu
sm = cn.createStatement(insert into user...); V ;>{-p
sm.executeUpdate(); t F`>.=
sm.close(); tT'd]
sm = cn.createStatement("insert into corp...); `&0?e-
sm.executeUpdate(); kv) LH{
sm.close(); S, Oy}Nv
3、提交
)5]z[sE
cn.commit(); =Jem.Ph
4、如果发生异常,那么回滚 l<v/T
cn.rollback();