java 数据库基本操作 )NZ6!3[@
1、java数据库操作基本流程 [@[!esC
2、几个常用的重要技巧: !o &+
可滚动、更新的记录集 k%#`{#ni
批量更新 VtF^;
f
事务处理 }(O/ y-
!_s|h@
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 hNUAwTH6
1、取得数据库连接 ^[XxE Lx
1)用DriverManager取数据库连接 5gW`;Cdbyc
例子 hb9X<N+p
String className,url,uid,pwd; u814ZN}
className = "oracle.jdbc.driver.OracleDriver"; %*P59%
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; o#E 3{zM
uid = "system"; mnL
\c'
pwd = "manager"; 1Nx.aji
Class.forName(className);
qEKTSet?
Connection cn = DriverManager.getConnection(url,uid,pwd); HyXw^ +tsj
2)用jndi(java的命名和目录服务)方式 "!XeK| Wi
例子 m}0US;c#f
String jndi = "jdbc/db"; OlhfBu)~
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); PRl\W:_t
DataSource ds = (DataSource) ctx.lookup(jndi); +O3zeL
Connection cn = ds.getConnection(); =25qY"Mf
多用于jsp中 ?RvXO'm l
2、执行sql语句 VE^NSkOa&
1)用Statement来执行sql语句 _:0<]<x?
String sql; }5bh,'
Statement sm = cn.createStatement(); {rGq|Bj
sm.executeQuery(sql); // 执行数据查询语句(select) Vn? %w~0!
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); I"@X~Y7}
2)用PreparedStatement来执行sql语句
y|q4d(P.
String sql; d9|dHJf
sql = "insert into user (id,name) values (?,?)"; r9@O`i
PreparedStatement ps = cn.prepareStatement(sql); gBHev1^y
ps.setInt(1,xxx); xBU\$ToC
ps.setString(2,xxx); ;OmmXygl
... Jl&bWp^3
ResultSet rs = ps.executeQuery(); // 查询 j11 \t
int c = ps.executeUpdate(); // 更新 ,Ihuo5>/z
[6BLC{2
3、处理执行结果 tC\x9&:
查询语句,返回记录集ResultSet oT&JQ,i[2Q
更新语句,返回数字,表示该更新影响的记录数 V4qHaG
ResultSet的方法 b$[_(QUw
1、next(),将游标往后移动一行,如果成功返回true;否则返回false (.P;VH9R\
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 y&9S+
_)2.#L
4、释放连接 zc]F
cn.close(); j>eL&.d
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ~j3B'
R B.j@*
可滚动、更新的记录集 u#%Ig3
1、创建可滚动、更新的Statement
>joGGT
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); O;f^'N
该Statement取得的ResultSet就是可滚动的 4C[,S|J
2、创建PreparedStatement时指定参数 fOJk+?
c
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Rp A76ug
ResultSet.absolute(9000); Nv*x^y]
批量更新 >OE.6)'Rm
1、Statement [Z,AquCU(
Statement sm = cn.createStatement(); r\vB-nJ
sm.addBatch(sql1); K7<'4i~k
sm.addBatch(sql2); jd l1Q<Z
... =nFT0];
sm.executeBatch() nSsVONHfa
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 s8}:8
2、PreparedStatement M
^ZoBsZ
PreparedStatement ps = cn.preparedStatement(sql); Y_>z"T
{ BzF.KCScs
ps.setXXX(1,xxx); ogMLv}
... *]z.BZI:
ps.addBatch(); V|}9d:&O
} +^gh3Y
ps.executeBatch(); t2p/NIn
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ]~8bh*,=
>?'q P ]
事务的处理 zJI/j
_~W
1、关闭Connection的自动提交 tzi+A;>c(v
cn.setAutoCommit(false); WRh&4[G'
2、执行一系列sql语句 &[*_ -
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close X~0l1 @!
Statement sm ; kR^7Z7+#*
sm = cn.createStatement(insert into user...); cAyR)Y!I
sm.executeUpdate(); nX5*pTfjL3
sm.close(); &Xe r#6~
sm = cn.createStatement("insert into corp...); tA#X@HIE
sm.executeUpdate(); p$f#W
sm.close(); (J.(Fl>^
3、提交 #lltXqvD?
cn.commit(); ;VK;_d
4、如果发生异常,那么回滚 vc6UA%/f
cn.rollback();