java 数据库基本操作 FrLv%tK|
1、java数据库操作基本流程 LXrk5>9
2、几个常用的重要技巧: HP<a'| r
可滚动、更新的记录集 KXcRm)
批量更新 f qWme:x
事务处理 mO TA
&P35\q
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 |90/tNe
1、取得数据库连接 }>621L3 -
1)用DriverManager取数据库连接 +N2ILE8[<
例子 g@/}SJh/>
String className,url,uid,pwd; IFa~`Gf [
className = "oracle.jdbc.driver.OracleDriver"; xy&*s\=:
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; wzoT!-_X
uid = "system"; Rd]<591
pwd = "manager"; NzM ,0q
Class.forName(className); L|-|DOgw
Connection cn = DriverManager.getConnection(url,uid,pwd); ^4\0,>
2)用jndi(java的命名和目录服务)方式 e(b$LUV
例子 .V_5q:tu
String jndi = "jdbc/db"; Z:x`][vg
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); b~YIaD[Z
DataSource ds = (DataSource) ctx.lookup(jndi); OBF-U]?Y
Connection cn = ds.getConnection(); toOdL0hCe
多用于jsp中 wr,+9uK
2、执行sql语句 y
)<+?@sP
1)用Statement来执行sql语句 >X"\+7bw
String sql; uocFOlU0n
Statement sm = cn.createStatement(); ?pd/cj^
sm.executeQuery(sql); // 执行数据查询语句(select) DZH2U+K
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Vl<7>
2)用PreparedStatement来执行sql语句 ~P~q'
String sql; OmfHrlA
sql = "insert into user (id,name) values (?,?)"; F1M:"-bda
PreparedStatement ps = cn.prepareStatement(sql); .We{W{
ps.setInt(1,xxx); RVs=s}|>*
ps.setString(2,xxx); psz0q|
... :+
1Wmg
ResultSet rs = ps.executeQuery(); // 查询 >$r o\/
int c = ps.executeUpdate(); // 更新 Qr6PkHU
M&9urOa`
3、处理执行结果 Au(oKs<
查询语句,返回记录集ResultSet wPcEvGBN=
更新语句,返回数字,表示该更新影响的记录数 cb{"1z
ResultSet的方法 \,v+ejhw
1、next(),将游标往后移动一行,如果成功返回true;否则返回false QJjk#*?,|
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 TK~KM
@" umY-1f
4、释放连接 u'DpZ
cn.close(); 8=0I4\
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection :LdPqFXj
EUV8H}d5
可滚动、更新的记录集 &=:3/;c
1、创建可滚动、更新的Statement oQo5y_o~
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); &Ll&A@yU
该Statement取得的ResultSet就是可滚动的 G)Y,*.,
2、创建PreparedStatement时指定参数 Wfc~"GQq4
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); uNw9g<g:V[
ResultSet.absolute(9000); HRu;*3+%>F
批量更新 0O]v|
1、Statement ;, \!&o6
Statement sm = cn.createStatement(); "oF)u1_?
sm.addBatch(sql1); =1
S%E
sm.addBatch(sql2); Wa&!1'
@
... 88?O4)c
sm.executeBatch() )24M?R@r
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 uq54+zC
2、PreparedStatement ]0|A\bE\S
PreparedStatement ps = cn.preparedStatement(sql); t&EY$'c
{ Nqz6_!
ps.setXXX(1,xxx); 0bIgOLP
... Mk+G(4p
ps.addBatch(); +#< Z/
} M1*bT@6
ps.executeBatch(); ###>0(n
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 9ZY,T]ym?
M#m;jJqON
事务的处理 E'SDT*EI
1、关闭Connection的自动提交 "J+4
cn.setAutoCommit(false); difX7)\
2、执行一系列sql语句 _ F|}=^Z`
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close g+<[1;[-
Statement sm ; 39F
e#u
sm = cn.createStatement(insert into user...); Jo~fri([%Q
sm.executeUpdate(); 0!$y]Gr
sm.close(); yq^Ma
sm = cn.createStatement("insert into corp...); n%4/@M
sm.executeUpdate(); _z 5W*..
sm.close(); +PKsiUJ|
3、提交 Y}<%~z#.4
cn.commit(); MPw?HpM
4、如果发生异常,那么回滚 S3E5^n\\
cn.rollback();