java 数据库基本操作 mNoqs&UB
1、java数据库操作基本流程
@U@ yIv
2、几个常用的重要技巧: $:!T/*p*
可滚动、更新的记录集 Hw&M2a
批量更新 Bq_P?Q+\
事务处理 Bw.&3efd
IviQ)hp
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 6a?p?I K^
1、取得数据库连接 RCXSz
1)用DriverManager取数据库连接 rrYp^xLa`
例子 PqLqF5`S
String className,url,uid,pwd; !`o:+Gg@
className = "oracle.jdbc.driver.OracleDriver"; &tCtCk%{j
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; VY@hhr1s~
uid = "system"; g/p9"eBpq
pwd = "manager"; [t{#@X
Class.forName(className); %PbqASm
Connection cn = DriverManager.getConnection(url,uid,pwd); ecpUp39\
2)用jndi(java的命名和目录服务)方式 y#;VGf6lj
例子 MXk. 2
String jndi = "jdbc/db"; W+e*(W|d6
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); [oLQd-+
DataSource ds = (DataSource) ctx.lookup(jndi); =hIT?Z6A
Connection cn = ds.getConnection(); ^]&{"!
多用于jsp中 I?Fa
2、执行sql语句 \/'n[3x
1)用Statement来执行sql语句 5C1Rub)
String sql; u7Y< ~
Statement sm = cn.createStatement(); 2-!Mao"^
sm.executeQuery(sql); // 执行数据查询语句(select) &> .1%x@R
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); #l# [\6
2)用PreparedStatement来执行sql语句 MmH_gR
String sql; \N+Ta:U1P
sql = "insert into user (id,name) values (?,?)"; ID# qKFFW
PreparedStatement ps = cn.prepareStatement(sql); <Cu?$
ps.setInt(1,xxx); e-3pg?M
ps.setString(2,xxx); O&iYGREO
... tkqBCKpDa
ResultSet rs = ps.executeQuery(); // 查询 OG7v'vmY
int c = ps.executeUpdate(); // 更新 w*%$
lhp!
zB"
`i
3、处理执行结果 EZQ+HECpK
查询语句,返回记录集ResultSet e.|RC
更新语句,返回数字,表示该更新影响的记录数 hRIS[#z;U
ResultSet的方法 vx}Z
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Gj8[*3d
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 8:?Q(M7
|#:dC #
4、释放连接
ZHECcPhz
cn.close(); J?quYlS
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection cN}A rv
&d3 '{~:
可滚动、更新的记录集 I@Z*Nu1L
1、创建可滚动、更新的Statement 8t:h
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); }9udo,RWu
该Statement取得的ResultSet就是可滚动的 ?J@qg20z
2、创建PreparedStatement时指定参数 ak8^/1*@
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); LiD |4(3
ResultSet.absolute(9000); &Z;8J @
批量更新 RG
r'<o )
1、Statement dIa(</ }
Statement sm = cn.createStatement(); m4U+,|Fa
sm.addBatch(sql1); WfT)CIKs
sm.addBatch(sql2); X#I`(iHY
... m2q;^o:J
sm.executeBatch() ;AGs1j
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 3k*:B~1
2、PreparedStatement U"y'Kd
PreparedStatement ps = cn.preparedStatement(sql); _7.GzQJ
{ |+xtFe
ps.setXXX(1,xxx); ca3BJWY}J
... )):22}I#
ps.addBatch(); GHC?Tp
} ^x"c0R^
ps.executeBatch(); <ivqe"m
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 p/WH#4Xdr
&Dg)"Xji
事务的处理 u4,X.3V]A
1、关闭Connection的自动提交 !QR?\9`
cn.setAutoCommit(false); a$zm/
2、执行一系列sql语句 1;:t~Y
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close nR@,ouB-$
Statement sm ; gLSG:7m@
sm = cn.createStatement(insert into user...); `TD%M`a
sm.executeUpdate(); ?I2k6%a
sm.close(); h3]@M$Y[
sm = cn.createStatement("insert into corp...); Q@W|GOH3
sm.executeUpdate(); 7|M $W(P
sm.close(); Z:lB:U'o
3、提交 xe gL!
cn.commit(); !E{GcK
4、如果发生异常,那么回滚 [zTYiNa
cn.rollback();