java 数据库基本操作 UT~a&u
1、java数据库操作基本流程 pY4}>ju(g
2、几个常用的重要技巧: ,h|q i[7
可滚动、更新的记录集 iu**`WjI\
批量更新 z"D.Bm~ ]
事务处理 tH=P6vY
,Vd\m"K{
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 u4z&!MT}
1、取得数据库连接 fA'qd.{f^
1)用DriverManager取数据库连接 ly% F."v
例子 ob+euCuJ
String className,url,uid,pwd; f>'Y(dJ'W
className = "oracle.jdbc.driver.OracleDriver"; 01!s"wjf
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; V)Z70J<'
uid = "system"; d]9U^iy
pwd = "manager"; Bwr3jV?S
Class.forName(className); Z\[N!Zt|
Connection cn = DriverManager.getConnection(url,uid,pwd); C]^H&
2)用jndi(java的命名和目录服务)方式 80A.<=(=.
例子 [ dtbkQt,c
String jndi = "jdbc/db"; =to=8H-
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); !=;XBd-
DataSource ds = (DataSource) ctx.lookup(jndi); aA7=q=
Connection cn = ds.getConnection(); R.7 :3h
多用于jsp中 [m^+,%m5]
2、执行sql语句 Cg*H.f%Mr
1)用Statement来执行sql语句 y@CHR
String sql; B?VhIP e
Statement sm = cn.createStatement(); sLE#q+W
sm.executeQuery(sql); // 执行数据查询语句(select) 2r$#m*
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); IwGqf.!.>
2)用PreparedStatement来执行sql语句 NM)k/?fA
String sql; **69rN
sql = "insert into user (id,name) values (?,?)"; {M,,npl
PreparedStatement ps = cn.prepareStatement(sql); ^Rm
ps.setInt(1,xxx); No2b"G@
ps.setString(2,xxx); !lo/xQ<
... 6c0>gUQx-
ResultSet rs = ps.executeQuery(); // 查询 /0\
mx4u
int c = ps.executeUpdate(); // 更新 @FdSFQ/9
#plY\0E@
3、处理执行结果 ~>9_(L
查询语句,返回记录集ResultSet q2HYiH^L
更新语句,返回数字,表示该更新影响的记录数 4k./(f2+
ResultSet的方法 XMG]Wf^%\<
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 12Y
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 1+?^0%AC
hsu{ey p
4、释放连接 fnx-s{c?
cn.close(); fdONP>K[E
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Dk48@`l2
.`?@%{
可滚动、更新的记录集 IK*07h/!
1、创建可滚动、更新的Statement vn/.}GkpU
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); @cU&n6C@
该Statement取得的ResultSet就是可滚动的 8enEA^
2、创建PreparedStatement时指定参数 s+tGFjq
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); `y+tf?QN
ResultSet.absolute(9000); _X?^Cy
批量更新 ctcS:<r/3@
1、Statement V|\7')Qq
Statement sm = cn.createStatement(); qZ@s#UiB
sm.addBatch(sql1); w3jO6*_ M
sm.addBatch(sql2); vq34/c^
... =B.F;40
sm.executeBatch() j65<8svl
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 I%urz!CNE*
2、PreparedStatement U*.0XNKp{
PreparedStatement ps = cn.preparedStatement(sql);
}-~l!
{ s&'QN=A
ps.setXXX(1,xxx); \W1/p`
... [9:9Ql_h
ps.addBatch(); a&vY!vx3
} 4tY ss
ps.executeBatch(); W`^@)|9^)
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 E!S 78z:
nS>8bub30
事务的处理 [$[:"N_
1、关闭Connection的自动提交 *hcYGLx
r
cn.setAutoCommit(false); cu+FM
2、执行一系列sql语句 [z7bixN
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close J4Dry<
Statement sm ; Mw9 \EhA
sm = cn.createStatement(insert into user...); V')0 Mr
sm.executeUpdate(); $ImrOf^qt
sm.close(); aMTu-hA
sm = cn.createStatement("insert into corp...); qx%}knB
sm.executeUpdate(); Hc`A3SMR
sm.close(); Bj7gQ%>H4
3、提交 v0L\0&+
cn.commit(); &c1A*Pl/:G
4、如果发生异常,那么回滚 dO%W+K
cn.rollback();