java 数据库基本操作 8ewEdnE
1、java数据库操作基本流程 <;Z~ vZ]
2、几个常用的重要技巧: Vw@x
可滚动、更新的记录集 8r|
批量更新 :H:}t>X6Vo
事务处理 /*2W?ZM~H
q$*_C kT
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 8$tpPOhzb
1、取得数据库连接 ]1$AAmQH
1)用DriverManager取数据库连接 ),FN29mZu
例子 >d[vHyA~!D
String className,url,uid,pwd; }nERQq&A
className = "oracle.jdbc.driver.OracleDriver"; XzFqQ-H
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; @?AE75E{
uid = "system"; *jSc&{s~
pwd = "manager"; s/|'1E\F
Class.forName(className); dOgM9P
Connection cn = DriverManager.getConnection(url,uid,pwd); ptL}F~
2)用jndi(java的命名和目录服务)方式 'QS~<^-j"
例子 APm[)vw#f
String jndi = "jdbc/db"; }j@@
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); \>k#]4@rp
DataSource ds = (DataSource) ctx.lookup(jndi); v"TH[}C9D
Connection cn = ds.getConnection(); u<r('IW0
多用于jsp中 @
MoMU
2、执行sql语句 A+*(Pds
1)用Statement来执行sql语句 GB Un" _J
String sql; ?Og ;W9i
Statement sm = cn.createStatement(); F<<H [,%0
sm.executeQuery(sql); // 执行数据查询语句(select) >(J!8*7
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); WoR**J?}w
2)用PreparedStatement来执行sql语句 5 :>
String sql; v333z<<S
sql = "insert into user (id,name) values (?,?)"; 4B>|Wft{p]
PreparedStatement ps = cn.prepareStatement(sql); _
L6>4
ps.setInt(1,xxx); a m%{M7":7
ps.setString(2,xxx); Rzj!~`&N
... {]N?DmF
ResultSet rs = ps.executeQuery(); // 查询 [NDYJ'VGe
int c = ps.executeUpdate(); // 更新 3+PM_c)Y
*M5C*}dl
3、处理执行结果 {D.0_=y~2
查询语句,返回记录集ResultSet 45JLx?rN_
更新语句,返回数字,表示该更新影响的记录数 +@v} (
ResultSet的方法 ~/[N)RFD
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ds[~Cp
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 A|nU
_*
-<.NEV
4、释放连接 }+3~y'k
cn.close(); 2Rt ZTn
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection @3D%i#2o&[
zOp"n\
可滚动、更新的记录集 'm((G4
1、创建可滚动、更新的Statement *Y?]="8c#;
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); f
8U;T$)
该Statement取得的ResultSet就是可滚动的 j0M;2 3@[
2、创建PreparedStatement时指定参数 YR#1[fe*_
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 0M.[) @
ResultSet.absolute(9000); ZS;kCdL
批量更新 8\_,Y
ji
1、Statement AG=1TZI"
Statement sm = cn.createStatement(); >qZRIDE5$
sm.addBatch(sql1); mJqP#Unik
sm.addBatch(sql2); =~*u(0sJa
... -p~B
-,
sm.executeBatch() 0nn#U
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 w-/Tb~#E
2、PreparedStatement -OAH6U9^
PreparedStatement ps = cn.preparedStatement(sql); zj4JWUM2
{ y['icGU6
ps.setXXX(1,xxx); 3".W
... >?xVr
ps.addBatch(); 3N\X{za
} ?!vW&KJZx
ps.executeBatch(); .=D6<4#t
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 :v48y.Ij7s
;W:Q}[
事务的处理 !%=k/|#
1、关闭Connection的自动提交 RmCR"~
cn.setAutoCommit(false); *()#*0
2、执行一系列sql语句 Fv
B2y8&W
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close IRY2H#:$
Statement sm ; \NRRN eu|
sm = cn.createStatement(insert into user...); %M:"Ai5:
sm.executeUpdate(); JJO"\^,;~
sm.close(); nV1,
):kh
sm = cn.createStatement("insert into corp...); T[J_/DE@
sm.executeUpdate(); yK;I<8+>_
sm.close(); X}
8U-N6)
3、提交 $S/ 8T
cn.commit(); =="SW"vNi
4、如果发生异常,那么回滚 uEY5&wX`
cn.rollback();