java 数据库基本操作 0Q1FL MLV
1、java数据库操作基本流程 Zn:R
PMk*
2、几个常用的重要技巧: Xqp|VbDca
可滚动、更新的记录集 {P8[X@Lu
批量更新 wI M{pK
事务处理 {"*VU3%q
u{&B^s)k.
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Uu6L~iB
1、取得数据库连接 ?:^mBb)T
1)用DriverManager取数据库连接 0)YbI!
例子 v8>v.}y
String className,url,uid,pwd; ->-*]-fv[L
className = "oracle.jdbc.driver.OracleDriver"; `Yc_5&"
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; aRj>iQaddx
uid = "system"; s30
O@M))
pwd = "manager"; K*K1(_x=
Class.forName(className); |sqZ $Mu
Connection cn = DriverManager.getConnection(url,uid,pwd); ,p{`pma
2)用jndi(java的命名和目录服务)方式 N;F)jO
xsl
例子 {s,+^7
String jndi = "jdbc/db"; 2.}R
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); y;"
n9
DataSource ds = (DataSource) ctx.lookup(jndi); O|kKwadC
Connection cn = ds.getConnection(); 3HG;!D~m;
多用于jsp中 fLN! EDq
2、执行sql语句 \a"Ct'
1)用Statement来执行sql语句 P#kGX(G9!
String sql; W:&R~R
Statement sm = cn.createStatement(); maMHZ\Q
sm.executeQuery(sql); // 执行数据查询语句(select) %/"Oxi^G
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ${~|+zdB
2)用PreparedStatement来执行sql语句 J}spiVM
String sql; ~+D*:7Y_
sql = "insert into user (id,name) values (?,?)"; CDMfa&;T
PreparedStatement ps = cn.prepareStatement(sql); [c K^+s)N
ps.setInt(1,xxx); U3;aLQ*
ps.setString(2,xxx); g]mtFrP
... }`/gX=91
ResultSet rs = ps.executeQuery(); // 查询 $KV&\Q3\0
int c = ps.executeUpdate(); // 更新 L/}iy}
1N`vCt]w
3、处理执行结果 KHiFJ_3
查询语句,返回记录集ResultSet KM?1/KZ/~
更新语句,返回数字,表示该更新影响的记录数 %:6?Y%`*[
ResultSet的方法 AWr}"r?s
1、next(),将游标往后移动一行,如果成功返回true;否则返回false =Cf]
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 db=$zIB[:
qG8s;_G
4、释放连接 r >{G`de4
cn.close(); 0V,Nv9!S
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 6y+b5-{'
wjU.W5IR
可滚动、更新的记录集 UP1?5Q=H]Q
1、创建可滚动、更新的Statement cleOsj;S
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); .,2V5D-${
该Statement取得的ResultSet就是可滚动的 HP2wtN{Zs
2、创建PreparedStatement时指定参数 F:FMeg
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); b=##A
ResultSet.absolute(9000); 8@K^|xeQ
批量更新 q?{}3 dPC
1、Statement 6o3T;h
Statement sm = cn.createStatement(); q1Qje%9@t
sm.addBatch(sql1); S*W;%J5
sm.addBatch(sql2); 0O@_cW
... y+mElG$F
sm.executeBatch() To"dG&h
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 D=?{8 'R'
2、PreparedStatement oT+(W,G
PreparedStatement ps = cn.preparedStatement(sql); }F1s
tDx
{ PB'0?b}fab
ps.setXXX(1,xxx); J07O:cjyu
... mL L$|
ps.addBatch(); %5 </d5.
} R|,7d:k
ps.executeBatch(); x2wg^$F*oO
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 X33v:9=
N{akg90
事务的处理 HQVh+ (
1、关闭Connection的自动提交 0A$SYF$O+[
cn.setAutoCommit(false); oN2=DYC41
2、执行一系列sql语句 iSp
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close e=f .y<
Statement sm ; 8:;#,Urr
sm = cn.createStatement(insert into user...); ?qHF}k|
sm.executeUpdate(); eMMx8E)B
sm.close(); LVtu*k
sm = cn.createStatement("insert into corp...); 9Ld9N;rWm#
sm.executeUpdate(); <bmLy_":
sm.close(); hq_~^/v\
3、提交 )@7DsV/M
cn.commit(); ija:H'j
4、如果发生异常,那么回滚 s${_K* g6
cn.rollback();