java 数据库基本操作 "E4;M/
1、java数据库操作基本流程 zGtWyXP
2、几个常用的重要技巧: _wMc7`6F
可滚动、更新的记录集 ]njObU)[zr
批量更新 =o g5Mh,
事务处理 5F#Q1gP-
`zQ2i}Uju
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ;?-A4!V,
1、取得数据库连接 s&T"/4
1)用DriverManager取数据库连接
V1[Cc?o
例子 P?- #d\qi
String className,url,uid,pwd; N3J T[7
className = "oracle.jdbc.driver.OracleDriver"; \UBTNY,
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ;+d2qbGd
uid = "system"; rCOH*m&
pwd = "manager"; l/(|rl#6
Class.forName(className); fk*$}f
Connection cn = DriverManager.getConnection(url,uid,pwd); ]yc&ffe%
2)用jndi(java的命名和目录服务)方式 6N7^`ghTf
例子 }vppn=[Y
String jndi = "jdbc/db"; "x;|li3;
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 0?x9.]
DataSource ds = (DataSource) ctx.lookup(jndi); kU*Fif
Connection cn = ds.getConnection(); IP#w
多用于jsp中 4z{jWNM)N
2、执行sql语句 hFLD2<
1)用Statement来执行sql语句 2[^p6s[
String sql; [(*ObvEF
Statement sm = cn.createStatement(); L?aaR%6#
sm.executeQuery(sql); // 执行数据查询语句(select) i3bDU(GS
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); E5>y?N
2)用PreparedStatement来执行sql语句 6),U(e%
String sql; 1rnbUE
sql = "insert into user (id,name) values (?,?)"; Qyh_o
PreparedStatement ps = cn.prepareStatement(sql); } "QV{W
ps.setInt(1,xxx); "pa}']7#
ps.setString(2,xxx); k15fy"+Ut
... `E @TPdu
ResultSet rs = ps.executeQuery(); // 查询 (z8^^j[
int c = ps.executeUpdate(); // 更新 m+jW+
z8MKGM
3、处理执行结果 F.N4Q'2Z
查询语句,返回记录集ResultSet <1^\,cI2
更新语句,返回数字,表示该更新影响的记录数 .>/Tc
ResultSet的方法 ^@"H(1Hxu/
1、next(),将游标往后移动一行,如果成功返回true;否则返回false k&<cFZU
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 TbK;_pg
0$saDmED
4、释放连接 IJ#G/<ZJZ
cn.close(); JDa=+\_
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection V~9vf*X
MfJs?N0
可滚动、更新的记录集 ITUwIpAE
1、创建可滚动、更新的Statement 4>JDo,AWy
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY);
!623;
该Statement取得的ResultSet就是可滚动的 =|Q7k +b
2、创建PreparedStatement时指定参数 t;>"V.F<1
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); @)R6!"p
ResultSet.absolute(9000); lZ\Si
批量更新 Qz[4M` M
1、Statement @,=E[c
8
Statement sm = cn.createStatement(); YtQsSU
sm.addBatch(sql1); #3+-vyZm
sm.addBatch(sql2); eD#R4
... J2vaKl
sm.executeBatch() f^EDiG>b`
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ox}LC,!
2、PreparedStatement P
S$6`6G
PreparedStatement ps = cn.preparedStatement(sql); Os9;;^k
{ e>GX]tK
ps.setXXX(1,xxx); ,j'>}'wG)
... qYwEPGa\
ps.addBatch(); L#\!0YW/@
} ya*KA.EGg
ps.executeBatch(); XSw!_d
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 o1d ECLQa
e2P
ds`
事务的处理 _xHEA2e!
1、关闭Connection的自动提交 t+2!"Jr
cn.setAutoCommit(false); (B0tgg^jj,
2、执行一系列sql语句 ;QiSz=DyA
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close
UE-+P
Statement sm ; }H>}v/
sm = cn.createStatement(insert into user...); npJyVh47
sm.executeUpdate(); Kc%GxD`
sm.close(); >7fNxQ
sm = cn.createStatement("insert into corp...);
OH*
sm.executeUpdate(); gXQ
s)Eyv
sm.close(); kt0ma/QpP
3、提交 SGp}(j>
cn.commit(); q>E[)\+y
4、如果发生异常,那么回滚 fBi6%
#
cn.rollback();