java 数据库基本操作 qAvvXs=5
1、java数据库操作基本流程 ds')PIj
2、几个常用的重要技巧: qL~Pjr>cF
可滚动、更新的记录集 :z124Zf
批量更新 Xr)g
事务处理 )w@y(;WJ
pfNThMf
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 6d(b'S^
1、取得数据库连接 dr>]+H=3E
1)用DriverManager取数据库连接 <H_LFrB$W
例子 o"f%\N0_8
String className,url,uid,pwd; LA>dkPB
className = "oracle.jdbc.driver.OracleDriver"; ls]Elo8h1f
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ;pCG9
uid = "system"; WT1q15U(=
pwd = "manager"; '9Qd.q7s|b
Class.forName(className); 3XBp6`
Connection cn = DriverManager.getConnection(url,uid,pwd); tUn&z?7bF
2)用jndi(java的命名和目录服务)方式 f`bIQ 9R
例子 '>4+WZ1w5
String jndi = "jdbc/db"; X.:_"+I;
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ?n73J wH
DataSource ds = (DataSource) ctx.lookup(jndi); J$<:/^t
Connection cn = ds.getConnection(); !zF4 G,W
多用于jsp中 =7H.F:BBG
2、执行sql语句 ?|gGsm+
1)用Statement来执行sql语句 =+k&&vOAn
String sql; E^'C" 6
Statement sm = cn.createStatement(); h^Arb=I
sm.executeQuery(sql); // 执行数据查询语句(select) >^sz5d+X
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); b^@`uDb6
2)用PreparedStatement来执行sql语句 1h&)I%`?
String sql; )3+xsn v
sql = "insert into user (id,name) values (?,?)"; \qRjXadj
PreparedStatement ps = cn.prepareStatement(sql); v] W1F,u
ps.setInt(1,xxx); d#RF0,Y 9
ps.setString(2,xxx); 5IwX\
... {Nzmb|&
ResultSet rs = ps.executeQuery(); // 查询 wV]sGHu F}
int c = ps.executeUpdate(); // 更新 Y+}OClS
B6^w{eXN
3、处理执行结果 CvgPIrl
查询语句,返回记录集ResultSet 3T Yo
更新语句,返回数字,表示该更新影响的记录数 tP/GDC;
ResultSet的方法 b0rt.XB
1、next(),将游标往后移动一行,如果成功返回true;否则返回false kJVM3F%
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 1"*Nb5s
"`y W]v
4、释放连接 \5j22L9S
cn.close(); oC^z_AtZ
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection pIM*c6
P6.) P|n7=
可滚动、更新的记录集 }7f 1(#{7
1、创建可滚动、更新的Statement w}]3jc84
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); K gR1El.r
该Statement取得的ResultSet就是可滚动的 7"h=MB_
2、创建PreparedStatement时指定参数 ?w c3+?\J
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); :*^(OnIe
ResultSet.absolute(9000); c"oQ/x
批量更新 2_B;
1、Statement Y9\]3Kno
Statement sm = cn.createStatement(); ,3g]=f
sm.addBatch(sql1); QySca(1tN
sm.addBatch(sql2); FE^?U%:u@
... u|:UFz^p
sm.executeBatch() =rs=8Ty?S
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 XPR:_
2、PreparedStatement uL qpbn
PreparedStatement ps = cn.preparedStatement(sql); c +"O\j'
{ ^ mQ;CMV
ps.setXXX(1,xxx); RBHqLg(
... 'Sb6
w+
ps.addBatch(); CU}
q&6h
} $!
fz~
ps.executeBatch(); ;dpS@;v
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 4Tbi%vF{
s\n,Z?m
事务的处理 x1 R!
1、关闭Connection的自动提交 2={K-s20
cn.setAutoCommit(false); oPC IlH
2、执行一系列sql语句 0t/z"
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close )PLc+J.I
Statement sm ; ~Krg8s!F&
sm = cn.createStatement(insert into user...); ,vHX>)M|
sm.executeUpdate(); A~%g"
sm.close(); JOL Z2
sm = cn.createStatement("insert into corp...); e[|p0 ,Q
sm.executeUpdate(); o@Cn_p^X
sm.close(); r4z}yt+
3、提交 X/?h!Y}
cn.commit(); {0m[:af&
4、如果发生异常,那么回滚 z;z'`A
cn.rollback();