java 数据库基本操作 ;dqk@@O"(
1、java数据库操作基本流程 5:Yck<
2、几个常用的重要技巧: >aEL;V=}P
可滚动、更新的记录集 XJx,9trH
批量更新 I#|ocz
事务处理 ]ZzoJ7lr
\4h>2y
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 1Yc%0L(
1、取得数据库连接 ?xtt7*'D
1)用DriverManager取数据库连接 `6a]|7|f
例子 EKZ$Q4YE
String className,url,uid,pwd; N#(jK1`y
className = "oracle.jdbc.driver.OracleDriver"; Yv)Bj
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ,M\j%3
uid = "system"; `%-4>jI9-
pwd = "manager"; 5cD
XWF
Class.forName(className); %&^Q(f
Connection cn = DriverManager.getConnection(url,uid,pwd); 1<xcMn0et
2)用jndi(java的命名和目录服务)方式 z 0~j
例子 "'['(e+7
String jndi = "jdbc/db"; UdT&cG
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); NTqo`VWe
DataSource ds = (DataSource) ctx.lookup(jndi); 8AT;8I<K
Connection cn = ds.getConnection(); ZlthYuJ
多用于jsp中 Q`H#
fS~
2、执行sql语句 ?VFM]hO
1)用Statement来执行sql语句 nIf N"
String sql; *;<e
'[Y7f
Statement sm = cn.createStatement(); '@'B>7C#
sm.executeQuery(sql); // 执行数据查询语句(select) ecn}iN
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); >@^<S_KVh
2)用PreparedStatement来执行sql语句 9'1hjd3k
String sql; d
i!"IQAvK
sql = "insert into user (id,name) values (?,?)"; 5^\m`gS
PreparedStatement ps = cn.prepareStatement(sql); m"n.Dz/S
ps.setInt(1,xxx); JW=uK$s O
ps.setString(2,xxx); m7JPH7P@BM
... ya:sW5fk
ResultSet rs = ps.executeQuery(); // 查询 x_yF|]aI!
int c = ps.executeUpdate(); // 更新 aiYo8+{!#
Q~phGD3!~
3、处理执行结果 }/20%fP
查询语句,返回记录集ResultSet |VK:2p^ u
更新语句,返回数字,表示该更新影响的记录数 wTTRoeJ}
ResultSet的方法 h-7A9:
1、next(),将游标往后移动一行,如果成功返回true;否则返回false im=5{PbJ^
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 v{o? #Sk1
_ j~4+H
4、释放连接 i<mevL
cn.close(); iAK/d)bq
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection T)8p:}P!
6#E7!-u(-
可滚动、更新的记录集 u*hH}
1、创建可滚动、更新的Statement J;~E<_"Hn
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); T8U[xu.>
该Statement取得的ResultSet就是可滚动的 _
\l
HI
2、创建PreparedStatement时指定参数 0 sZwdO
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); NEMEY7De2
ResultSet.absolute(9000); `$at9
批量更新 PB+\jj
1、Statement }t\
10nQ
Statement sm = cn.createStatement(); ;Z*'D}
sm.addBatch(sql1); *<r%aeG$em
sm.addBatch(sql2); k d+l k:
... ;u,rtEMy;
sm.executeBatch() to'j2jP
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ;}D-:J-z_
2、PreparedStatement -bA!PeI
PreparedStatement ps = cn.preparedStatement(sql); GMdI0jaG#
{ Oxv+1Ub<Dv
ps.setXXX(1,xxx); dMJ!>l>2
... ZOu R"9]
ps.addBatch(); VD/&%O8n
} ds]?;l"
ps.executeBatch(); dKm`14f]@G
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 KzG_ <<
]YsR E>
事务的处理 $T),DUYO
1、关闭Connection的自动提交 Ukc'?p,*
cn.setAutoCommit(false); tq&Yek>C
2、执行一系列sql语句 WNa3^K/W{
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close pDOM:lGya
Statement sm ; A#35]V06
sm = cn.createStatement(insert into user...); MtUY?O.P2
sm.executeUpdate(); ~M*gsW$
sm.close(); j=W@P-
sm = cn.createStatement("insert into corp...); Fc'[+L--Q
sm.executeUpdate(); >jMH#TZaX
sm.close(); 2:'lZQ
3、提交 6R2uWv
cn.commit(); IY)5.E
_
4、如果发生异常,那么回滚 nLJBq)i
cn.rollback();