java 数据库基本操作 4 l+z
1、java数据库操作基本流程 a)+*Gf7?
2、几个常用的重要技巧: +]H!q
W:
可滚动、更新的记录集 0H'G./8
批量更新 \)MzUOZn
事务处理 Esj1Vv#
Ve"M8-{oKk
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ^\VVx:]
1、取得数据库连接 #.}&6ZP
1)用DriverManager取数据库连接 XK0lv8(
例子 ?LvxEQ-g
String className,url,uid,pwd; <1~_nt~(*
className = "oracle.jdbc.driver.OracleDriver"; [*ug:PG
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; $9Xn.,W
uid = "system"; 6k37RpgH
pwd = "manager"; Y|-&=
Class.forName(className); {ueDwnZ
Connection cn = DriverManager.getConnection(url,uid,pwd); rXGaav9
2)用jndi(java的命名和目录服务)方式 2'ws@U}lR
例子 J}@.f-W\j
String jndi = "jdbc/db"; _t X1z^
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); J6zU#
DataSource ds = (DataSource) ctx.lookup(jndi); #xq|/JWs
Connection cn = ds.getConnection(); YcSPU(
多用于jsp中 vhU
$GG8
2、执行sql语句 Q? Xqf7y
1)用Statement来执行sql语句 56Lt "Z F
String sql; a63Ud<_a7
Statement sm = cn.createStatement(); 01%0u8U
sm.executeQuery(sql); // 执行数据查询语句(select) 3Z}m5f`t
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); mI;\ UOh'
2)用PreparedStatement来执行sql语句 NeewV=[%
String sql; (I1^nrDP.
sql = "insert into user (id,name) values (?,?)"; H,!yG5yF
PreparedStatement ps = cn.prepareStatement(sql); K1-3!G
ps.setInt(1,xxx); .36]>8
ps.setString(2,xxx); Ob|tA
...
7<5=fYbr
ResultSet rs = ps.executeQuery(); // 查询 &_]bzTok
int c = ps.executeUpdate(); // 更新 -BrJ5]T>*
N;cSR\Ng
3、处理执行结果 A;;OGJ,!\
查询语句,返回记录集ResultSet }hc+ENh
更新语句,返回数字,表示该更新影响的记录数 2.a{,d
ResultSet的方法 soB_j
1、next(),将游标往后移动一行,如果成功返回true;否则返回false a{}8030S
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 BL\H@D
QA~Lm
4、释放连接 wI[J> 9Qn
cn.close(); .
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Oj7).U0;#
5*y6{7FLp
可滚动、更新的记录集 KM
oDcAjH
1、创建可滚动、更新的Statement # *7ImEN
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); y(**F8>?xE
该Statement取得的ResultSet就是可滚动的 6ZC~q=my
2、创建PreparedStatement时指定参数 \%#luk@:
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); GkdxwuRw
ResultSet.absolute(9000); :-+j,G9t
批量更新 .7Itbp6=R
1、Statement $j0<ef!
Statement sm = cn.createStatement(); 6s:
sm.addBatch(sql1); )},/=#C0
sm.addBatch(sql2); |@MGGAk
... +'9xTd
sm.executeBatch() xI5zP?
_v
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 V:8{MO(C\
2、PreparedStatement S"Ag7i
PreparedStatement ps = cn.preparedStatement(sql); n1y*`5!
{ 2cv=7!K4Uv
ps.setXXX(1,xxx); )aX#RM? N
... ~/Kqkhq+c
ps.addBatch(); *nY$YwHB
} 6?l|MU"Q.
ps.executeBatch(); ~:UAL}b{\~
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ~=Fp0l)#
<'P+2(Oi
事务的处理 Ke\FzZ]
1、关闭Connection的自动提交 U]iZ3^8VT
cn.setAutoCommit(false); ^F+7@*u
2、执行一系列sql语句 Qy'-3GB
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 0&6(y*
#Z
Statement sm ; 3hR3)(+1
sm = cn.createStatement(insert into user...); 04!akPP<
sm.executeUpdate(); +tv"j;z
sm.close(); SiT5QJe
sm = cn.createStatement("insert into corp...); J~5+=V7OV
sm.executeUpdate(); q{Gf@
sm.close(); IOH6h=
3、提交 /|[%~`?BM
cn.commit(); tfd!;` B
4、如果发生异常,那么回滚 %T~LK=m
cn.rollback();