java 数据库基本操作 99l>CYXd
1、java数据库操作基本流程 y*VQ]aJ
2、几个常用的重要技巧: ]>R`;"(
可滚动、更新的记录集 KP[NuXA`
批量更新 GI2eJK
事务处理 "3{#d9Gs
>63)z I
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 <*s"e)XeqF
1、取得数据库连接 ^[{`q9A#d
1)用DriverManager取数据库连接
G"o!}
例子 S=0"f}Jo.
String className,url,uid,pwd; 7|&e[@B
className = "oracle.jdbc.driver.OracleDriver"; X,C*qw@
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; B :.@Qi^
uid = "system"; GXDC@+$14
pwd = "manager"; sU) TXL'_!
Class.forName(className); CS/Mpmsp
Connection cn = DriverManager.getConnection(url,uid,pwd); !c3```*
2)用jndi(java的命名和目录服务)方式 EMVk:Vt]
例子 1R0ffP]
String jndi = "jdbc/db"; r\$6'+Si
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); _iG2J&1'L
DataSource ds = (DataSource) ctx.lookup(jndi); tigT@!`$Y
Connection cn = ds.getConnection(); J>rka]*
多用于jsp中 9R9__w;
2、执行sql语句 Y3#Nux%
1)用Statement来执行sql语句 6g5PM4\
String sql; QWrIa1.JC
Statement sm = cn.createStatement(); j$3rJA%rN
sm.executeQuery(sql); // 执行数据查询语句(select) %KGq*|GUu
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); yJ!OsD
2)用PreparedStatement来执行sql语句 Z[",$Lt
String sql; KcC!N{
sql = "insert into user (id,name) values (?,?)"; %'Zc2h&z
PreparedStatement ps = cn.prepareStatement(sql); ,N53Iic
ps.setInt(1,xxx); &4,WG
ps.setString(2,xxx); |u@+`4o
... :.*HQt9N
ResultSet rs = ps.executeQuery(); // 查询 \7pipde
int c = ps.executeUpdate(); // 更新 ~9Zh,p;
>T<6fpXuk2
3、处理执行结果 WfTD7?\dw
查询语句,返回记录集ResultSet 6cM<>&e
更新语句,返回数字,表示该更新影响的记录数 \)ip>{WG
ResultSet的方法 =96G8hlT
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Q,{^S,s<
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 RFw(]o,9cR
Z&_y0W=t
4、释放连接 PK_s#uC
cn.close(); otO
j^xU
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection qAoAUDm
'T\dkSJv;V
可滚动、更新的记录集 )2xE z
1、创建可滚动、更新的Statement QV7,G9
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); cv}aS_`f
该Statement取得的ResultSet就是可滚动的 <OTWT`G2
2、创建PreparedStatement时指定参数 nqT> qS[Z
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); RctU' T
ResultSet.absolute(9000); |,b2b2v?
批量更新 zj<ahg%z
1、Statement \V,c]I
Statement sm = cn.createStatement(); "!O1j
r;
sm.addBatch(sql1); j~bAbOX12
sm.addBatch(sql2); iOX Z]Xj5
... i[\w%(83Fi
sm.executeBatch() r'/\HWNP
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Hkdf $$\
2、PreparedStatement B`fH^N
PreparedStatement ps = cn.preparedStatement(sql);
2nv[1@M
{ x?#I4RJH;
ps.setXXX(1,xxx); U&X2cR &a
... YutQ ]zYA.
ps.addBatch(); @5xu>g Kn
} (Yv{{mIy
ps.executeBatch(); B
MM--y@
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 yGxv?%%2
(&jW}1D
事务的处理 yub{8 f;v
1、关闭Connection的自动提交 v5_7r%Hiw
cn.setAutoCommit(false); "+)K |9T#
2、执行一系列sql语句 #)o7"PW:
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close g+xw$A ou
Statement sm ; Ve}[XqdS^p
sm = cn.createStatement(insert into user...); gxwo4.,
sm.executeUpdate(); FZF @
sm.close(); [#Y' dFQ
sm = cn.createStatement("insert into corp...); RT^v:paNT2
sm.executeUpdate(); uRE*%d>
sm.close(); )P?IqSEA%
3、提交 re^Hc(8M
cn.commit(); >c4/?YV
4、如果发生异常,那么回滚 v?%LQKO
cn.rollback();