java 数据库基本操作 !V,{_(LT
1、java数据库操作基本流程 W"k8KODOY
2、几个常用的重要技巧: Ce")[<:
可滚动、更新的记录集 >+
4huRb
批量更新 9 `w)
事务处理 %B)6$!x
zBJ7(zh!
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 }-o{ASC#
1、取得数据库连接 w&B#goS
1)用DriverManager取数据库连接 ]<q[Do8k
例子 qg}O/K
String className,url,uid,pwd; *L'>U[Pl7
className = "oracle.jdbc.driver.OracleDriver"; jD`d#R
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; NU*fg`w
uid = "system";
u*#ZXW
pwd = "manager"; Hw-Z
Class.forName(className); f4guz
Connection cn = DriverManager.getConnection(url,uid,pwd); Eyh51IB.
2)用jndi(java的命名和目录服务)方式 `QUy;%+
例子 ?w+Ix~k
String jndi = "jdbc/db"; Z t&6Ua[Y}
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); @bnG:np
DataSource ds = (DataSource) ctx.lookup(jndi); K&U7H:
Connection cn = ds.getConnection(); z ly unJD(
多用于jsp中 \a=D
2、执行sql语句 DVkB$2]
1)用Statement来执行sql语句 FA}_(Hf.[
String sql; en:4H
Statement sm = cn.createStatement(); aKd+CO:
sm.executeQuery(sql); // 执行数据查询语句(select) 5n
^TRB
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ^-a8V'
2)用PreparedStatement来执行sql语句 3^Q]j^e4Ny
String sql; ^+1#[E
sql = "insert into user (id,name) values (?,?)"; Q26qNn
bK
PreparedStatement ps = cn.prepareStatement(sql); ]d]JXt?)i
ps.setInt(1,xxx); UEzb^(8>
ps.setString(2,xxx); ,E$@=1)
... _C+b]r/E
ResultSet rs = ps.executeQuery(); // 查询 XbZ*&
int c = ps.executeUpdate(); // 更新 u]ZqOJXxu
KV*xApb9y
3、处理执行结果 }irn'`I
查询语句,返回记录集ResultSet DS%\SrC
更新语句,返回数字,表示该更新影响的记录数 /De^
ResultSet的方法 2AVa(
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ?^EXTU85`"
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 f5GdZ_
6Kj'ZyVL
4、释放连接 rX; Ys2vQ*
cn.close(); \^V`ds*.
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Zxb_K
fI7j):h;
可滚动、更新的记录集 |P.6<
1、创建可滚动、更新的Statement i9D0]3/>
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); k,uK6$Z
该Statement取得的ResultSet就是可滚动的 q;:6_Qr
2、创建PreparedStatement时指定参数 2EK%N'H
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); $
A9%UhV
ResultSet.absolute(9000); f(eQ+0D
批量更新 nWvuaQ0}
1、Statement V&|!RxWK
Statement sm = cn.createStatement(); IB`>'~s&A
sm.addBatch(sql1); "aFhkPdWn
sm.addBatch(sql2); LsM7hLy
... F>X-w+b4r
sm.executeBatch() 5&f{1M6l>
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 P/ oXDI8
2、PreparedStatement tWdhDt8$&
PreparedStatement ps = cn.preparedStatement(sql); Fbp{,V@F2
{ w?,M}=vg
ps.setXXX(1,xxx); Y=T'WNaL)0
... ZK'-U,Y.H7
ps.addBatch(); c0Dmq)HK?
} kpI{KISQu
ps.executeBatch(); P N*JR
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 olW|$?
6ITLGA
事务的处理 .Xdj(_&
1、关闭Connection的自动提交 sncIqsZ
cn.setAutoCommit(false); 4TwQO$C
2、执行一系列sql语句 cFagz* !
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close TbehR:B5g
Statement sm ; P(>(K{v
sm = cn.createStatement(insert into user...); D5an\gE
sm.executeUpdate(); 4"vaMa
sm.close(); 2F8|I7R
sm = cn.createStatement("insert into corp...); ((rv]f{
sm.executeUpdate(); A`u$A9[
sm.close(); '?Jxt:<
3、提交 f2,1<^{
cn.commit(); P=5NKg
4、如果发生异常,那么回滚 =q"eU=9
cn.rollback();