java 数据库基本操作 4L bll%[9
1、java数据库操作基本流程 o<gK"P
2、几个常用的重要技巧: Ot+Z}Z-
可滚动、更新的记录集 )DGJr/)
批量更新 "+M0lGTB
事务处理 |LRAb#F\
GdYQq.
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 EK&";(x2(
1、取得数据库连接 <Nk:C1Op}
1)用DriverManager取数据库连接 3#?53s
例子 Kzx`
E>,z'
String className,url,uid,pwd; /_X`i[
className = "oracle.jdbc.driver.OracleDriver"; WjBH2 v
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; .ah[!O
uid = "system"; |It&1fz}
pwd = "manager"; ,8.$!Zia
Class.forName(className); "l{{H&d
Connection cn = DriverManager.getConnection(url,uid,pwd); R=<%!
2)用jndi(java的命名和目录服务)方式 Bg[_MDWc-P
例子 V.%LA.8
String jndi = "jdbc/db"; nAC>']K4$
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); mp)+wZAN&
DataSource ds = (DataSource) ctx.lookup(jndi); lc 3N i<3v
Connection cn = ds.getConnection(); a!EW[|[Q
多用于jsp中 ;t M
2、执行sql语句 Y2IMHNtH
1)用Statement来执行sql语句 $>7T s>8
String sql; )5NWUuH 5
Statement sm = cn.createStatement(); ^ (s(4|
sm.executeQuery(sql); // 执行数据查询语句(select) erKi*GssZ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); i&%m^p
2)用PreparedStatement来执行sql语句 IhN^*P:Fo
String sql; LzxO=+=9!q
sql = "insert into user (id,name) values (?,?)"; zGdYk-H3TH
PreparedStatement ps = cn.prepareStatement(sql); /'/i?9:
ps.setInt(1,xxx); 4jc?9(y%
ps.setString(2,xxx); vjzG
H*
... 5 B t~tt
ResultSet rs = ps.executeQuery(); // 查询 $<9u:.9xf
int c = ps.executeUpdate(); // 更新 AhkDLm+
9 p,O>I
3、处理执行结果 T^F83Py<
查询语句,返回记录集ResultSet ;b(ww{&
更新语句,返回数字,表示该更新影响的记录数 (*b<IGi;
ResultSet的方法 I$ R1#s
1、next(),将游标往后移动一行,如果成功返回true;否则返回false :dQRrmM
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 P4zwTEk`
^f57qc3nF
4、释放连接 /M JI^\CA
cn.close(); /~Bs5f.]?
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection l-P6B9e|\
5KfrkZ
可滚动、更新的记录集 Dlpmm2
1、创建可滚动、更新的Statement G3 |x%/Fbp
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ,!, tU7-H
该Statement取得的ResultSet就是可滚动的 ^?wR{q"8
2、创建PreparedStatement时指定参数 M.xZU\'ty
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); puLgc$?
ResultSet.absolute(9000); Fv*QcB9K
批量更新 _%er,Ed
1、Statement (S4HU_,88
Statement sm = cn.createStatement(); L[Ot$
sm.addBatch(sql1); Nw*F1*v`
sm.addBatch(sql2); 61b*uoq0w?
... CiGXyhh
sm.executeBatch() MsBm0r`a
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 IMncl=1
2、PreparedStatement r{B28'f[
PreparedStatement ps = cn.preparedStatement(sql); B;S'l|-?
{ #
E_S..
ps.setXXX(1,xxx); rW090Py
... Bd7B\zM
ps.addBatch(); ^BM !TQ%!
} 8;L;R~Q
ps.executeBatch(); PxQQf I>
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 &CcW(-
]Y-Y.&b7t
事务的处理 |N^"?bSt
1、关闭Connection的自动提交 _n/73Oh
cn.setAutoCommit(false); C\ joDAD
2、执行一系列sql语句 alB'l
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Aix6O=K6
Statement sm ; 6)p8BUft
sm = cn.createStatement(insert into user...); F+GX{e7E\
sm.executeUpdate(); wdAKU+tM
sm.close(); }O>4XFj
sm = cn.createStatement("insert into corp...); hv?T}E
sm.executeUpdate(); "M@&*<S
sm.close(); ,Tu.cg
3、提交 YU" /p|!1
cn.commit(); I 44]W &
4、如果发生异常,那么回滚 6VC|]
|*
cn.rollback();