java 数据库基本操作 ZK_IK)g
1、java数据库操作基本流程 tse(iX/D
2、几个常用的重要技巧: A-.jv
可滚动、更新的记录集 Fi(_A
批量更新 D='/-3f!F]
事务处理 --.: eFE/
MT;<\T
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Q_LPLmM
1、取得数据库连接 r~TiJ?8I
1)用DriverManager取数据库连接 hGD7/qTN
例子 ':F{st>&H
String className,url,uid,pwd; g"xLS}Al
className = "oracle.jdbc.driver.OracleDriver"; 4d9iAN
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; -\AB!#fh
uid = "system"; S1 %{/w
pwd = "manager"; (a]'}c$X9`
Class.forName(className); t'0r4&\
Connection cn = DriverManager.getConnection(url,uid,pwd); U}7$:hO"dX
2)用jndi(java的命名和目录服务)方式 ma?569Z8~0
例子 I+8m1*
String jndi = "jdbc/db"; QTK\"
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); F!j@b!J8
DataSource ds = (DataSource) ctx.lookup(jndi); r'pFHX
Connection cn = ds.getConnection(); _W tSZmW?
多用于jsp中 NfS0yQPx
2、执行sql语句 b
3D:w{l
1)用Statement来执行sql语句 ]#))#-&1
String sql; $U"/.Mh\
Statement sm = cn.createStatement(); b"x;i\Z0%
sm.executeQuery(sql); // 执行数据查询语句(select) E{Y0TZ+
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); KdYT5VUM/
2)用PreparedStatement来执行sql语句 u.8vXc
String sql; )d0&iE`@
sql = "insert into user (id,name) values (?,?)"; NzNAhlXj3
PreparedStatement ps = cn.prepareStatement(sql); xg\M9&J
ps.setInt(1,xxx); S
#&HB
ps.setString(2,xxx); M)Tv(7
... a5z.c_7r
ResultSet rs = ps.executeQuery(); // 查询 +;U}SR<
int c = ps.executeUpdate(); // 更新 pShSKRg
E^#|1Kpq
3、处理执行结果 U:gE:t f
查询语句,返回记录集ResultSet Yca9G?^\v
更新语句,返回数字,表示该更新影响的记录数 7Cp>i WV
ResultSet的方法 !W]># Pm
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Joq9.%7Q
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 q.~.1
'`!
26.iFt/:
4、释放连接 (!DH'2I[
cn.close(); -:cS}I
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection =5I1[p;
6DR@$fpt
可滚动、更新的记录集 |PDuvv!.f
1、创建可滚动、更新的Statement hFj.d]S
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); j$&k;S
该Statement取得的ResultSet就是可滚动的 VH+^G)^) W
2、创建PreparedStatement时指定参数 *Rr,ii
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); noh3mi
ResultSet.absolute(9000); =EsKFt"
批量更新 u|BD%5+J
1、Statement aSXoYG0\
Statement sm = cn.createStatement(); w*#TS8
\
sm.addBatch(sql1); Z]uN9c
sm.addBatch(sql2); $//18+T
... N, ;'oL+
sm.executeBatch() tN";o\!}
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 2,q^O3F
2、PreparedStatement qPH]DabpI
PreparedStatement ps = cn.preparedStatement(sql); )0fQ(3oOg
{ peR=J7
ps.setXXX(1,xxx); .Eh~$wm
... k;;?3)!
ps.addBatch(); zUIh8cAoE
} ZUAWSJ,s
ps.executeBatch(); &FkKnz4IZ
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 n*@^c$&P
/o+,
=7hY
事务的处理 _BtppQIWv
1、关闭Connection的自动提交 {5^'u^E
cn.setAutoCommit(false); HBo^8wN
2、执行一系列sql语句 a%*W^R9Ls
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Qj[4gN?}=
Statement sm ; 3`IDm5
sm = cn.createStatement(insert into user...); L~I<y;x
sm.executeUpdate(); /PQg>Pa85
sm.close(); n?!.r
c
sm = cn.createStatement("insert into corp...); ')Ozz<{
sm.executeUpdate(); Qaq{UW
sm.close(); ;=*b:y Y
3、提交 )8st
cn.commit(); Ml+.\'r
4、如果发生异常,那么回滚 .y+>-[j?B
cn.rollback();