java 数据库基本操作 m.e]tTe
1、java数据库操作基本流程 WVbrbs4
2、几个常用的重要技巧: Dsg>~J'
可滚动、更新的记录集 +J X;T(T
批量更新 5~JT*Ny
事务处理 yLX $SR
Zh<;r;2
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 u]J@65~'b
1、取得数据库连接 |@Tga_0p
1)用DriverManager取数据库连接 #&&T1;z"#
例子 0CrsZt X
String className,url,uid,pwd; e`D}[G#
className = "oracle.jdbc.driver.OracleDriver"; /8cRPB.
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; !+T1kMP+l
uid = "system"; IU%|K~_n
pwd = "manager"; W(s4R,j
Class.forName(className); =Ph8&l7~sp
Connection cn = DriverManager.getConnection(url,uid,pwd); S(Yd.Sp
2)用jndi(java的命名和目录服务)方式 G'ykcB._
例子 (\9`$
String jndi = "jdbc/db"; (jgk !
6
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); y>^^.
DataSource ds = (DataSource) ctx.lookup(jndi); 7RAB"T;?Q
Connection cn = ds.getConnection(); |\5^ub,m
多用于jsp中 E7fx4kV
2、执行sql语句 ]A#lV$
1)用Statement来执行sql语句 #%0V`BS7n
String sql; 1j<(?MT-
Statement sm = cn.createStatement(); 6o3
bq|
sm.executeQuery(sql); // 执行数据查询语句(select) CLb6XnkcA\
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 'y8{,R4C
2)用PreparedStatement来执行sql语句 X%1TsCKMj
String sql; &SY!qTxF
sql = "insert into user (id,name) values (?,?)"; *Gbhk8}V'
PreparedStatement ps = cn.prepareStatement(sql); J3K=z
ps.setInt(1,xxx); IV QH
p
ps.setString(2,xxx); H"C'<(4*\
... 'Wonz<{'
ResultSet rs = ps.executeQuery(); // 查询 GF'wDi}
int c = ps.executeUpdate(); // 更新 (!os&/",
%\As
3、处理执行结果 s[1ao"sZ^
查询语句,返回记录集ResultSet v<qh;2
更新语句,返回数字,表示该更新影响的记录数 Lpchla$
ResultSet的方法 GXNf@&
1、next(),将游标往后移动一行,如果成功返回true;否则返回false =8kmFXo
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 30Q
p^)K
vh9* >[i
4、释放连接 ]Z JoC!u
cn.close(); Q=\
Oa(I
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection &K)8
^S9y7b^;r
可滚动、更新的记录集
CI|lJ
1、创建可滚动、更新的Statement 15$xa_w}L
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); }kbSbRH43
该Statement取得的ResultSet就是可滚动的 'm%{Rz>j
2、创建PreparedStatement时指定参数 R#(0C(FI^
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); +>w]T\[1~
ResultSet.absolute(9000); o<2GtF1"o
批量更新 l{3B}_,
1、Statement ZSMed(//b
Statement sm = cn.createStatement(); '[F:uA
sm.addBatch(sql1); ]' mbHkn68
sm.addBatch(sql2); y!e]bvN
... )n/%P4l
sm.executeBatch() CU$khz"
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 MatXhP] Fi
2、PreparedStatement xVvUx,t
PreparedStatement ps = cn.preparedStatement(sql); mp|pz%U
{ JFq
wC=-
ps.setXXX(1,xxx); <J[le=
... XGlt^<`
ps.addBatch(); &}ZmT>q`$
} @WJ;T= L
ps.executeBatch(); ~PQ.l\C
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 -F[8ZiZ
h@)U,&
事务的处理 WxdQ^#AE
1、关闭Connection的自动提交 61\u{@o$
cn.setAutoCommit(false); !\]^c
2、执行一系列sql语句 urp|@WZ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ;D5>iek5
Statement sm ; B`tq*T%
sm = cn.createStatement(insert into user...); >nSsbhAe
sm.executeUpdate(); ` ]|X_!J-
sm.close(); )W@ug,y
sm = cn.createStatement("insert into corp...); U~
{k_'-i
sm.executeUpdate(); ,OZ
sm.close(); U}v`~'K
3、提交 4Z)4WGp!
cn.commit(); _sjS'*]
4、如果发生异常,那么回滚 *0WVrM06?
cn.rollback();