java 数据库基本操作 $Y,,e3R3
1、java数据库操作基本流程 >tr_Ypfv,c
2、几个常用的重要技巧: = EyxM
可滚动、更新的记录集 ngsax1xO
批量更新 ^W_}Gd<-#Y
事务处理 Zj<oh8
"f!*%SR:
1
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ~BERs;4
1、取得数据库连接 a_waLH/
1)用DriverManager取数据库连接 U"%k4]:A
例子 htX'bA
String className,url,uid,pwd; S82NU2L
className = "oracle.jdbc.driver.OracleDriver"; UciWrwE
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; >:W)9o
uid = "system"; nKu`Ta*fX
pwd = "manager"; ?9H7Twi+T
Class.forName(className); L]K*Do
Connection cn = DriverManager.getConnection(url,uid,pwd); S/~6%uJ
2)用jndi(java的命名和目录服务)方式 @T;O^rE~N
例子 ^nbze
String jndi = "jdbc/db"; iUS379wM}
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); $rFv(Qc^=
DataSource ds = (DataSource) ctx.lookup(jndi); .7ahz8v
Connection cn = ds.getConnection(); n
'P:
多用于jsp中 f910drg7
2、执行sql语句 ^>%=/RX
1)用Statement来执行sql语句 AU87cqq
String sql; Y0s^9?*
Statement sm = cn.createStatement(); Qi=rhN`
sm.executeQuery(sql); // 执行数据查询语句(select) PO&xi9_
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); )Bb :tz+
2)用PreparedStatement来执行sql语句 "MoV*U2s,
String sql; mNb+V /*x3
sql = "insert into user (id,name) values (?,?)"; }[LK/@h
PreparedStatement ps = cn.prepareStatement(sql); _JR4
PKtx
ps.setInt(1,xxx); *zX<`E
ps.setString(2,xxx); KOi%zE%
... CvbY2_>Nh
ResultSet rs = ps.executeQuery(); // 查询 ~@'|R%jJ
int c = ps.executeUpdate(); // 更新 De>pIN;B>
~Rv U+D
3、处理执行结果 l'
"<
查询语句,返回记录集ResultSet _F@FcFG1Z*
更新语句,返回数字,表示该更新影响的记录数 tCc}}2bC&
ResultSet的方法 1"v;w!uh
1、next(),将游标往后移动一行,如果成功返回true;否则返回false *,'"\n
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 "hy#L
0\t
R`1$z8$
4、释放连接 !^8'LMY<I
cn.close(); A=XM(2{aN
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection A)`M*(~
:-6_X<
可滚动、更新的记录集 E> 4
\9
1、创建可滚动、更新的Statement $mlsFBd
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); jBE=Ij
该Statement取得的ResultSet就是可滚动的 "UAW
2、创建PreparedStatement时指定参数 "4"L"lJ
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Qz$.t>@V=
ResultSet.absolute(9000); koqH~>ZtD
批量更新 -C8awtbC
1、Statement \{UiGCK
Statement sm = cn.createStatement(); 0f-gQD
sm.addBatch(sql1); {?m',sG;&
sm.addBatch(sql2); mS%D"
e
... ^ )+tn
sm.executeBatch() @NyCMe;]
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 aqyXxJS8
2、PreparedStatement l7x%G@1#~W
PreparedStatement ps = cn.preparedStatement(sql); eA+6-'qN
{ 9k*'5(D4S
ps.setXXX(1,xxx); 5,mb]v0k
... ]"YG7|E U
ps.addBatch(); HX=`kkX
} _Y~+ #Vc
ps.executeBatch(); Fe/*U4xU
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 sxuYwQ
HZP`u >.
事务的处理 rsc8lSjH
1、关闭Connection的自动提交 c3Mql+@
cn.setAutoCommit(false); /sYD+*a
2、执行一系列sql语句 A!j&g(Z"Q
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close i4uUvZf
Statement sm ; 4{J%`H`Q!
sm = cn.createStatement(insert into user...); a"ht\v}1
sm.executeUpdate(); V=
.'Db2D
sm.close(); gGZ$}vX
sm = cn.createStatement("insert into corp...); 4K4?Q+?
sm.executeUpdate(); "4ovMan
sm.close(); _$F I>
3、提交 5X[=Q>
cn.commit(); #|gt(p]C
4、如果发生异常,那么回滚 M~wJe@bc
cn.rollback();