java 数据库基本操作 zl $mt'\y
1、java数据库操作基本流程 JCO+_d#x
2、几个常用的重要技巧: _xY
dnTEl
可滚动、更新的记录集 Vq$8!#~w
批量更新 n37P$0
事务处理 :<gC7UW
YxowArV}uz
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Y<qWG8X
1、取得数据库连接 z;iNfs0i$
1)用DriverManager取数据库连接 V$0mcwH
例子 l$Y*ii
String className,url,uid,pwd; pT|l "q@
className = "oracle.jdbc.driver.OracleDriver"; [eLMb)n
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; aGBUFCCa
uid = "system"; u43W.4H13
pwd = "manager"; [|A;{F#
Class.forName(className); @k+K_gR
Connection cn = DriverManager.getConnection(url,uid,pwd); /Ixv{H)H
2)用jndi(java的命名和目录服务)方式 WIKSz
{"=/
例子 L _D #
String jndi = "jdbc/db"; z=/&tRe
W
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); &$yxAqdab
DataSource ds = (DataSource) ctx.lookup(jndi); +9exap27
Connection cn = ds.getConnection(); vB<9M-sa0
多用于jsp中 {:]u 6l
2、执行sql语句 \Vb|bw'e(
1)用Statement来执行sql语句 q{Ao
j
String sql; P"[\p|[U
Statement sm = cn.createStatement(); k@Qd:I;;
sm.executeQuery(sql); // 执行数据查询语句(select) &ea6YQ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 4ibOVBG:*,
2)用PreparedStatement来执行sql语句 #?"^: ,Y
String sql; OMfw#
sql = "insert into user (id,name) values (?,?)"; []:&WA9N
PreparedStatement ps = cn.prepareStatement(sql); (h"-#q8$
ps.setInt(1,xxx); LIE5of
ps.setString(2,xxx); d0V*[{
... 7y4jk
ResultSet rs = ps.executeQuery(); // 查询 \&/V p`
int c = ps.executeUpdate(); // 更新 l=UXikx
:lW8f~!
3、处理执行结果 nD.K*# u
查询语句,返回记录集ResultSet CT?4A1[aD
更新语句,返回数字,表示该更新影响的记录数 8'qq!WR~
ResultSet的方法 /Bq4! n+
1、next(),将游标往后移动一行,如果成功返回true;否则返回false y**YFQ*sc
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 7bk`u'0%
HSR,moI
4、释放连接 Cz|F%>y#
cn.close(); NK\0X5##.
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ;F|8#! (
nvB<pSm
可滚动、更新的记录集 s+t[{i4|
1、创建可滚动、更新的Statement Gv&%cq1
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ,n{R,]y\
该Statement取得的ResultSet就是可滚动的 &6e A.
2、创建PreparedStatement时指定参数 .;F%k,!v
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); zJ)`snN|
ResultSet.absolute(9000); t|P+^SL
批量更新 ]TVc 'G;
1、Statement {X5G
Statement sm = cn.createStatement(); ra;:
sm.addBatch(sql1); `y>BbJqy
sm.addBatch(sql2); ~6=aoF5"3?
... '>cZ7:
sm.executeBatch() 068DC_
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 }Gva=N:
2、PreparedStatement +#L'gc
PreparedStatement ps = cn.preparedStatement(sql); 8.HJoos
{ mWF\h>]|.
ps.setXXX(1,xxx); {8 #
... GXi)3I%
ps.addBatch(); 6zIK%<
} W[f%m0
ps.executeBatch(); )>tT""yEl
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 !Qq~lAJO;
Lb#PiTJI
事务的处理 4k!>JQor
1、关闭Connection的自动提交 |?v .5|1
cn.setAutoCommit(false); T9FGuit9
2、执行一系列sql语句 2y IDyo
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ;o158H$gz;
Statement sm ; [>LO'}%
sm = cn.createStatement(insert into user...); &r+!rL Kp
sm.executeUpdate(); iD.p KG
sm.close(); cx[[K.
sm = cn.createStatement("insert into corp...); i0u`J
sm.executeUpdate(); ):\+%v^
sm.close(); 5?A<('2
3、提交 wbB\~*Z)
cn.commit(); #+H3b!8=
4、如果发生异常,那么回滚 :w]NN\
cn.rollback();