java 数据库基本操作 8uT@$./
1、java数据库操作基本流程 M5Pvc
2、几个常用的重要技巧: {CQA@p:Y}
可滚动、更新的记录集 lQ!6n
批量更新 !u\ X,.h
事务处理 n~K_|
Q4c>gds`
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 YEVH?`G
1、取得数据库连接 zJdlHa{
1)用DriverManager取数据库连接 / x$O6gi
例子 D_@r_^}
String className,url,uid,pwd; q'K=Ly+
className = "oracle.jdbc.driver.OracleDriver"; r%_)7Wk*
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ZZl)p\r
uid = "system"; eT}c_h)
pwd = "manager"; ,Y9lp)w
Class.forName(className); WnUYZ_+e!
Connection cn = DriverManager.getConnection(url,uid,pwd); (hd2&mSy
2)用jndi(java的命名和目录服务)方式 nW{7L
例子 #\t?`\L3
String jndi = "jdbc/db"; bX5>qqB]
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); LG&~#x
DataSource ds = (DataSource) ctx.lookup(jndi); ?N $
Connection cn = ds.getConnection(); M@8
<^CK
多用于jsp中 mQJRq??P
2、执行sql语句 lm]4zs /A
1)用Statement来执行sql语句 g<}K^)x
String sql; e:!&y\'"9
Statement sm = cn.createStatement(); 7CM<"pV
sm.executeQuery(sql); // 执行数据查询语句(select) .rN5A+By`
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); WBTX~%*U
2)用PreparedStatement来执行sql语句 ":eHR}Hzx
String sql; u]"oGJj1
sql = "insert into user (id,name) values (?,?)";
C4Bh#C
PreparedStatement ps = cn.prepareStatement(sql); {!'AR`|
ps.setInt(1,xxx); QXgh[9wG
ps.setString(2,xxx); =$Xdn'
... $Wb"X=}tl
ResultSet rs = ps.executeQuery(); // 查询 cq@8!Eu w]
int c = ps.executeUpdate(); // 更新 h7I_{v8
qrm~=yU%
3、处理执行结果 mpXco *!_
查询语句,返回记录集ResultSet Ay2Vz>{
更新语句,返回数字,表示该更新影响的记录数 Tfs7SC8ta
ResultSet的方法 <P}{0Y~@*W
1、next(),将游标往后移动一行,如果成功返回true;否则返回false >RF[0s'-
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 $S=lm {
[T~O%ly7x&
4、释放连接 2x3&o|J
cn.close(); p# O%<S@?
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection H4^-M Sw
X^fMt]
可滚动、更新的记录集 LuR.; TiW
1、创建可滚动、更新的Statement 9$UjZ$ v
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); (K^9$w]tf
该Statement取得的ResultSet就是可滚动的 VEo>uR
2、创建PreparedStatement时指定参数 R}>Gk
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 7P=1+2V
ResultSet.absolute(9000); S-'iOJ1]
批量更新 q=UKL`;C}U
1、Statement f:Ju20D
Statement sm = cn.createStatement(); }|{yd03+
sm.addBatch(sql1); a|TP 2m
sm.addBatch(sql2); T4o}5sq}S
... "fr B5[
sm.executeBatch() 1&Nk
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ?<xGO@b
.
2、PreparedStatement !=|3^A
PreparedStatement ps = cn.preparedStatement(sql); 8$xg\l0?KK
{ Bb8lklQ
ps.setXXX(1,xxx); p24sWDf
... b!<?,S
ps.addBatch(); aL+k1v[m
} cz&Qoyh{;
ps.executeBatch(); mi%d([)%<
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 YNHn# 98\
&Q(Q/]U~
事务的处理 s26:(J
[{
1、关闭Connection的自动提交 sqj8c)6
cn.setAutoCommit(false); )uZ<?bkQ
2、执行一系列sql语句 >vt#,8VAN
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close sAC1Pda
Statement sm ; @&mv4zz&W
sm = cn.createStatement(insert into user...); `!>zYcmT
sm.executeUpdate(); YDC[s ^d5
sm.close(); >L?/Ph %d
sm = cn.createStatement("insert into corp...); K,?M5n '
sm.executeUpdate(); I_'vVbK+>
sm.close(); %L<VnY#%u
3、提交 iV(B0z
cn.commit(); ^xu`NE8;
4、如果发生异常,那么回滚 uTBls8
cn.rollback();