java 数据库基本操作 %n$^-Vc&
1、java数据库操作基本流程 oVkq2
2、几个常用的重要技巧: ND]S(C"?
可滚动、更新的记录集 "Tbnxx]J
批量更新 C?m,ta3
事务处理 =Z0t :{
,cHU) j
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 :Z`4j
1、取得数据库连接 c,5n,i
1)用DriverManager取数据库连接 $N+6h#
例子 "X1vZwK8N
String className,url,uid,pwd; *$,+`+
className = "oracle.jdbc.driver.OracleDriver"; i s"vekC
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; "ORzWnE4U
uid = "system"; QEJGnl676
pwd = "manager"; E:A!wS`"
Class.forName(className); IhonnLLW
Connection cn = DriverManager.getConnection(url,uid,pwd); L ^Y3=1#"g
2)用jndi(java的命名和目录服务)方式 2wpjU&8W!
例子 W? ,$!]0
String jndi = "jdbc/db"; W|c.l{A5Q
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); gp
DataSource ds = (DataSource) ctx.lookup(jndi); lglYJ,
Connection cn = ds.getConnection(); !e8i/!}^S
多用于jsp中 ;b~~s.+
2、执行sql语句 B!,yfTk]
1)用Statement来执行sql语句 is#8R:7.:
String sql; D5A=,\uk
Statement sm = cn.createStatement(); 0Qd%iP)6
sm.executeQuery(sql); // 执行数据查询语句(select) ym%slg
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Df=q-iq<{/
2)用PreparedStatement来执行sql语句 TQ9'76INb
String sql; 1p\Ak
sql = "insert into user (id,name) values (?,?)"; qc8Ta"
PreparedStatement ps = cn.prepareStatement(sql); 7[o {9Yp&
ps.setInt(1,xxx); "n?<2
wso
ps.setString(2,xxx); 6 DP[g8
... >9(i)e
ResultSet rs = ps.executeQuery(); // 查询 T!^Mvat
int c = ps.executeUpdate(); // 更新 9U<Hf32
&TT":FPR
3、处理执行结果 V/y=6wUiSl
查询语句,返回记录集ResultSet 9{eBgdC
更新语句,返回数字,表示该更新影响的记录数 cH"@d^"+q|
ResultSet的方法 X ,
ZeD
1、next(),将游标往后移动一行,如果成功返回true;否则返回false "E PD2,%S
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 HhSjR%6HY;
} p'8w\C$
4、释放连接 =MSu3<y,
cn.close(); X%4h(7;v
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection jxY-u+B
b7$}JCn
可滚动、更新的记录集 U6{dI@|B
1、创建可滚动、更新的Statement EF;,Gjh5p
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 31XU7A
该Statement取得的ResultSet就是可滚动的 olty4kGD$V
2、创建PreparedStatement时指定参数 ROoE%%8I
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 0n5UKtB
ResultSet.absolute(9000); @>O&Cpt
批量更新 v]bAWo
1、Statement f=ib9WbR#
Statement sm = cn.createStatement(); TETsg5#
sm.addBatch(sql1); .hN3`>*V
sm.addBatch(sql2); h~ha
... rSyaZ6#
sm.executeBatch() 0j@Ix EPs
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 9~Xg#{
2、PreparedStatement Fk$@Yy+}e
PreparedStatement ps = cn.preparedStatement(sql); Y><(?
{ D@hmO]5c
ps.setXXX(1,xxx); (!n-Age
... E~He~wHWe
ps.addBatch(); {wu!6\:<??
} t<lyg0f
ps.executeBatch(); q<XcOc5
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ^Kw(&v
/=M.-MU2
事务的处理 v MWC(m
1、关闭Connection的自动提交 faVS2TN4
cn.setAutoCommit(false); s^PmnFR
2、执行一系列sql语句 Y'_ D<Mp
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close h.b+r~u
Statement sm ; hEcYpng~
sm = cn.createStatement(insert into user...); )6G+ tU'
sm.executeUpdate(); |Ow$n
sm.close(); 7SHo%bA
sm = cn.createStatement("insert into corp...); 4TJ!jDkox
sm.executeUpdate(); r,nn~
sm.close(); ,4Y sZ
3、提交 Qa?QbHc
cn.commit(); vs*I7<
4、如果发生异常,那么回滚 ;U7t
cn.rollback();