java 数据库基本操作 o_N02l4J)
1、java数据库操作基本流程 ?hu 9c
2、几个常用的重要技巧: gPi_+-@
可滚动、更新的记录集 _#F'rl6'
批量更新 #"M Pe4
事务处理 W%W.
+f
e](=)h|
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 R`&ioRWj
1、取得数据库连接 4dK@UN\
1)用DriverManager取数据库连接 F1=+<]!
例子 >D;hT*3
String className,url,uid,pwd; ;hvXFU
className = "oracle.jdbc.driver.OracleDriver"; M Sj0D2H
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; @ih}x
uid = "system"; xVyUUzXs
pwd = "manager"; %ze1ZWO{
Class.forName(className); D+3Y.r9
Connection cn = DriverManager.getConnection(url,uid,pwd); j5O*H_D
2)用jndi(java的命名和目录服务)方式 ;Z_C3/b
例子 -DnK)u\@
String jndi = "jdbc/db"; h<.[U
$,
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); <.B s`P
DataSource ds = (DataSource) ctx.lookup(jndi); M::iU_
Connection cn = ds.getConnection(); ]EnaZWyO]
多用于jsp中 5!zvoX9
2、执行sql语句 dE]"^O#Mc
1)用Statement来执行sql语句 G~L?q~b
String sql; GvOAs-$
Statement sm = cn.createStatement(); 4g9b[y~U
sm.executeQuery(sql); // 执行数据查询语句(select) jZ!JXmVV
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ,9qB}HG
2)用PreparedStatement来执行sql语句 [BBKj)IK
String sql; '[8b0\
sql = "insert into user (id,name) values (?,?)"; 0AKwZ'
&H
PreparedStatement ps = cn.prepareStatement(sql); Vcq?>mH&T
ps.setInt(1,xxx); He!!oKK>
ps.setString(2,xxx); d6EY'*0
... %},G(>
ResultSet rs = ps.executeQuery(); // 查询 ef;L|b%pp
int c = ps.executeUpdate(); // 更新 rb'Gve W[
P{!:pxu[
3、处理执行结果 R
TUNha^<T
查询语句,返回记录集ResultSet <WJ0St
更新语句,返回数字,表示该更新影响的记录数 f](uc(8Z
ResultSet的方法 ue"?S6
1、next(),将游标往后移动一行,如果成功返回true;否则返回false U]0)$OH5e
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 "D(8]EG=
AsLjU#jn
4、释放连接 `;CU[Ps?]
cn.close(); [?@wCY4=
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection \_AEuz3
F
('q vYQ
可滚动、更新的记录集 }@%ahRGx%9
1、创建可滚动、更新的Statement 6QXQ<ah"
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); y32++b!
该Statement取得的ResultSet就是可滚动的 -QPWi2:k
2、创建PreparedStatement时指定参数 m2CWQ[u
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 'Q>z**
ResultSet.absolute(9000); i: M*L< +
批量更新 0"psKf'
1、Statement RIEv*2_O
Statement sm = cn.createStatement(); uQ]]]Z(H'
sm.addBatch(sql1); #S%Y;ilq
sm.addBatch(sql2); asN
}
... /cC6qhkp%
sm.executeBatch() #2R%H.*t
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ;c-
]bhBB
2、PreparedStatement iEVA[xy=D
PreparedStatement ps = cn.preparedStatement(sql); (F[/~~
{ )_^WpyzF1
ps.setXXX(1,xxx); 3U"')
... cYM~IA
ps.addBatch(); Lv5X 'yM
} TDFO9%2c
ps.executeBatch(); 3zTE4pHzu+
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 EKeh>3;?
=ym
事务的处理 Y3$PQwn
.P
1、关闭Connection的自动提交 /witDu7
cn.setAutoCommit(false); rW~?0
2、执行一系列sql语句 *V6QBe
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close
}d~wDg<#
Statement sm ; e(w/m(!Wny
sm = cn.createStatement(insert into user...); ]LBvYjMY
sm.executeUpdate(); {LT4u]#
sm.close(); ]bN&5.|
sm = cn.createStatement("insert into corp...); ri<'-w i
sm.executeUpdate(); }-{ b$6]
sm.close(); <F)w=_%&
3、提交 2#b<d?"
cn.commit(); BLwfm+ m"
4、如果发生异常,那么回滚 jj3Pf>D+k
cn.rollback();