java 数据库基本操作 .qk]$LJF7
1、java数据库操作基本流程 kt4d;4n
2、几个常用的重要技巧: jlFk@:y4
可滚动、更新的记录集 10#oG{9
批量更新 #d{=\$=
事务处理 Bx[rC
"U.^lkN
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 vpPl$ga5bY
1、取得数据库连接 VL[)[~^
1)用DriverManager取数据库连接 KRJLxNr
例子 ,3I^?5
String className,url,uid,pwd; =66Nw(E.
className = "oracle.jdbc.driver.OracleDriver"; W4;m H}#0
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 1Y_w5dU
uid = "system"; ]]}tdn _
pwd = "manager"; I8OD$`~*U6
Class.forName(className); )XQ`M?**M
Connection cn = DriverManager.getConnection(url,uid,pwd); Iqs+r?
2)用jndi(java的命名和目录服务)方式 q_
=b<.;
例子 y]%w )4PS
String jndi = "jdbc/db"; Ld^GV
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); QZ
`tNq :/
DataSource ds = (DataSource) ctx.lookup(jndi); )'l*Tl
Connection cn = ds.getConnection(); UZ8?[
多用于jsp中 Z%Z9oJ:
2、执行sql语句 p2PY@d}}.
1)用Statement来执行sql语句 6)pH|d.FR
String sql; s08u @
Statement sm = cn.createStatement(); C1T_9}L-A
sm.executeQuery(sql); // 执行数据查询语句(select) W~_t~Vg5
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); _w@qr\4i=
2)用PreparedStatement来执行sql语句 `ovtHl3Q
String sql; !?
^h;)a
sql = "insert into user (id,name) values (?,?)"; {;2i.m1
PreparedStatement ps = cn.prepareStatement(sql); <lr*ZSNY
ps.setInt(1,xxx); O7']
ps.setString(2,xxx); u6:pV.p
... 1
4LI5T
ResultSet rs = ps.executeQuery(); // 查询 R`F,aIJ]
int c = ps.executeUpdate(); // 更新 ,?
E&V_5
i`
A
3、处理执行结果 U=bEA1*@0
查询语句,返回记录集ResultSet \Mv":Lm1
更新语句,返回数字,表示该更新影响的记录数 Bs`$ i ;&
ResultSet的方法 3CTX -#)vS
1、next(),将游标往后移动一行,如果成功返回true;否则返回false fIoIW&iy
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 4LI0SwD#^/
wx=0'T-[
4、释放连接 57F%j3.|/
cn.close(); qdCWy
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection DOm[*1@^
OEdJc\n_R
可滚动、更新的记录集 S)He$B$pp
1、创建可滚动、更新的Statement 4VN aq<8
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); !BU)K'mj
该Statement取得的ResultSet就是可滚动的 Vbh6HqAHxJ
2、创建PreparedStatement时指定参数 0f ER*.F
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); P+e KZo
ResultSet.absolute(9000); b(GFMk
批量更新 c*\<,n_
1、Statement ~
aZedQc
Statement sm = cn.createStatement(); "rXOsX\;
sm.addBatch(sql1); mxrG)n6Y
sm.addBatch(sql2); jW*1E*"
... 3l!NG=R
sm.executeBatch() 6FfOH<\z6i
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 iNcZ)m/
2、PreparedStatement H;<!TX.zD
PreparedStatement ps = cn.preparedStatement(sql); l QPqcZd
{ ]^"k8v/
ps.setXXX(1,xxx); "oJ(J{Jat
... crA:I"I
ps.addBatch(); "YFls#4H-
} ScnY3&rc
ps.executeBatch(); .M|>u_<Qd
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 jRkC/Lw
M%Ku5X6:/
事务的处理 fF?6j
1、关闭Connection的自动提交 Ru%|}sfd
cn.setAutoCommit(false); 2x$x;
\*j
2、执行一系列sql语句 WbjF]b\
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ty1fcdFZM
Statement sm ; y93k_iq$S
sm = cn.createStatement(insert into user...); 1r`i]1<H
sm.executeUpdate(); _rQUE^9
sm.close(); )&NAs
sm = cn.createStatement("insert into corp...); $,1dQeE
sm.executeUpdate(); K6\` __mLf
sm.close(); /dHs &SU,
3、提交 ayp b
cn.commit(); \,W.0#D8v4
4、如果发生异常,那么回滚 &TN2 HZ-bJ
cn.rollback();