java 数据库基本操作 @7<uMasfp
1、java数据库操作基本流程 ,r8Tbk]m
2、几个常用的重要技巧: oD.r`]k
可滚动、更新的记录集 Fmr}o(q1
批量更新 yN6>VD{F
事务处理 Vzl^Ka'
VIJ<``9[
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 8gy_Yj&{P
1、取得数据库连接 @~ETj26U'
1)用DriverManager取数据库连接 S DLvi!y
例子 {d<;BLA
String className,url,uid,pwd; F?-R$<Cn2~
className = "oracle.jdbc.driver.OracleDriver"; aZ|=(]
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 5ZY<JA3
uid = "system"; ye}p~&
pwd = "manager"; >e,mg8u6$
Class.forName(className); $I9qgDJ)
Connection cn = DriverManager.getConnection(url,uid,pwd); &--ej|n
2)用jndi(java的命名和目录服务)方式 )#iq4@)|g
例子 bm% $86
String jndi = "jdbc/db"; }"^'%C8EX
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 9DQa
PA6
DataSource ds = (DataSource) ctx.lookup(jndi); VQ#3#Hj
Connection cn = ds.getConnection(); tmUFT
多用于jsp中 kwpK1R4zs
2、执行sql语句 BV#78,8(
1)用Statement来执行sql语句 cLVe T
String sql; GH1"xR4!
Statement sm = cn.createStatement(); $%R$G`.KM
sm.executeQuery(sql); // 执行数据查询语句(select) ^BQrbY
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); `n5"0QRd
2)用PreparedStatement来执行sql语句 j _L@U2i
String sql; ??60,m:]
sql = "insert into user (id,name) values (?,?)"; qqrq11W
PreparedStatement ps = cn.prepareStatement(sql); %ru;;h
ps.setInt(1,xxx); ?L&|Uw+
ps.setString(2,xxx); UFAL1c<V
... DwHF[]v'
ResultSet rs = ps.executeQuery(); // 查询 b` Hz$8
int c = ps.executeUpdate(); // 更新 _WX tB#
A+J*e
3、处理执行结果 L@`ouQ"sa
查询语句,返回记录集ResultSet :0& X^]\
更新语句,返回数字,表示该更新影响的记录数 *}k;L74|
ResultSet的方法 Sf5X3,Uw
1、next(),将游标往后移动一行,如果成功返回true;否则返回false @Z>ZiU,^
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 D%6;^^WyUx
h.O$]:N
4、释放连接 )q7UxzE+
cn.close(); ./Q,
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ^uv<6
`\Hf]b
可滚动、更新的记录集 ^P151*=D
1、创建可滚动、更新的Statement ;q N+^;,2
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); dT,o=8fg
该Statement取得的ResultSet就是可滚动的 =] *.ZH#h
2、创建PreparedStatement时指定参数 g~(E>6Y
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); [q !TIq
ResultSet.absolute(9000); <! )**
批量更新 x#Sqn#
1、Statement p+)Y Tzzc
Statement sm = cn.createStatement(); 9]q:[zm^
sm.addBatch(sql1); &gzCteS
sm.addBatch(sql2); e[hcJz!D
... `{qG1
sm.executeBatch() [JF150zr
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 g=I8@m
2、PreparedStatement E@7J:|.)R
PreparedStatement ps = cn.preparedStatement(sql); ,#pXpAz/
{ 0RoU}r@z4
ps.setXXX(1,xxx); ^Q+g({
... {e|[%reSkg
ps.addBatch(); Z+@2"%W
} E Cyyl
ps.executeBatch(); zOQ>d|p?X
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 B^g ?=|{
h@a+NE8
事务的处理 c y8;@[#9
1、关闭Connection的自动提交 lRXK\xIP ,
cn.setAutoCommit(false); 8By|@LO
2、执行一系列sql语句 eq UME
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close h:9Zt0,
Statement sm ; #8)*1?
sm = cn.createStatement(insert into user...); +SwR+H)?
sm.executeUpdate(); JQ"U4GVp
sm.close(); ~6p[El#tS
sm = cn.createStatement("insert into corp...); T#>7ub
sm.executeUpdate(); o"*AtGR+"
sm.close(); 812$`5l
3、提交 AM!G1^c
cn.commit(); =Q\r?(Iy
4、如果发生异常,那么回滚 rS;Dmm
cn.rollback();