java 数据库基本操作 bcq@N
1、java数据库操作基本流程 vg+r?4Q3
2、几个常用的重要技巧: X tJswxw`K
可滚动、更新的记录集 ^OHZ767v
批量更新 'jh2**i 34
事务处理 dj?G.-
V8-4>H}Cb/
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Wl,%&H2S<
1、取得数据库连接 I'x$,s
1)用DriverManager取数据库连接 Q<z)q<e
例子 *
zd.
String className,url,uid,pwd; a^@+%?X
className = "oracle.jdbc.driver.OracleDriver"; 5?^]1P_
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 0w^jls
uid = "system"; '"Bex`
pwd = "manager"; V%i<;C
Class.forName(className); Zkw J.SuU
Connection cn = DriverManager.getConnection(url,uid,pwd); PqTYAN&F
2)用jndi(java的命名和目录服务)方式 b OW}"
例子 '*8
String jndi = "jdbc/db"; Xyb8u})p'
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); K3La9O)>
DataSource ds = (DataSource) ctx.lookup(jndi); q A.+U:I8
Connection cn = ds.getConnection(); |c<XSX?ir
多用于jsp中 )$MS
0[?
2、执行sql语句 Jm?l59bv
v
1)用Statement来执行sql语句 (&q@~
dJ
String sql; w#W5}i&x
Statement sm = cn.createStatement(); [fd~nD#.
sm.executeQuery(sql); // 执行数据查询语句(select) }'u3U"9)
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); }%_qx|(P|t
2)用PreparedStatement来执行sql语句 HTxB=Q|
String sql; )8:n}w
sql = "insert into user (id,name) values (?,?)"; <inl{CX/
PreparedStatement ps = cn.prepareStatement(sql); [0K=I64
z
ps.setInt(1,xxx); 7}gA0fP9
ps.setString(2,xxx); Q?Wr7
... ,Yo: &>As
ResultSet rs = ps.executeQuery(); // 查询 x<8\-
int c = ps.executeUpdate(); // 更新 BeAk21xb
SO7(K5H,
3、处理执行结果 rZ pbu>S
查询语句,返回记录集ResultSet C=8H)Ef,l
更新语句,返回数字,表示该更新影响的记录数 8a7YHUL<3i
ResultSet的方法 QT_Srw@
1、next(),将游标往后移动一行,如果成功返回true;否则返回false [70Y,,w
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 wbBE@RU>!
IT,"8s
4、释放连接 QDP-E[
cn.close(); cS4xe(n8
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection
1U
nZe\5`
可滚动、更新的记录集 AmZuo_
1、创建可滚动、更新的Statement I`lDWL
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); [S%J*sz~
该Statement取得的ResultSet就是可滚动的 P1$f}K}
2、创建PreparedStatement时指定参数 M\I_{Q?_
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); xOhRTxic
ResultSet.absolute(9000); e!6eZ)l
批量更新 "@(58nk
1、Statement OO$|9`a
Statement sm = cn.createStatement(); sbzeY1
sm.addBatch(sql1); R;%^j=Q
sm.addBatch(sql2); X@cSP7b
... ^Wf
S\M`
sm.executeBatch() g/x_m.
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 2mQOj$Lv
2、PreparedStatement FZeP<Ban
PreparedStatement ps = cn.preparedStatement(sql); U8E0~[y'
{ %z=`JhE"Q
ps.setXXX(1,xxx); jn~!V!++
... %t q&
ps.addBatch(); f7.m=lbe
} P7'M],!9w
ps.executeBatch(); >)4.$#H
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 )4PB<[u
^[0"vtb
事务的处理 8*vFdoE_oO
1、关闭Connection的自动提交 li@kLh
cn.setAutoCommit(false); bea|?lK
2、执行一系列sql语句 t~q?lT
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close f KHse$?_
Statement sm ;
M'YJ"
sm = cn.createStatement(insert into user...); I`3d;l;d
sm.executeUpdate(); _n7%df
sm.close(); h:_NA
sm = cn.createStatement("insert into corp...); ~bWhth2*
sm.executeUpdate(); JXL'\De ;
sm.close(); m!;G/s*
3、提交 >n(F4C-pl
cn.commit(); TFYw
4、如果发生异常,那么回滚 KLW&bJ$|j
cn.rollback();