java 数据库基本操作 a}c(#ZLs
1、java数据库操作基本流程 %9NGVC
2、几个常用的重要技巧: j4}aK2[<
可滚动、更新的记录集 t7A.b~#
批量更新 I"JT3[*s
事务处理 :WCUHQ+
w-CuO4P
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ,_lwT}*w
1、取得数据库连接 1=(i{D~
1)用DriverManager取数据库连接 |$b 4{
例子 I(
y
Wct
String className,url,uid,pwd; ` ?6m0|\@
className = "oracle.jdbc.driver.OracleDriver"; L6A6|+H%E
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; v @N8v
uid = "system"; KQ9:lJKr
pwd = "manager"; t8)Fkx#8}
Class.forName(className); 3 ^su%z_%
Connection cn = DriverManager.getConnection(url,uid,pwd); f(n{7
2)用jndi(java的命名和目录服务)方式 d)o<R;F
例子 JrL/LGY
String jndi = "jdbc/db"; -GKelz?h>
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); LbYI{|_Js
DataSource ds = (DataSource) ctx.lookup(jndi); "|Q&
Connection cn = ds.getConnection(); ;LrKXp
多用于jsp中 BS|-E6E<
2、执行sql语句 dadMwe_l0
1)用Statement来执行sql语句 w pCS]2
String sql; VBCj.dw
Statement sm = cn.createStatement(); 8w*fg6,=
sm.executeQuery(sql); // 执行数据查询语句(select) (I~,&aBr
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); m#;:%.Rm
2)用PreparedStatement来执行sql语句 \AK|~:\]
String sql; "?9fL#8f*!
sql = "insert into user (id,name) values (?,?)"; $qrr]U
PreparedStatement ps = cn.prepareStatement(sql); &gEu%s^wR
ps.setInt(1,xxx); Vd1K{rH#
ps.setString(2,xxx);
y?unI~4tC
... 'FUPv61()
ResultSet rs = ps.executeQuery(); // 查询 =k/n
int c = ps.executeUpdate(); // 更新 tt[_+e\4
%mYIXsuH
3、处理执行结果 8m*\"_S{
查询语句,返回记录集ResultSet
W>Rv
更新语句,返回数字,表示该更新影响的记录数 s{:
Mu~v
ResultSet的方法 g*tLqV
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 1VZ>*Tl
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 <?J7Z|
9H)uTyuNi
4、释放连接 b{dzbmak
cn.close(); OVh/t#On
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ``E;!r="v
fVN}7PH7+
可滚动、更新的记录集 i ('EBO
1、创建可滚动、更新的Statement =4%C?(\
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); X%F9.<4
该Statement取得的ResultSet就是可滚动的 RU>vnDaC
2、创建PreparedStatement时指定参数 G[^G~U\+!
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); V[bc-m
ResultSet.absolute(9000); \S@A
/t6pa
批量更新 O#U"c5%
1、Statement )
k2NF="o
Statement sm = cn.createStatement(); x> q3w# B
sm.addBatch(sql1); ` k\1vum
sm.addBatch(sql2); `i:0dVs
... 7lj-Z~1
sm.executeBatch() 7S7!
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 aKUr":z
2、PreparedStatement |zT0g]WH
PreparedStatement ps = cn.preparedStatement(sql); i-=ff
{ y;>I'e
ps.setXXX(1,xxx); !fV6KkV
... ^/BE=$E\
ps.addBatch(); k2WO*xa*
} ~R8yj(
ps.executeBatch(); @}Z/{Z[@
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 V$_0VN'+Z
@ixX?N)V
事务的处理 #<e7 Y0
1、关闭Connection的自动提交 DvKM>P%|
cn.setAutoCommit(false); bYgYP|@
2、执行一系列sql语句 <EUSl|6
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close "PHv~_:^R
Statement sm ;
_NZHrN
sm = cn.createStatement(insert into user...); ^U?(g0<"
sm.executeUpdate(); 9M=K@a
sm.close(); WuQYEbap
sm = cn.createStatement("insert into corp...); 8{l=`y"nB
sm.executeUpdate(); .0-m=3mp2
sm.close(); yy74>K
3、提交 ? 7EVmF
cn.commit(); d&u/7rm
4、如果发生异常,那么回滚 |G@)B!>
cn.rollback();