java 数据库基本操作 )b!q
1、java数据库操作基本流程 -'q=oTZ
2、几个常用的重要技巧: 9sE>K)
可滚动、更新的记录集 1Kc*MS
批量更新 "n]B~D
事务处理 ^@[[,1"K
oY.JK
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 PCaa_
2
1、取得数据库连接 j/B zbjq"
1)用DriverManager取数据库连接 mup3ua]!
例子 `b7o
String className,url,uid,pwd; #Wc)wL-Tg
className = "oracle.jdbc.driver.OracleDriver"; UNY>Q7
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 7B&nV92S
uid = "system"; j 6v +S
pwd = "manager"; PL8akA#
Class.forName(className); Nz:
Connection cn = DriverManager.getConnection(url,uid,pwd); ^R<= }
2)用jndi(java的命名和目录服务)方式 0q`'65 lx
例子 MESQAsx%
String jndi = "jdbc/db"; m
CdkYN#
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); f%@Y
XGf
DataSource ds = (DataSource) ctx.lookup(jndi); CWDo_g$
Connection cn = ds.getConnection(); RNt3az
多用于jsp中 %pg*oX1VK6
2、执行sql语句 *i$+i
1)用Statement来执行sql语句 T+.wJW:jh
String sql; BO[A1'>
Statement sm = cn.createStatement(); 5SKu \H\
sm.executeQuery(sql); // 执行数据查询语句(select) }'X}!_9w>
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 9td(MZ%i~N
2)用PreparedStatement来执行sql语句 ~O^_J)
String sql; < )?&Jf>_
sql = "insert into user (id,name) values (?,?)"; _D+7w'8h
PreparedStatement ps = cn.prepareStatement(sql); Dl"y|
ps.setInt(1,xxx); 49kY]z|"w
ps.setString(2,xxx); u>? VD%
... E=x\f "Z
ResultSet rs = ps.executeQuery(); // 查询 %
vP{C
int c = ps.executeUpdate(); // 更新 }h]:I'R!
em W#ZX
3、处理执行结果 {9=U6m^R2
查询语句,返回记录集ResultSet 4a646jg)
更新语句,返回数字,表示该更新影响的记录数 p,1RRbyc
ResultSet的方法 4Fz^[L}[
1、next(),将游标往后移动一行,如果成功返回true;否则返回false |6;.C1\,
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 RE7[bM3a
z1:au odI@
4、释放连接 -51L!x}1c
cn.close(); /y-P)3_
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection '%~zu]f'
#IXQ;2%E
可滚动、更新的记录集 ca`=dwe>
1、创建可滚动、更新的Statement :c.i Z
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); O;zW'*c+
该Statement取得的ResultSet就是可滚动的 -0Q!:5EC
2、创建PreparedStatement时指定参数 P$oa6`%l
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); U$J]^-AS
ResultSet.absolute(9000); 7u}r^+6_o
批量更新 Wx-{F
1、Statement 8uu:e<PLv
Statement sm = cn.createStatement(); AKWw36lm
sm.addBatch(sql1); ~/.&Z`ls
sm.addBatch(sql2); ^KhFBed
... [[|;Wr}2
sm.executeBatch() ZcQm(my
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 zZ wD)p?_g
2、PreparedStatement WFdS#XfV
PreparedStatement ps = cn.preparedStatement(sql); kOc'@;_O
{ v0y7N_U5n
ps.setXXX(1,xxx); SVpe^iQ]1\
... Gm%[@7-
ps.addBatch(); lg=[cC2
} "8rP?B(
ps.executeBatch(); 9Z* vp^3
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 &0lNj@/
- Z|1@s&
事务的处理 <)&ykcB
1、关闭Connection的自动提交 f9rToH
cn.setAutoCommit(false); I2Us!W>6-
2、执行一系列sql语句 KOxD%bX_
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close R5FjJ>JE
Statement sm ; L%<1C\k
sm = cn.createStatement(insert into user...); '(Bs<)(H
sm.executeUpdate(); m$ JQ[vgh
sm.close(); V&>7i9lEz
sm = cn.createStatement("insert into corp...); WGO=@jkf
sm.executeUpdate(); ~9n@MPS^!
sm.close(); ^1g6(k'
3、提交 wx1uduT)
cn.commit(); bw[!f4~
4、如果发生异常,那么回滚 aR\=p:%jGI
cn.rollback();