java 数据库基本操作 qBK68B)
1、java数据库操作基本流程 mC\<fo-u
2、几个常用的重要技巧: QQ{*j7i)
可滚动、更新的记录集 {g1R?W\LZ
批量更新 :(/1,]bF
事务处理 EXH,+3fQp
AB+lM;_>
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 >$CNR*}@
1、取得数据库连接 lH/"47
1)用DriverManager取数据库连接 [N%InsA9k
例子 ?G~rYETvw
String className,url,uid,pwd; bf1$:09
className = "oracle.jdbc.driver.OracleDriver"; 0LzS #J+
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; CKFr9bT{
uid = "system"; Iix:Y}
pwd = "manager"; |Thm5,ao
Class.forName(className); . uGne
Connection cn = DriverManager.getConnection(url,uid,pwd); #hs&)6Sf
2)用jndi(java的命名和目录服务)方式 Q hRj*,
例子 Pj g#
String jndi = "jdbc/db"; ('j'>"1H
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); QqW N7y_9
DataSource ds = (DataSource) ctx.lookup(jndi); U1/ww-!Z
Connection cn = ds.getConnection(); CK4#ZOiaa
多用于jsp中 ]g oVQ'Y
2、执行sql语句 8p}z~\J{a:
1)用Statement来执行sql语句 =s'H o
String sql; {|<r7K1<
Statement sm = cn.createStatement(); 7.2 !g}E
sm.executeQuery(sql); // 执行数据查询语句(select) "7Kw]8mRR
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); &"T7KXx
2)用PreparedStatement来执行sql语句 \SwqBw
String sql; B>d49(jy
sql = "insert into user (id,name) values (?,?)"; o>d0R
w4h
PreparedStatement ps = cn.prepareStatement(sql); ?/hS1yD;
ps.setInt(1,xxx); x#5[i;-c
ps.setString(2,xxx); n[y^S3}%;
... S{]3e-?
ResultSet rs = ps.executeQuery(); // 查询 H>]*<2(=-
int c = ps.executeUpdate(); // 更新 xN>\t& c
?;5/"/i
3、处理执行结果 Nknd8 >Hy+
查询语句,返回记录集ResultSet ;O,&MR{;|n
更新语句,返回数字,表示该更新影响的记录数 =)i^E9
ResultSet的方法 |FlB#
1、next(),将游标往后移动一行,如果成功返回true;否则返回false RhF<{U.
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 mKV31wvK}
`O.pT{Lf
4、释放连接 .),9a,
cn.close(); F &5iA\
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection j1+I_
XS^du{ai
可滚动、更新的记录集 \7xc*v [
1、创建可滚动、更新的Statement yEJ3O^(F
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); [rAi9LSO"
该Statement取得的ResultSet就是可滚动的 XknNb{. r
2、创建PreparedStatement时指定参数 wkPomTO
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); eDNY|}$}v
ResultSet.absolute(9000); HJ"sK5Q
批量更新 Iw#[K
1、Statement <bhJ >
Statement sm = cn.createStatement(); >nK (
sm.addBatch(sql1); g?}h*~<b
sm.addBatch(sql2); TBF{@{.d
... ,1<6=vL
sm.executeBatch() "OkZ
[E)
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ix?Z:pIS0
2、PreparedStatement rXTdhw?+
PreparedStatement ps = cn.preparedStatement(sql); UaQW<6+
{ z1tCSt}7f
ps.setXXX(1,xxx); ^n4aoj
... l_+q a6C*
ps.addBatch(); xZV|QVY;
} *(i%\
ps.executeBatch(); r<P? F
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 &js$qgY
*(/b{!~
事务的处理 4{6,Sx
1、关闭Connection的自动提交 YLSDJ$K6
cn.setAutoCommit(false); /9P7;1?
2、执行一系列sql语句 XIM?$p^
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close YxU->Wi]G
Statement sm ; \sW>Y#9]
sm = cn.createStatement(insert into user...); !@ AnwV]
sm.executeUpdate(); F<2gM#jLB
sm.close(); #q&Nd2y
sm = cn.createStatement("insert into corp...); k#mL4$]V5N
sm.executeUpdate(); 56NDU>j$
sm.close(); k4:=y9`R}$
3、提交 bsI?=lO
cn.commit(); LT,zk)5
4、如果发生异常,那么回滚 { M[iYFg=
cn.rollback();