java 数据库基本操作 ~Yz/t
1、java数据库操作基本流程 XX[Wwt
2、几个常用的重要技巧: F",abp!
可滚动、更新的记录集 ]o+|jgkt]
批量更新 YlcF-a
事务处理 [ 6o:v8&3
n#4J]Z@
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 D_ZBx+/_?
1、取得数据库连接 Lr\ B
1)用DriverManager取数据库连接 p vR& ~g
例子 DF[b?
String className,url,uid,pwd; !6/IKh`J
className = "oracle.jdbc.driver.OracleDriver"; Sd{"A0[A|
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; hic$13KuP
uid = "system"; 8(f0|@x^
pwd = "manager"; rH:X/i;D
Class.forName(className); u[|S*(P
Connection cn = DriverManager.getConnection(url,uid,pwd); pH:|G
2)用jndi(java的命名和目录服务)方式 P_g0G#`4
例子 4qz{D"M
String jndi = "jdbc/db"; ^-;Z8M
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); @?=)}2=|?i
DataSource ds = (DataSource) ctx.lookup(jndi); R:R@sU
Connection cn = ds.getConnection(); e&4wwP"`<
多用于jsp中 P"~T*Qq-R
2、执行sql语句 Lpbn@y26<
1)用Statement来执行sql语句 ?~Ed
n-"Y
String sql; E0Y/N?
Statement sm = cn.createStatement(); !cq|g
sm.executeQuery(sql); // 执行数据查询语句(select) :*+BBC
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); VdOd:w
2)用PreparedStatement来执行sql语句 _w/N[E
String sql; x,c68Q)g
sql = "insert into user (id,name) values (?,?)"; RF2XJJ
PreparedStatement ps = cn.prepareStatement(sql); #R PB;#{
ps.setInt(1,xxx); Iw|[*Nu-
ps.setString(2,xxx); d1La7|43u
... E=*Q\3G~
ResultSet rs = ps.executeQuery(); // 查询 &&S4x
int c = ps.executeUpdate(); // 更新 1sLfjH hv
']Xx#U N
3、处理执行结果 =<h=">}5'
查询语句,返回记录集ResultSet B@v H1T
更新语句,返回数字,表示该更新影响的记录数 |M>k &p,B-
ResultSet的方法 a&VJYAB
1、next(),将游标往后移动一行,如果成功返回true;否则返回false *dTf(J
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 3&Rqz9 W
^JDV4>S\
4、释放连接 3\G&fb|?}R
cn.close(); }5FdX3YR
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection PO]z'LD
x-mRPH
可滚动、更新的记录集 p'ukV(B
1、创建可滚动、更新的Statement RT4ns +J1
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); _6(QbY'JV`
该Statement取得的ResultSet就是可滚动的 -BgzAxa
2、创建PreparedStatement时指定参数 rhsSV3iM
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); +t})tDPXw
ResultSet.absolute(9000); O#uTwnW
批量更新 N)WAzH
1、Statement <9B\('
Statement sm = cn.createStatement(); 98x]x:mgI_
sm.addBatch(sql1); O-@*xwD
sm.addBatch(sql2); -P^ 6b(
... Rku9? zf^
sm.executeBatch() _p<s!
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Jo1n>Mo-j
2、PreparedStatement lrPiaSO`I
PreparedStatement ps = cn.preparedStatement(sql); M`-.0
{ bO^#RVH
ps.setXXX(1,xxx); ,nD:W
... 5^~%10=
ps.addBatch(); PTXy:>]M
} t-)C0<
ps.executeBatch(); :
2Ho
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 b7^VWX%
w(zlHj
事务的处理 lED-Jo2
1、关闭Connection的自动提交 |$`)d87,
cn.setAutoCommit(false); K!VIY|U
2、执行一系列sql语句 mzLDZ#=b
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close s_}T-%\
Statement sm ; W2e~!:w
sm = cn.createStatement(insert into user...); X>(?
sm.executeUpdate(); q90eB6G0g
sm.close(); `9}\kn-</8
sm = cn.createStatement("insert into corp...); (p08jR
'5
sm.executeUpdate(); M.iR5Uh
sm.close(); hqd}L~o:
3、提交 Dm?>U1{
cn.commit(); 9=p^E# d
4、如果发生异常,那么回滚 S-&[Tp+N
cn.rollback();