java 数据库基本操作 AQU4~g
mI
1、java数据库操作基本流程 [#kfl
2、几个常用的重要技巧: .B{3=z^
可滚动、更新的记录集 ,(}7 ST
批量更新 abuHu'73
事务处理 p@/!+$^{
wy<m&M<Gr
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 m'XzZmI
1、取得数据库连接 Hu|NS {Ke-
1)用DriverManager取数据库连接 R{\vOw:*
例子 C;}~C:aJ
String className,url,uid,pwd; !`hjvJryw
className = "oracle.jdbc.driver.OracleDriver"; 6BRQX\
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 1bF aQ50t
uid = "system"; Pon 2!$
pwd = "manager"; IrjKI.PR
Class.forName(className); Aga2 I#1r
Connection cn = DriverManager.getConnection(url,uid,pwd); K_bF)6"
2)用jndi(java的命名和目录服务)方式 ~;QO`I=0P
例子 PQ<""_S||
String jndi = "jdbc/db"; 1mgLH
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); v$s3f|Y
DataSource ds = (DataSource) ctx.lookup(jndi); F:x" RbbF
Connection cn = ds.getConnection(); cP`f\\c
多用于jsp中 +'2Mj|d@p
2、执行sql语句 ]
NL-)8u
1)用Statement来执行sql语句 GN?^7kI
String sql; f}0(qN/G
Statement sm = cn.createStatement(); d3_aFsQ
sm.executeQuery(sql); // 执行数据查询语句(select) 9e^[5D=L
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); T|Sz~nO}f
2)用PreparedStatement来执行sql语句 Uc>kCBCd
String sql; ,>V|%tD'
sql = "insert into user (id,name) values (?,?)"; ++-HdSHY
PreparedStatement ps = cn.prepareStatement(sql); ]C3{ _?=
ps.setInt(1,xxx); /+.Bc(`
ps.setString(2,xxx); ]Vo;ZY_\
... 4 FW~Y
ResultSet rs = ps.executeQuery(); // 查询 OGh9^,v
int c = ps.executeUpdate(); // 更新 eZIqyw
y!u)q3J0&
3、处理执行结果 W~aVwO'(
查询语句,返回记录集ResultSet ^](sCE7
更新语句,返回数字,表示该更新影响的记录数 Zk__CgS#
ResultSet的方法 n'9Wl'
1、next(),将游标往后移动一行,如果成功返回true;否则返回false d^mw&F)S
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 / @X!
GL_YT.(!
4、释放连接 T=(/n=
cn.close(); t,M_
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection VUxuX5B3M
ZZ?0%9
可滚动、更新的记录集 E?z3 D*U
1、创建可滚动、更新的Statement __teh>MC
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ^Wo/vm*]
该Statement取得的ResultSet就是可滚动的 [5e}A&
2、创建PreparedStatement时指定参数 )o;/*h%@
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); iagl^(s
ResultSet.absolute(9000); KPSFy<
批量更新 q.U` mtS
1、Statement s]50Y-C
Statement sm = cn.createStatement(); ~m8".Z"
sm.addBatch(sql1); 0f&B;?)!
sm.addBatch(sql2); .LhIB?
... R2vT\ 6xv
sm.executeBatch() BCYTlxC'
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 %i{Z@
2、PreparedStatement Qn(2UO!pD
PreparedStatement ps = cn.preparedStatement(sql); 9Bvi2
3
{ zflfV!vAg
ps.setXXX(1,xxx); ztTj2M"
...
]W~\%`#8?
ps.addBatch(); :JH#*5%gQ:
} z0+LD
ps.executeBatch(); Y#S<:,/sb?
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 p:Ry F4{b2
ayfR{RYi
事务的处理 =5/ow!u8
1、关闭Connection的自动提交 8=CdO|XV
cn.setAutoCommit(false); "3.v(GVr
2、执行一系列sql语句 kd)Q$RA(
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Q@?8-
Statement sm ; Ok2KTsVl
sm = cn.createStatement(insert into user...); 5.5<.")
sm.executeUpdate(); 0^$L{V
sm.close(); c.dk4v%Y5
sm = cn.createStatement("insert into corp...); :7UC=GKQk
sm.executeUpdate(); WvR-0>E
sm.close(); \(2w/~
3、提交 (hNTr(z
cn.commit(); `-fWNHs
4、如果发生异常,那么回滚 Y[)b".K
cn.rollback();