java 数据库基本操作 Jb-wvNJu
1、java数据库操作基本流程 =] 5;=>(
2、几个常用的重要技巧: GxZQ{
\
可滚动、更新的记录集 *vhm
批量更新 tL+8nTL
事务处理 zs"AYxr
pOI+
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 `Ik}Xw
1、取得数据库连接 73~Mq7~8
1)用DriverManager取数据库连接 |->y'V
例子 UKK}$B
String className,url,uid,pwd; M{kPEl&Z
className = "oracle.jdbc.driver.OracleDriver"; 6sy%KO*A
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; F'CUkVC0~P
uid = "system"; >2syF{`j
pwd = "manager"; GIVs)~/Eq
Class.forName(className); 8
(^2
Connection cn = DriverManager.getConnection(url,uid,pwd); ga^<_;5<
2)用jndi(java的命名和目录服务)方式 e+R.0E
例子 .%wEuqW=0
String jndi = "jdbc/db"; )Qxv9:X
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); p>eD{#2
DataSource ds = (DataSource) ctx.lookup(jndi); xYu~}kMu
Connection cn = ds.getConnection(); @?]-5 ~3;
多用于jsp中 \S7OC
2、执行sql语句 %yw*!A1
1)用Statement来执行sql语句 Sw1]]-Es
String sql; N~>?w#?J
Statement sm = cn.createStatement(); G0s:Dum
sm.executeQuery(sql); // 执行数据查询语句(select) A}y1v;FB
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); c0G/irK
2)用PreparedStatement来执行sql语句 deTbvl
String sql; RO.(k!J .
sql = "insert into user (id,name) values (?,?)"; vWkKNB
PreparedStatement ps = cn.prepareStatement(sql); "(efd~.]
ps.setInt(1,xxx); x#8=drh.:C
ps.setString(2,xxx); 4\ OELU
... Ok`U*j
ResultSet rs = ps.executeQuery(); // 查询 )vU{JY;
int c = ps.executeUpdate(); // 更新 Ic=V:
H+5]3>O-$
3、处理执行结果 aY:(0en]&
查询语句,返回记录集ResultSet f,L
更新语句,返回数字,表示该更新影响的记录数 +~fu-%,k
ResultSet的方法 M.8!BB7\8e
1、next(),将游标往后移动一行,如果成功返回true;否则返回false w|nVK9.
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 EhFhL4Xdn
l.)N
4、释放连接 ~v54$#CB
cn.close(); iz^wBQ
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection R-Fi`#PG2
*>'R
R<
可滚动、更新的记录集 ABHZ)OM
1、创建可滚动、更新的Statement Lv^ j
l
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); \7j)^
该Statement取得的ResultSet就是可滚动的 kxn;;
2、创建PreparedStatement时指定参数 *i?qOv/=>
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ?*s!&-KI
ResultSet.absolute(9000); _@OYC<
批量更新 yX~[yH+Pn
1、Statement m~U{ V9;*
Statement sm = cn.createStatement(); F>b6fUtR
sm.addBatch(sql1); Uqpvj90sw
sm.addBatch(sql2); 0&nF Vsz
... ^n2w6U0
sm.executeBatch() R$@.{d&:w
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 |Gf{ }
2、PreparedStatement {f&ga
PreparedStatement ps = cn.preparedStatement(sql); _uu:)%
{ wwAT@=X*}
ps.setXXX(1,xxx); iE Oyc59
... B7 PmG
f)b
ps.addBatch(); .-|O "H$
} 5?fk;Q9+\
ps.executeBatch(); >@L
HJ61C
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 a2rv4d=
=0)^![y]v
事务的处理 xqtjtH9X
1、关闭Connection的自动提交 XGoy#h
cn.setAutoCommit(false); zc1Zuco|
R
2、执行一系列sql语句 L,D>E
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close /r%+hS
Statement sm ; $F-XXBp
sm = cn.createStatement(insert into user...); `?@7 KEl>
sm.executeUpdate(); \;6F-0
sm.close(); Na6z,TW
sm = cn.createStatement("insert into corp...);
YiCDV(prT
sm.executeUpdate(); $ B9=v
sm.close(); =@w:
3、提交 0@Ijk(|
cn.commit(); @
tIB'|O
4、如果发生异常,那么回滚 "XY?v8*c
cn.rollback();