java 数据库基本操作 q9 !)YP+w
1、java数据库操作基本流程 }wZ9#Ll
2、几个常用的重要技巧: I(!i"b9
可滚动、更新的记录集 n?'I&0>M
批量更新 1 ~fD:
事务处理 y}Ji( q~
ahQdBoj
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 IJ >qs8
1、取得数据库连接 R"%zmA@o=
1)用DriverManager取数据库连接 NH+?7rf8
例子 L|O[u^
String className,url,uid,pwd; W
u?A} fH
className = "oracle.jdbc.driver.OracleDriver"; !c+,OU[
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; EY'kIVk
uid = "system"; /Ilve
U`E
pwd = "manager"; H8@1Kt
Class.forName(className); gD`|N@W$5
Connection cn = DriverManager.getConnection(url,uid,pwd); {}>s0B
2)用jndi(java的命名和目录服务)方式 i [,9hp
例子 5Us$.p
String jndi = "jdbc/db"; _D<=Yo
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 4h% G %>j
DataSource ds = (DataSource) ctx.lookup(jndi); TKJs'%Q7F6
Connection cn = ds.getConnection(); !7)` g i
多用于jsp中 !C ]5_
2、执行sql语句 IkW8$>
1)用Statement来执行sql语句 R|4a9G
String sql; uW4)DT9[5
Statement sm = cn.createStatement(); 5,Rxc=
sm.executeQuery(sql); // 执行数据查询语句(select) NL`}rj
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 8x":7 yV&
2)用PreparedStatement来执行sql语句 D XFU~J*
String sql; ]=Im0s
sql = "insert into user (id,name) values (?,?)"; SLI(;, s
PreparedStatement ps = cn.prepareStatement(sql); /Mq9~oC
ps.setInt(1,xxx); }.`no
ps.setString(2,xxx); EyU 5r$G
... ^!a4!DGVT
ResultSet rs = ps.executeQuery(); // 查询 `p qj~s
int c = ps.executeUpdate(); // 更新 ~@Yiwp\"
(.r9bl
3、处理执行结果 R-%v??
查询语句,返回记录集ResultSet &|6 A
8,
更新语句,返回数字,表示该更新影响的记录数 haTmfh_|
ResultSet的方法 #GoZH?MAF
1、next(),将游标往后移动一行,如果成功返回true;否则返回false C=k]g
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 s0EF{2<F
OGA_3|[S
4、释放连接 .AHf]X0
cn.close(); al#BfcZW
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection =17d7#-
0<ze'FbV]
可滚动、更新的记录集 K+WbxovXU
1、创建可滚动、更新的Statement w8(8n&5
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); jg)+]r/hS
该Statement取得的ResultSet就是可滚动的 9x4%M&<Z9a
2、创建PreparedStatement时指定参数 Mk=M)d`
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); r1pj-
ResultSet.absolute(9000); >]/RlW[
批量更新 w^BF.Nu
1、Statement ML:Zm~A1U
Statement sm = cn.createStatement(); Ufw_GYxan
sm.addBatch(sql1); Z|t`}lK
sm.addBatch(sql2); D^m`&asC
... Sm7O%V8{p
sm.executeBatch() oh^/)2W
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有
ORCG(N
2、PreparedStatement 3rdrNc
PreparedStatement ps = cn.preparedStatement(sql); C0O$iWs=
{ )s-[d_g
ps.setXXX(1,xxx); Qk5pRoL_
... 'sII/sq`(
ps.addBatch(); :}B=Bk/q
} e@j&c:p(Y
ps.executeBatch(); 6VUkZKc
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ?b,4mDptE
^pc?oDPSg
事务的处理 frh!dN
1、关闭Connection的自动提交 i#pBzJ
cn.setAutoCommit(false); qpt},yn)C
2、执行一系列sql语句 T<a/GE/
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close LdH23\
Statement sm ; U))2?#
sm = cn.createStatement(insert into user...); #B$r|rqamq
sm.executeUpdate(); s!g06F
sm.close(); :abpht
sm = cn.createStatement("insert into corp...); >Tf <8r,
sm.executeUpdate(); Hoj'zY
sm.close(); +hZ{/
3、提交 ByU&fx2Z
cn.commit(); XJSI/jpa@
4、如果发生异常,那么回滚 &mPR[{
cn.rollback();