java 数据库基本操作 o"ah\"#el
1、java数据库操作基本流程 :@@A
2、几个常用的重要技巧: /4B4IT
可滚动、更新的记录集 N7I71q|
批量更新 1={Tcq\]
事务处理 4(0t
GF
{EoyMJgz
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 noUZ9M|hz
1、取得数据库连接 ,I&0#+}n
1)用DriverManager取数据库连接 %}ApO{
例子 EAd:`X,Y
String className,url,uid,pwd; =Z>V}`n
className = "oracle.jdbc.driver.OracleDriver"; UK<DcM~n
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ]-5jgz"
uid = "system"; (8-lDoW
pwd = "manager"; 0-~6}
r$
Class.forName(className); o?O,nD
6
Connection cn = DriverManager.getConnection(url,uid,pwd); ^B!?;\4IM
2)用jndi(java的命名和目录服务)方式 ;Y|~!%2~
例子 5fx,rtY2sQ
String jndi = "jdbc/db"; > v!c\
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); n\"LN3
DataSource ds = (DataSource) ctx.lookup(jndi); 7" STS7_
Connection cn = ds.getConnection(); $H:h(ia:
多用于jsp中 Qdr-GODx
2、执行sql语句 :%b2;&A[
1)用Statement来执行sql语句 LI|HET_
String sql; U1HD~
Statement sm = cn.createStatement(); C94UF7al
sm.executeQuery(sql); // 执行数据查询语句(select) %1?V6&
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); CygV_q
2)用PreparedStatement来执行sql语句 v4>"p!_C
String sql; BSu)O~s
sql = "insert into user (id,name) values (?,?)"; 7fTg97eF
PreparedStatement ps = cn.prepareStatement(sql); HFx"fT
ps.setInt(1,xxx); eW*ae;-
ps.setString(2,xxx); M7<#=pX&
... @oc%4~zl
ResultSet rs = ps.executeQuery(); // 查询 ]vkHU6d
int c = ps.executeUpdate(); // 更新 /e?ux ~f|
HJ1\FO9\
3、处理执行结果 +$QL0|RL
查询语句,返回记录集ResultSet '/Cz{<,
更新语句,返回数字,表示该更新影响的记录数 9H%xZ(`vN
ResultSet的方法 Y$$?8xr
~
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 2l(j
4~g
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 j% USu+&
8(/f!~
4、释放连接 P ~
pbx
cn.close(); 07"Oj9NlA
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection c)!s[o L
%3+hz$E
可滚动、更新的记录集 a={qA4N
1、创建可滚动、更新的Statement zcWxyLifl0
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); "gikX/Co=
该Statement取得的ResultSet就是可滚动的 I nK)O';
2、创建PreparedStatement时指定参数 g#%FY1xp
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); E,"btBg
ResultSet.absolute(9000); ^RAFmM#F
批量更新 8U:dgXz
1、Statement EbYH?hPo
Statement sm = cn.createStatement(); O#5( U.E
sm.addBatch(sql1); cASHgm
sm.addBatch(sql2); +M]8_kE=+l
... S=amj cC
sm.executeBatch() |j}F$*SE[
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 J$/BH\
2、PreparedStatement N b[o6AX
PreparedStatement ps = cn.preparedStatement(sql); ~rX6owBq
{ %e<dV\x?T
ps.setXXX(1,xxx); u\geD
... \J:T]
ps.addBatch(); *=9#tYn~
} ;GT)sI
ps.executeBatch(); Jb.u^3R@
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Ib8{+j
yi;t
事务的处理 &FF. Ddt{
1、关闭Connection的自动提交 ?[B[ F
cn.setAutoCommit(false); D=sc41]
2、执行一系列sql语句 j"u)/A8*
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close M>gZVB,eP>
Statement sm ; T<?BIQz(}
sm = cn.createStatement(insert into user...); +*{5ORq=
sm.executeUpdate(); +mOtYfW
sm.close(); [IBk-opap
sm = cn.createStatement("insert into corp...); @CI6$
sm.executeUpdate(); \\Tp40m+
sm.close(); *`.{K12T
3、提交
5g>kr<K
cn.commit(); >b?)WNk
4、如果发生异常,那么回滚 jyH_/X5i7
cn.rollback();