java 数据库基本操作 'jA>P\@8
1、java数据库操作基本流程 De^Uc
2、几个常用的重要技巧: '?O_(%3F0
可滚动、更新的记录集 D3(rD]c0{
批量更新 'wT !X[jF
事务处理 EFdo-.Ax
CY</v,\:#
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ,~nrNkhp
1、取得数据库连接 vhE^jS<Tg
1)用DriverManager取数据库连接 M$$Lsb [
例子 (CR]96n
String className,url,uid,pwd; CwdeW.A"j
className = "oracle.jdbc.driver.OracleDriver"; h#~\-j9>
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; E(p#Je|@[
uid = "system"; 0@LC8Bz+'
pwd = "manager"; e jh0Wfl
Class.forName(className); X"EZpJ'W
Connection cn = DriverManager.getConnection(url,uid,pwd); IY40d^x
2)用jndi(java的命名和目录服务)方式 q445$ndCT
例子 Z!foD^&R
String jndi = "jdbc/db"; -PiakX
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Q`)iy/1M
DataSource ds = (DataSource) ctx.lookup(jndi); 8k_cC$*Ng
Connection cn = ds.getConnection(); p6AF16*f0
多用于jsp中 i}=n6
2、执行sql语句 7wz9x8 \t
1)用Statement来执行sql语句 S3N+9*iK
String sql; E]c0+rh~
Statement sm = cn.createStatement(); }l<:^lX
sm.executeQuery(sql); // 执行数据查询语句(select) FByA4VxB
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close();
\<u
2)用PreparedStatement来执行sql语句 +cwuj
String sql; K:L_y1!T
sql = "insert into user (id,name) values (?,?)"; 5MHcgzyp
PreparedStatement ps = cn.prepareStatement(sql); c1sVdM}|
ps.setInt(1,xxx); G/N 1[)
ps.setString(2,xxx); E2i'lO\P
... ]S+KH
\2
ResultSet rs = ps.executeQuery(); // 查询 Y_=
]w1
int c = ps.executeUpdate(); // 更新 5#U=x ,7e
k{C03=xk
3、处理执行结果 1a79]-j
查询语句,返回记录集ResultSet Y{I,ipU.
更新语句,返回数字,表示该更新影响的记录数 n`.JI(|
ResultSet的方法 e5$S2o~JF
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 0Z1';A3
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Id^)WEK4
pg.BOz\'q
4、释放连接 @bF4'M
cn.close(); -LU%z'
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection bc]SY =
fJD+GvV$x
可滚动、更新的记录集 C+%6N@
1、创建可滚动、更新的Statement PrhGp
_5
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); _^@ >I8ix
该Statement取得的ResultSet就是可滚动的 b_w(F_0
2、创建PreparedStatement时指定参数 LhCwZ1
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); !X4m6gRaP
ResultSet.absolute(9000); CLgfNrW~
批量更新 uN@El1ouY
1、Statement ?+G
/5,e
Statement sm = cn.createStatement(); @iBaJ"*,
sm.addBatch(sql1); 2*5pjd{Kt
sm.addBatch(sql2); ^i!I0Q2yd
... vw6DHN)k
sm.executeBatch() !,9;AMO
-
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ")Qhg-l
2、PreparedStatement ;5tQV%V^Q
PreparedStatement ps = cn.preparedStatement(sql); 61Wh %8-
{ H(tT8Q5i
ps.setXXX(1,xxx); x4XCR,-
... dLbSvK<(I
ps.addBatch(); KnC:hus
} F$@(0c
ps.executeBatch(); _c>8y
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 4SJb\R)XK
V`m9+<.1 b
事务的处理 }v6@yU
1、关闭Connection的自动提交 nLY(%):(P
cn.setAutoCommit(false); zALtG<_t
2、执行一系列sql语句 x7!gmbMfK'
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ."Q}2
Statement sm ; 6,~]2H'zq
sm = cn.createStatement(insert into user...); y' RQ_Gi
sm.executeUpdate(); >';UF;\5]Q
sm.close(); 9`tSg!YOh
sm = cn.createStatement("insert into corp...); +1nzyD_E
sm.executeUpdate(); W
H%EC$
sm.close(); >e!Y 63`
3、提交 e=`=7H4P
cn.commit(); IL{tm0$r
4、如果发生异常,那么回滚 !3)WW)"!r
cn.rollback();