java 数据库基本操作 FH,]'
1、java数据库操作基本流程 1rm\ u%
2、几个常用的重要技巧: =tOB fRM
可滚动、更新的记录集 FiUQ2w4
批量更新 ~[ufL25K
事务处理 B0@
Tz39=
M =^d
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 a^%iAe
1、取得数据库连接 pm6#azQ
1)用DriverManager取数据库连接 p) 8S]p]
例子 o$No@~%v
String className,url,uid,pwd; 1h$?,
className = "oracle.jdbc.driver.OracleDriver"; 8o~
NJ 6
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; <mn[-
uid = "system"; Np" p*O
pwd = "manager"; I&1Lm)W&
Class.forName(className); YYe G9yR
Connection cn = DriverManager.getConnection(url,uid,pwd); lz,M$HG<[
2)用jndi(java的命名和目录服务)方式 xi5"?*&Sb
例子 ) D@j6r
String jndi = "jdbc/db"; 7f>=-sv
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); }DhqzKl
DataSource ds = (DataSource) ctx.lookup(jndi); sW]_Ky.]
Connection cn = ds.getConnection(); 2aYBcPFQh#
多用于jsp中 ot}erC2~
2、执行sql语句 xo[o^go
1)用Statement来执行sql语句 .t "VsY|
String sql; ? o"
Vkc:
Statement sm = cn.createStatement(); W"NI^OX
sm.executeQuery(sql); // 执行数据查询语句(select) sA2-3V<t8
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); *] ihc u
2)用PreparedStatement来执行sql语句 jWrU'X
String sql; xp^RAVXq`
sql = "insert into user (id,name) values (?,?)"; \&Yn)|!
PreparedStatement ps = cn.prepareStatement(sql); F3|^b{'zO
ps.setInt(1,xxx); 4aXIRu%#7
ps.setString(2,xxx); _**Nlp*%
... 8
lggGt
ResultSet rs = ps.executeQuery(); // 查询 }S> 4.8
int c = ps.executeUpdate(); // 更新 y!FO
| b'Ut)E
3、处理执行结果 E%mEfj7
查询语句,返回记录集ResultSet nfEbu4|
更新语句,返回数字,表示该更新影响的记录数 $[|(&8+7
ResultSet的方法 e*:K79y
1、next(),将游标往后移动一行,如果成功返回true;否则返回false | v!N1+v0
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 1VJ${\H]
p D<w@2K
4、释放连接 c*IrZm
cn.close(); Pq /5Dy
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 0S{23L4C
-|.NwGh
可滚动、更新的记录集 8 .%0JJ .3
1、创建可滚动、更新的Statement )3h\QE!z
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); sYKx3[ V/
该Statement取得的ResultSet就是可滚动的 2"ax*MQH<^
2、创建PreparedStatement时指定参数 +z;*r8d<X
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); _T\ ~%
ResultSet.absolute(9000); PT/Nz+
批量更新 I6.rN\%b
1、Statement c-+NWC
Statement sm = cn.createStatement(); }A3/(
sm.addBatch(sql1); 7+HK_wNi
sm.addBatch(sql2); $TIeeTB
... v=llg ^
sm.executeBatch() ~o'1PAW7
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 xUdF.c
2、PreparedStatement v)
n-
PreparedStatement ps = cn.preparedStatement(sql); s$M(-"mg
{ dNe!X0[
ps.setXXX(1,xxx); iWCYK7c@.-
... xC)bW,%
ps.addBatch(); B>2R-pa4~
} ` Ig5*X4|
ps.executeBatch(); V*?cMJ_G
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 F^%w%E\
_b&|0j:Ud
事务的处理 m+c-"arIpA
1、关闭Connection的自动提交 uxfh?gsL
cn.setAutoCommit(false); )iN;1>
2、执行一系列sql语句 f}-'67*Y
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close <i~xJi%1#
Statement sm ; \J^#2{d
sm = cn.createStatement(insert into user...); >=@-]X2%j
sm.executeUpdate(); 2`=jKt
sm.close(); zD{]3pg
sm = cn.createStatement("insert into corp...); 4(Lmjue]?
sm.executeUpdate(); @)Vpj\jM-C
sm.close(); :60vbO
3、提交 7H Har'=T
cn.commit(); qDdO-fPev
4、如果发生异常,那么回滚 F-,gj{s
cn.rollback();