java 数据库基本操作 fzcPi9+
1、java数据库操作基本流程 x1H?e8
2、几个常用的重要技巧: dLA'cQId
可滚动、更新的记录集 5gP<+S#>T
批量更新 9J>b6
事务处理 u=j|']hp#&
dzA5l:5
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 gFO|)I N
1、取得数据库连接 W?+U%bIZ9
1)用DriverManager取数据库连接 Y)D~@|D,
例子 )HZUCi/F]
String className,url,uid,pwd; DGfhS` X
className = "oracle.jdbc.driver.OracleDriver"; X`xI~&t_
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Eu%19s;u
uid = "system"; b1X.#pz7F
pwd = "manager"; 00DWXGt20o
Class.forName(className); -KzU''
Connection cn = DriverManager.getConnection(url,uid,pwd); lo }[o0X
2)用jndi(java的命名和目录服务)方式 aFkxR\x
6%
例子 XD1x*#
String jndi = "jdbc/db"; Rg:3}T`~n
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); *~p~IX{
DataSource ds = (DataSource) ctx.lookup(jndi); 79.J`}#
Connection cn = ds.getConnection(); >z=_V|^$
多用于jsp中 D+ki2UVt&
2、执行sql语句 7 V/yU5
1)用Statement来执行sql语句 WA);Z=
String sql; +{%@kX<V_
Statement sm = cn.createStatement(); 6~ g:"}
sm.executeQuery(sql); // 执行数据查询语句(select) vBUl6EmWu
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); S 6sSdo'
2)用PreparedStatement来执行sql语句 )p.+39]{2
String sql; dhW; |
sql = "insert into user (id,name) values (?,?)"; )G(6=l*
PreparedStatement ps = cn.prepareStatement(sql); K;2]c3T
ps.setInt(1,xxx); V/j]UK0$
ps.setString(2,xxx); -25#Vh
... Pn{yk`6E
ResultSet rs = ps.executeQuery(); // 查询 -Q@jL{Ue
int c = ps.executeUpdate(); // 更新 h]Zc&&+8{
ivdw1g|)h
3、处理执行结果 _ Ko0
查询语句,返回记录集ResultSet FswMEf-|
更新语句,返回数字,表示该更新影响的记录数 `Tzqvnn
ResultSet的方法 }9C5U>?
1、next(),将游标往后移动一行,如果成功返回true;否则返回false lY}mrb
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 $XS0:C0
YYI
4、释放连接 =#XsY,r
cn.close(); dRZor gar
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection {d$S~
{nQ}t
}B
可滚动、更新的记录集 MCma3^/1
1、创建可滚动、更新的Statement Vvx(7p-GQ
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 6RZ[X[R[}
该Statement取得的ResultSet就是可滚动的 u)P$xkf
2、创建PreparedStatement时指定参数 aMTY{
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ;U<)$5
ResultSet.absolute(9000); RCt)qh+
批量更新 DT&[W<oN
1、Statement ?xf59mY7
Statement sm = cn.createStatement(); NrvS/cI!t
sm.addBatch(sql1); \3q{E",\>@
sm.addBatch(sql2); |PN-,f{ -
... c: *wev
sm.executeBatch() %9mCgHQ9
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 qn@Qd9Sf
2、PreparedStatement *DkA$Eu3u
PreparedStatement ps = cn.preparedStatement(sql); lGB7(
{ :kZ2N67
ps.setXXX(1,xxx); p)ZlQ.d#Y
... $#4z>~0
ps.addBatch(); |
7>1)
} ^
+{ ~
^y7
ps.executeBatch(); K=sQ_j.&Z
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 3|:uIoR{
U7crbj;c)d
事务的处理 jZv8X5i
1、关闭Connection的自动提交 #bu`W!p}
cn.setAutoCommit(false); .M>u:,v
2、执行一系列sql语句 0nie>
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close dc&Qi_W
Statement sm ; [9?=&O#*
sm = cn.createStatement(insert into user...); f| N(~
sm.executeUpdate(); c<&+[{|
sm.close(); >4EcV1y
sm = cn.createStatement("insert into corp...); zm8m J2s
sm.executeUpdate(); [JAd1%$3
sm.close(); h]EXD
3、提交 Zl,K#
cn.commit(); OD1ns
4、如果发生异常,那么回滚 r)j#Skh].
cn.rollback();