java 数据库基本操作 l,9rd[
1、java数据库操作基本流程
M6ZXq6J
2、几个常用的重要技巧: n{\d
可滚动、更新的记录集 0nvT}[\H*
批量更新 '0^lMQMg
事务处理 Z`f?7/"B
/U,(u9bq
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 od$$g(
1、取得数据库连接 F >H\F@Wl
1)用DriverManager取数据库连接 Wv%F^(R7
例子 DQ}&J
String className,url,uid,pwd; o=RxQk1N
className = "oracle.jdbc.driver.OracleDriver"; TV|Z$,6l
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; r:PYAb=g
uid = "system"; &1Y7Ne
pwd = "manager"; uJ=d!Kn
Class.forName(className); WZn"I&Z
Connection cn = DriverManager.getConnection(url,uid,pwd); KSJ+3_7]k
2)用jndi(java的命名和目录服务)方式 E@%1HO_
例子 L{GlDoFk
String jndi = "jdbc/db"; Z<W f/
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ;s #I b_
DataSource ds = (DataSource) ctx.lookup(jndi); i1X!G|Awfv
Connection cn = ds.getConnection(); L8f_^
*,
多用于jsp中 D-D8La?0p
2、执行sql语句 ]yQqx*
1)用Statement来执行sql语句 tS Y4'
String sql; \vx'+}
Statement sm = cn.createStatement(); P^ht$)Y
sm.executeQuery(sql); // 执行数据查询语句(select) I]HLWF
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 7Le-f
2)用PreparedStatement来执行sql语句 P8#_E{f
String sql; \[|X^8j
sql = "insert into user (id,name) values (?,?)"; %__ @G_M
PreparedStatement ps = cn.prepareStatement(sql); x?]fHin_
ps.setInt(1,xxx); ul
b0B"
ps.setString(2,xxx); mML B?I
... @=}NMoNH
ResultSet rs = ps.executeQuery(); // 查询 w#_7,*6]
int c = ps.executeUpdate(); // 更新 |z8_]o+|r1
C8do8$
3、处理执行结果 eY%Ep=J
查询语句,返回记录集ResultSet JvEW0-B^l,
更新语句,返回数字,表示该更新影响的记录数 3UF^Ff<wo
ResultSet的方法 EuA352x
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ?9 W2ax-4
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 eoFG$X/PO
dNCd-ep
4、释放连接 z:N?T0b(
cn.close(); aO}p"-'
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection mI\[L2x
>l=jJTJ;q
可滚动、更新的记录集 rLY I\
1、创建可滚动、更新的Statement I.Xbowl
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Hq~SRc~
该Statement取得的ResultSet就是可滚动的 ?r*}1WsH
2、创建PreparedStatement时指定参数 v9!]/]U^
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); *>!-t
ResultSet.absolute(9000); 1H\5E~X
批量更新 Ted tmX$
1、Statement APJFy@l}
Statement sm = cn.createStatement(); *3h_'3yo@
sm.addBatch(sql1); VZe'6?#
sm.addBatch(sql2); DZ $O%
... i+Mg[x$.
sm.executeBatch() |MN2v[y
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 asE.!g?
2、PreparedStatement
z).&0K
PreparedStatement ps = cn.preparedStatement(sql); fh66Gn,
{ 4#t=%}
ps.setXXX(1,xxx); AFeFH.G6Jr
... o.Bbb=*rZ
ps.addBatch(); D(&Zq7]n
} D><^ 7nr%
ps.executeBatch(); rWqr-"0S.
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Z#l6BXK
.Iz
JJp
事务的处理 (LMT '
1、关闭Connection的自动提交 4N1)+W8k*
cn.setAutoCommit(false);
;5
2、执行一系列sql语句 :T>OJ"p
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close i7rk%q
Statement sm ; n<@C'\j@
sm = cn.createStatement(insert into user...); #Uep|A
sm.executeUpdate(); 1(_[awBx
sm.close(); Su[(IMw
sm = cn.createStatement("insert into corp...); E$A=*-u
sm.executeUpdate(); @7;}6,)
sm.close(); Q'hs,t1<
3、提交
|eFaOL|
cn.commit(); ~$rSy|19
4、如果发生异常,那么回滚 mVN\
cn.rollback();