java 数据库基本操作 kPG-hD
1、java数据库操作基本流程 \fLMr\LL&
2、几个常用的重要技巧: ] )\Pqn(
可滚动、更新的记录集 \~mT]
'5
批量更新 LKB$,pR~1l
事务处理 \;,+
cGzPI+F
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 U[-o> W#
1、取得数据库连接 i v38p%Zm
1)用DriverManager取数据库连接 :uS\3toj
例子 ]L.O8
String className,url,uid,pwd; q'F+OQb1
className = "oracle.jdbc.driver.OracleDriver"; 3AtGy'NTp
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; q-2Bt,Y
uid = "system"; ]IQ&>z}<
pwd = "manager"; YQvD|x
Class.forName(className); V#$RR!X'
Connection cn = DriverManager.getConnection(url,uid,pwd); A2Ed0|B y
2)用jndi(java的命名和目录服务)方式 z (wc0I
例子 3BJ0S.TF
String jndi = "jdbc/db"; Xza(k
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); >Eto(
y"q
DataSource ds = (DataSource) ctx.lookup(jndi); &-6Gc;f8
Connection cn = ds.getConnection(); 2 c{34:
多用于jsp中 9ULQrq$?
2、执行sql语句 S!CC
}3zw
1)用Statement来执行sql语句 WIxy}3_to
String sql; qS$Ox?Bw#u
Statement sm = cn.createStatement(); :J@gmY:C
sm.executeQuery(sql); // 执行数据查询语句(select) V! A~K
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); `5.'_3
2)用PreparedStatement来执行sql语句 prF%.(G2)
String sql; `p-cSxR_
sql = "insert into user (id,name) values (?,?)"; 9wwqcx)3(
PreparedStatement ps = cn.prepareStatement(sql); '[:D$q;
ps.setInt(1,xxx); ~rKrpb]ow
ps.setString(2,xxx); L|xbR#v
... s Y Qk
ResultSet rs = ps.executeQuery(); // 查询 %/.b~|,-
int c = ps.executeUpdate(); // 更新 &%DY \*
;bib/
3、处理执行结果 8qTys8
查询语句,返回记录集ResultSet I"<\<^B<
更新语句,返回数字,表示该更新影响的记录数 _7L-<
ResultSet的方法 ASySiHz
1、next(),将游标往后移动一行,如果成功返回true;否则返回false *Kgks 4
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 "?xHlYj@+
Hg izW
4、释放连接 zu{P#~21
cn.close(); ,!y$qVg'\f
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection G 4X|Bka
b=NxUd O
可滚动、更新的记录集 ,m:.-iy?
1、创建可滚动、更新的Statement WPMSm<[
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); )9`qG:b'
该Statement取得的ResultSet就是可滚动的 i%]EEVmN
2、创建PreparedStatement时指定参数 ,T$U'&;
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); +gtbcF@rx
ResultSet.absolute(9000); OKR
"4n:
批量更新 ,/F~Y&1I
1、Statement WiR(;m<g
Statement sm = cn.createStatement(); ]Ie 0S~
sm.addBatch(sql1); *zvx$yJ?
sm.addBatch(sql2); (exa<hh
... b9HtR -iR;
sm.executeBatch() 6j]0R*B7`Q
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 m8hk:4Ae
2、PreparedStatement g7`LEF <A
PreparedStatement ps = cn.preparedStatement(sql); _op}1
{ <)c)%'v
ps.setXXX(1,xxx); 9IfmW^0
... X *"i6*
ps.addBatch(); ??vLUv
} &.Qrs:U
ps.executeBatch(); 'XjZ_ng
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 dOH&
k2tF}
事务的处理 @9RM9zK.q
1、关闭Connection的自动提交 )lqAD+9Q
cn.setAutoCommit(false); #a,PZDaE
2、执行一系列sql语句 F_{Yo?_
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close f+)L#>Gl?
Statement sm ; C1n>M}b
sm = cn.createStatement(insert into user...); 04P}-L,
sm.executeUpdate(); ,j_i?Ff
sm.close(); ,m|h<faZL
sm = cn.createStatement("insert into corp...); 'yEHI
sm.executeUpdate(); LYK"( C
sm.close(); {]@= ijjf
3、提交 YZ8>OwQz2
cn.commit(); [<yaXQxl
4、如果发生异常,那么回滚 vw/J8'
cn.rollback();