java 数据库基本操作 =J'&.@Dwz
1、java数据库操作基本流程 ~{l @
2、几个常用的重要技巧: [I78<IJc
可滚动、更新的记录集 $.3J1DU
批量更新 x57O.WdN
事务处理 R6\|:mI,$
rAA?{(!9x
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 r}-vOPn`E
1、取得数据库连接 smHQ'4x9
1)用DriverManager取数据库连接 1Sd<cOEd
例子 QI`&N(n
String className,url,uid,pwd; ;:'A Bfs
className = "oracle.jdbc.driver.OracleDriver"; j9&x#U
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; @s|yH"
uid = "system"; AU<A\
pwd = "manager"; yv\
j&B|
Class.forName(className); \6;b.&%w2
Connection cn = DriverManager.getConnection(url,uid,pwd); %XH%.Ps/
2)用jndi(java的命名和目录服务)方式 9
!V,++j
例子 9(hI%idq
String jndi = "jdbc/db"; 4{LKT^(!f
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ~9c jc
DataSource ds = (DataSource) ctx.lookup(jndi); :"`1}Q
Connection cn = ds.getConnection(); V lS`m,:{
多用于jsp中 R{q<V uN
2、执行sql语句 wQojmmQ
1)用Statement来执行sql语句 (/A
6kp?
String sql; ](>YjE0
Statement sm = cn.createStatement(); gQuU_dbXSB
sm.executeQuery(sql); // 执行数据查询语句(select) (8Te{K h'
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); zin'&G>l
2)用PreparedStatement来执行sql语句 lKV7IoJ&;
String sql; fhmBKeFdV
sql = "insert into user (id,name) values (?,?)"; '}E"Mdb
PreparedStatement ps = cn.prepareStatement(sql); s"x(i
ps.setInt(1,xxx); T2 /u7<D-
ps.setString(2,xxx); /@0
... <"nF`'olV
ResultSet rs = ps.executeQuery(); // 查询 (>`S{L
C>s
int c = ps.executeUpdate(); // 更新 %S<))G
lhB;jE
3、处理执行结果 + De-U.
查询语句,返回记录集ResultSet 1l\.>H\E
更新语句,返回数字,表示该更新影响的记录数 TmEh$M
ResultSet的方法 7x.]
9J
1、next(),将游标往后移动一行,如果成功返回true;否则返回false UD_8#DO{m1
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 G4wJv^6i9
g|5cO3m0'
4、释放连接 /`g~lww2O
cn.close(); }UqL2KXi4
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 2C#b-Y1~N
Su*Pd;
可滚动、更新的记录集 G4G<Ow)`
1、创建可滚动、更新的Statement L6J.^tpO
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 9eEA80i7
该Statement取得的ResultSet就是可滚动的 I?CfdI
2、创建PreparedStatement时指定参数 !}=#h8fv
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ;upYam"
ResultSet.absolute(9000); )zu m.6pT
批量更新 \:E=B1
1、Statement OhTd>~R`<
Statement sm = cn.createStatement(); GP_%.fO\M
sm.addBatch(sql1); ;9hS_%ldX4
sm.addBatch(sql2); __[bKd.
... _m3#g1m{
sm.executeBatch() #|F5Kh"
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 rvPmd%nk-
2、PreparedStatement VEBvS>i*
PreparedStatement ps = cn.preparedStatement(sql); u\u6<[>P
{ @-XMox/
ps.setXXX(1,xxx); LcGG~P|ML
... vue=K
ps.addBatch(); B0,C!??5
} %[BOe4[
ps.executeBatch(); /m h #o
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ?y,z
{r:5\
事务的处理 A4Tjfc,rx9
1、关闭Connection的自动提交 [y(<1]i-a
cn.setAutoCommit(false); T)MZ`dM
2、执行一系列sql语句 ab>>W!r@!
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close LNF|mS\+D
Statement sm ; 7|X.E
sm = cn.createStatement(insert into user...); 4']eJ==OH
sm.executeUpdate(); 7&1dr
sm.close(); l42tTD8Awz
sm = cn.createStatement("insert into corp...); \!zM4ppr
sm.executeUpdate(); YeB)]$'?u`
sm.close(); /,JL \b
3、提交 `\Te,
cn.commit(); d#:7V%]dp
4、如果发生异常,那么回滚 {r_x\VC=p
cn.rollback();