java 数据库基本操作 -rDz~M+
1、java数据库操作基本流程 [l[{6ZXt
2、几个常用的重要技巧: ->yeJTsE9
可滚动、更新的记录集 Uk-HP\C"7
批量更新 BGjb`U#%3
事务处理 ZxS&4>.
3DoRE2}
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ~/`X*n&
1、取得数据库连接 ?B4#f!X
1)用DriverManager取数据库连接 SQKt}kDbM
例子 =2oUZjA
String className,url,uid,pwd; D&[Z;,CHMA
className = "oracle.jdbc.driver.OracleDriver"; FpkXOj?*
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; U7%28#@
uid = "system"; 4=p@2g2"H
pwd = "manager"; }#b
%"I0
Class.forName(className); b4~H3|
Connection cn = DriverManager.getConnection(url,uid,pwd); H,>#|F
2)用jndi(java的命名和目录服务)方式 'H=weH
例子 Gm&2R4 )EP
String jndi = "jdbc/db"; U4_"aT>My
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); gGKKs&n7
DataSource ds = (DataSource) ctx.lookup(jndi); : z~!p~
Connection cn = ds.getConnection(); w4:<fnOM
多用于jsp中 \X@IkL$r
2、执行sql语句 56s*A*z$
;
1)用Statement来执行sql语句 -fux2?8M
String sql; dokuyiN\
Statement sm = cn.createStatement(); Uh+jt,RB`
sm.executeQuery(sql); // 执行数据查询语句(select) dp^N_9$cdO
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); v"k4ATWP
2)用PreparedStatement来执行sql语句 AA7#c7
String sql; aii'}c
sql = "insert into user (id,name) values (?,?)"; BQ#jwu0e
PreparedStatement ps = cn.prepareStatement(sql); <"I?jgo
ps.setInt(1,xxx); VC=6uB
ps.setString(2,xxx); `$9L^Yg,4
... 31 ]7z
ResultSet rs = ps.executeQuery(); // 查询 4Vx+[8W
int c = ps.executeUpdate(); // 更新 9U10d&M(
YY!!<2_
3、处理执行结果 9N}W(>
查询语句,返回记录集ResultSet =QiT)9q)
更新语句,返回数字,表示该更新影响的记录数 l @A"U)A(
ResultSet的方法 nO@+s
F
1、next(),将游标往后移动一行,如果成功返回true;否则返回false kukaim>K
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 d8.ajeN]o
.! j#3J..u
4、释放连接 p}8ratmN
cn.close(); WTu{,Q
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection v>^jy8$
|+/$ g.
可滚动、更新的记录集 )_O.{$
to
1、创建可滚动、更新的Statement Y\u_+CG*
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); /.-m}0h|W-
该Statement取得的ResultSet就是可滚动的 aL$j/SC
2、创建PreparedStatement时指定参数 B*Cb6'Q
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 4sd-zl$Of
ResultSet.absolute(9000); U$$3'n
批量更新 8DT@h8tA
1、Statement
?zE<
Statement sm = cn.createStatement(); 4[H,3}p9H
sm.addBatch(sql1); -wIM0YJ
sm.addBatch(sql2); R`7n^,
... !47A$sQ
sm.executeBatch() 'WzUu MCx
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Q=XA"R
2、PreparedStatement $9m5bQcV
PreparedStatement ps = cn.preparedStatement(sql); htg'tA^CtS
{ G 4"lZM
ps.setXXX(1,xxx); 0nT%Slbih
... ct.Bg)E
ps.addBatch(); b.(XS?4o
} T]X{@_
ps.executeBatch(); 2HVCXegq
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 |lHFo{8"
wL'C1Vr
事务的处理 <
[w++F~
1、关闭Connection的自动提交 `^f}$R|
cn.setAutoCommit(false); K*[0dza$
2、执行一系列sql语句 9T]va]w?#
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close C[W5d~@;E
Statement sm ; YRu%j4Tx
sm = cn.createStatement(insert into user...); \y,;Cfl<
sm.executeUpdate(); i/M+t~
sm.close(); "9u-lcQ\
sm = cn.createStatement("insert into corp...); 67,3i~
sm.executeUpdate(); m^c%]5$
sm.close(); KY8^BjY@
3、提交 Lo5Jb6nm
cn.commit(); SZI7M"gf/+
4、如果发生异常,那么回滚 %8g$T6E[<2
cn.rollback();