java 数据库基本操作 ;t +p2i
1、java数据库操作基本流程 A>gZl)c
2、几个常用的重要技巧: p?$N[-W 6-
可滚动、更新的记录集 YWn""8p;P
批量更新 >!1]G"U
事务处理 s;bGg
AHs%?5YTY;
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 enPtW
1、取得数据库连接 !LH;K
1)用DriverManager取数据库连接 ^4`x:6m
例子 p'LLzc##
String className,url,uid,pwd; g
sm%4>sc
className = "oracle.jdbc.driver.OracleDriver"; R8[VD iM6E
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; /UunWZ u%
uid = "system"; &C
MBTY#u
pwd = "manager"; Kc[^Pu
Class.forName(className); ^*l
dsc
Connection cn = DriverManager.getConnection(url,uid,pwd); 0E#??gN
2)用jndi(java的命名和目录服务)方式 BaIpX<$T
例子 Kv*
1=HES
String jndi = "jdbc/db"; #6c,_!
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); SHYekX
DataSource ds = (DataSource) ctx.lookup(jndi); g"n>v
c7
Connection cn = ds.getConnection(); TFb7P/g
多用于jsp中 !7\dr )
2、执行sql语句 9QP=
1)用Statement来执行sql语句 h:bx0:O"
String sql; di_UJ~
Statement sm = cn.createStatement(); fZf>>mu@r'
sm.executeQuery(sql); // 执行数据查询语句(select) H%m^8yW1
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); X$==J St
2)用PreparedStatement来执行sql语句 a"P &
9c
String sql; Fw[1Aa#
sql = "insert into user (id,name) values (?,?)"; 6?}|@y^fb
PreparedStatement ps = cn.prepareStatement(sql); ,2!7iX
ps.setInt(1,xxx); 1.p?1"4\u
ps.setString(2,xxx); BsXF'x<U*
... P4"BX*x
ResultSet rs = ps.executeQuery(); // 查询 ij]~n
int c = ps.executeUpdate(); // 更新 pRjEuOc
;s,1/ kA
3、处理执行结果 by9UwM=gp
查询语句,返回记录集ResultSet J37vA zK%
更新语句,返回数字,表示该更新影响的记录数 pm+E)z6Yo
ResultSet的方法 w@2NXcmw
1、next(),将游标往后移动一行,如果成功返回true;否则返回false w +UBXW
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 4;~xRg;u&*
ww
%c+O/
4、释放连接 DOtz
cn.close(); :@&e~QP(
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 2A
~L&z?'V
可滚动、更新的记录集 G?F!Z"S
1、创建可滚动、更新的Statement Ke^/aGi}O
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); IrRy1][Qr
该Statement取得的ResultSet就是可滚动的 "T /$K
2、创建PreparedStatement时指定参数 y+B iaD!U
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); |b@`ykD
ResultSet.absolute(9000); tPiC?=4R
批量更新 #pRbRT9
1、Statement ~Fvz&dO
Statement sm = cn.createStatement(); H)TKk%`7
sm.addBatch(sql1); "=]'"'B:
sm.addBatch(sql2); 0KExB{ K
... =S54p(>
sm.executeBatch() 7mnO60Z8N
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 >H euf"V
2、PreparedStatement ^K`PYai
PreparedStatement ps = cn.preparedStatement(sql); L7 FFa:#
{ I@N/Y{y#
ps.setXXX(1,xxx); w@P86'< v
... -GL.8"c[
ps.addBatch(); .vmCKZ
} ^&F.T-( A
ps.executeBatch(); g[b;1$
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 &gV9h>Kc#
`Q+O#l?
事务的处理 0p3) t
1、关闭Connection的自动提交 X..M!3W
cn.setAutoCommit(false); hT=E~|O
2、执行一系列sql语句 O:V.;q2]U
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close
*W |
Statement sm ; Q.4+"JoG
sm = cn.createStatement(insert into user...); {3os9r,
sm.executeUpdate(); $!'Vn)Z7
sm.close(); 4t*VI<=<[
sm = cn.createStatement("insert into corp...); w'i+WEU>l
sm.executeUpdate(); BThrv$D}
sm.close(); ]S(nA!]
3、提交 MYJDfI
cn.commit(); hHEn
4、如果发生异常,那么回滚 \o,et9zDJ3
cn.rollback();