java 数据库基本操作 H
:
T N
1、java数据库操作基本流程 2yQ}Lxr(
2、几个常用的重要技巧: ft/^4QcyAM
可滚动、更新的记录集 zzfn0g
批量更新 80$0zbw$
事务处理 &6t3SZV
a}Fk x
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Sc'c$/
1、取得数据库连接 pH\^1xj
=
1)用DriverManager取数据库连接 k?HrD" k"
例子 }PFt
String className,url,uid,pwd; &=-e`=qJ'6
className = "oracle.jdbc.driver.OracleDriver"; >WGP{
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; kWs+2j
uid = "system"; 9y^kb+
pwd = "manager"; !FB \h<6
Class.forName(className); %Nm @f'
Connection cn = DriverManager.getConnection(url,uid,pwd); q qe2,X?
2)用jndi(java的命名和目录服务)方式 nQ642i%RQ
例子 !)%>AH'
String jndi = "jdbc/db"; =F'M~3M
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Be{/2jU%
DataSource ds = (DataSource) ctx.lookup(jndi); 98A(jsj
Connection cn = ds.getConnection(); JEsLF{
多用于jsp中 L-z;:Ztk
2、执行sql语句 fQQsb 5=i
1)用Statement来执行sql语句 "X5_-l
String sql; 7V} ]C>G
Statement sm = cn.createStatement(); 8Z
dUPW\e
sm.executeQuery(sql); // 执行数据查询语句(select) $,KP]~?
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); mLg{6qm(q
2)用PreparedStatement来执行sql语句 7<3U? ]0
String sql; z+k=|RMau
sql = "insert into user (id,name) values (?,?)"; 7?MB8tJ5r4
PreparedStatement ps = cn.prepareStatement(sql); zkh hN"bX
ps.setInt(1,xxx); sOl>5:D6
ps.setString(2,xxx); oQ%\[s$
... |"R_-U
ResultSet rs = ps.executeQuery(); // 查询 ';b3Mm
#
int c = ps.executeUpdate(); // 更新 Z cm<Fw
dd<:#c9
3、处理执行结果 +5HnZ?E\
查询语句,返回记录集ResultSet V#NG+U.B
更新语句,返回数字,表示该更新影响的记录数 ~!ZmF(:
ResultSet的方法 P{S\pWZkk
1、next(),将游标往后移动一行,如果成功返回true;否则返回false tyEPU^PM
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 I/On3"U%
#v4LoNm
4、释放连接 sTtX$&Qu
cn.close(); +}^|dkc
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection W|25t)cJ8h
z.3<{-n}0i
可滚动、更新的记录集 ;8ET!&k*>E
1、创建可滚动、更新的Statement skIiJ'db
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); bo@,4xw
该Statement取得的ResultSet就是可滚动的 ~+N76BX
2、创建PreparedStatement时指定参数 s.y q}Q
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); (*6m^
ResultSet.absolute(9000); FxCZRo&
批量更新 7v_i>_m]
1、Statement fB~O
|g
Statement sm = cn.createStatement(); ebN(05ZV
sm.addBatch(sql1); oZvA~]x9\
sm.addBatch(sql2); V@D]bV@4
... {~bIA!kAFI
sm.executeBatch() 4^DVW*OiI
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 .xGo\aD
2、PreparedStatement %MJL5
PreparedStatement ps = cn.preparedStatement(sql); bLgL0}=n
{ YijMF/Uyb
ps.setXXX(1,xxx); S&4+ e:K
... /!3ZW XY\
ps.addBatch(); D|d4:;7
} 7\A4vUI3
ps.executeBatch(); mC i[Ps
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 .u1X+P7
]~-*hOcQ4
事务的处理 x\hWyY6J[
1、关闭Connection的自动提交 '>j<yaD'
cn.setAutoCommit(false); "h=6Q+Ze
2、执行一系列sql语句 d^F|lc ]8
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close J["H[T*
Statement sm ; ^GMJ~[]
sm = cn.createStatement(insert into user...); qib7Z]j
sm.executeUpdate(); 6HoqEku/Q
sm.close(); [X,A'Q
sm = cn.createStatement("insert into corp...); AR%hf
sm.executeUpdate(); /+VIw`E
sm.close(); CjZZm^O
3、提交 R?cUy8?'S
cn.commit(); _!n}P5
4、如果发生异常,那么回滚 QR<`pmB~y
cn.rollback();