java 数据库基本操作 $2uk;&"?A=
1、java数据库操作基本流程 9'+Eu)l:
2、几个常用的重要技巧: "g27|e?y
可滚动、更新的记录集 _#32hAI
批量更新 -!i1xR(;h
事务处理 HR'sMu3
Pt< JF
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 PJ}d-
1、取得数据库连接 8p D$/
1)用DriverManager取数据库连接 w3l2u1u
例子 m#6RJbEz
String className,url,uid,pwd; *g7BR`Bt]z
className = "oracle.jdbc.driver.OracleDriver"; S;@nPzhc
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; &?X0;,5)
uid = "system"; BwOIdz%]OY
pwd = "manager"; `|kW%L4
Class.forName(className); ?-M?{De
Connection cn = DriverManager.getConnection(url,uid,pwd); .5$"qb
?
2)用jndi(java的命名和目录服务)方式 J]G]
<)
例子 TLu+5f
String jndi = "jdbc/db"; 0C!f/EZK
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); wO<.wPa`
DataSource ds = (DataSource) ctx.lookup(jndi); N)yCGo
Connection cn = ds.getConnection(); oVlh4"y#Lf
多用于jsp中 EZs"?A
2、执行sql语句 zI-]K,!
1)用Statement来执行sql语句 Gbj^o o
String sql; vYl2_\,Y?
Statement sm = cn.createStatement(); by}C;eN
sm.executeQuery(sql); // 执行数据查询语句(select) ~]f6@n
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ($QQuM=
2)用PreparedStatement来执行sql语句 RZMR2fP%
String sql; I;xSd.-
sql = "insert into user (id,name) values (?,?)"; j-]`;&L
PreparedStatement ps = cn.prepareStatement(sql); 7pPaHX8
ps.setInt(1,xxx); Yzr)UJl*I
ps.setString(2,xxx); 9-:\ NH^;
... %lsRj)n
ResultSet rs = ps.executeQuery(); // 查询 7:/gO~gI
int c = ps.executeUpdate(); // 更新 LH}]& >F
'#<4oW\]
3、处理执行结果 :/A7Z<u,
查询语句,返回记录集ResultSet Ymvd3> _
更新语句,返回数字,表示该更新影响的记录数 KXrZ:4bg
ResultSet的方法 iYaS
1、next(),将游标往后移动一行,如果成功返回true;否则返回false _:+hB9n s
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 p~Wy`g-
L(RI4d
4、释放连接 W kP`qD3
cn.close(); trx y3k;
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ?Vre"6U
(>.lkR
可滚动、更新的记录集 z]+&kNm
1、创建可滚动、更新的Statement x-nO; L-2p
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ^cDHC^Wm
该Statement取得的ResultSet就是可滚动的 jK^Q5iD
2、创建PreparedStatement时指定参数 Rf4}((y7Y\
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); gN@|lHbU
ResultSet.absolute(9000); k~%j"%OB
批量更新 Am
~P$dN
1、Statement X+2uM+
Statement sm = cn.createStatement(); gwGw
sm.addBatch(sql1); WuuF&0?8C
sm.addBatch(sql2); T
W#s)iDi
... A3mvd-k
sm.executeBatch() J?#Xy9dz
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 0SjB&J
2、PreparedStatement 7Is:hx|:
PreparedStatement ps = cn.preparedStatement(sql); Lv&9s
{ 'fjouO
ps.setXXX(1,xxx); [s{ B vn
... <N{wFvF
ps.addBatch(); p>N8g#G
} [$X^r<|P@
ps.executeBatch(); H\fsyxM7
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 +'|nsIx,
Sx8RH),k
事务的处理 @{>0v"@
1、关闭Connection的自动提交 pC~M5(F_
cn.setAutoCommit(false); -e4TqzRr
2、执行一系列sql语句 1*GL;W~ix*
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close }el7@Gv
Statement sm ; Xj9\:M-
sm = cn.createStatement(insert into user...); a[_IG-l|i4
sm.executeUpdate(); ${)oi:K@:
sm.close(); uG$*DeZti
sm = cn.createStatement("insert into corp...); 4mHk,Dd9,
sm.executeUpdate(); )b?$
4<X^
sm.close(); uv=a}U;
3、提交 N7u|<
0[
cn.commit(); >[2;
4、如果发生异常,那么回滚 \RqH"HqD
cn.rollback();