java 数据库基本操作 e*?@6E
1、java数据库操作基本流程 A0f98?j^
2、几个常用的重要技巧: Uxl7O4J@H
可滚动、更新的记录集 A<$w
}Fy;
批量更新 de<T5/
事务处理 ]b6g Z<
}S_#*N)i
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 zY^QZceq"
1、取得数据库连接 t<DZW#
1)用DriverManager取数据库连接 (- QvlpZ
例子 31> $;"
String className,url,uid,pwd; #vs=yR/tn{
className = "oracle.jdbc.driver.OracleDriver"; dPmtU{E<M
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; e_v_y$
uid = "system"; )U5Ba^"fI
pwd = "manager"; }JlrWJRi
Class.forName(className); EK=PY
Connection cn = DriverManager.getConnection(url,uid,pwd); 7q;wj~
2)用jndi(java的命名和目录服务)方式 u>y/<9]q8
例子 1> IA9]D7
String jndi = "jdbc/db"; z3mo2e
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); w$1B|7tX;2
DataSource ds = (DataSource) ctx.lookup(jndi); Ht_7:5v&
Connection cn = ds.getConnection(); li7"{+ct
多用于jsp中 L7rH=gZ&!]
2、执行sql语句 l =Is-N`
1)用Statement来执行sql语句 ?Tr\r1s]
String sql; }VDJ
Statement sm = cn.createStatement(); (S)jV0
sm.executeQuery(sql); // 执行数据查询语句(select) (ibj~g?U,
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); NB=!1;^J
2)用PreparedStatement来执行sql语句 6
#m:=
String sql; T_NN.Ol
sql = "insert into user (id,name) values (?,?)"; qvN`46c
PreparedStatement ps = cn.prepareStatement(sql); H
b}(.`
ps.setInt(1,xxx); T}r}uw`
ps.setString(2,xxx); 7LrWS83
... i~sW_f+
ResultSet rs = ps.executeQuery(); // 查询 7~
=r9-&G
int c = ps.executeUpdate(); // 更新 sG K7Uy
WTX!)H6Zv
3、处理执行结果 u`~,`z^{n
查询语句,返回记录集ResultSet r0L'
mf$
更新语句,返回数字,表示该更新影响的记录数 n{8v^x
ResultSet的方法 _p^&]eQ+k#
1、next(),将游标往后移动一行,如果成功返回true;否则返回false dc=~EG-_rM
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 >tQ$V<YB
9tBE=L=
4、释放连接 (D~NW*,9
cn.close(); $s,Az_bs
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection W'3~vQF
4E
32DG*
可滚动、更新的记录集 <C{uodFll
1、创建可滚动、更新的Statement kBr?Q
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); G'c6%;0)
该Statement取得的ResultSet就是可滚动的 e4<[|B!O
2、创建PreparedStatement时指定参数 o)r%4YOL
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); x4^*YZc$,
ResultSet.absolute(9000); S>nf]J`
批量更新
B +<i=w
1、Statement $dkkgsw7
Statement sm = cn.createStatement(); ^w6~?'}
sm.addBatch(sql1); cOrFe;8-.
sm.addBatch(sql2); GX,)~Syw*
... =?oYEO7
sm.executeBatch() 3`U^sr:[%
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 C
$*#<<G
2、PreparedStatement ,WgEl4
PreparedStatement ps = cn.preparedStatement(sql); .0b4"0~T6
{ R
Y ";SfYb
ps.setXXX(1,xxx); 8;GuJP\
... MG(qQ#;j/
ps.addBatch(); cj@ar^=`K
} /&!4oBna
ps.executeBatch(); "R
%3v.Z
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Q8?:L<A
7AuzGA0y
事务的处理 )7;E,m<:tO
1、关闭Connection的自动提交 gq~6jf>
cn.setAutoCommit(false); 7I;A5f
2、执行一系列sql语句 w6<zPrA
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close F$nc9x[S
Statement sm ; @0&KM|+
sm = cn.createStatement(insert into user...); Ro:)N:C
sm.executeUpdate(); vH)V\V
sm.close(); RElIWqgY
sm = cn.createStatement("insert into corp...); ujan2'YT
sm.executeUpdate(); Su*f`~G];
sm.close(); 6!$2nK+
3、提交 >NMq^J'/
cn.commit(); -W'T3_
4、如果发生异常,那么回滚 cZl/8?dj}
cn.rollback();