java 数据库基本操作 bV#U&)|
1、java数据库操作基本流程 @JWoF^U
2、几个常用的重要技巧: aNpeePF)z
可滚动、更新的记录集 [*j
C
批量更新 yuvt<kz
事务处理 ;u'mSJI'
tZ]|3wp
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 *JX)q
1、取得数据库连接 lMX 2O2 o
1)用DriverManager取数据库连接 {Tp0#fi
例子 p0xd
c3
String className,url,uid,pwd; tj ,*-).4%
className = "oracle.jdbc.driver.OracleDriver"; Eg"DiI)7
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 6ZBg/_m
uid = "system"; ,R1`/aRy
pwd = "manager"; fa#]G^f
Class.forName(className); yWACIaj
Connection cn = DriverManager.getConnection(url,uid,pwd); H V`{YuP
2)用jndi(java的命名和目录服务)方式 gOI#$-L
例子 *=1;HN3
String jndi = "jdbc/db"; `CI9~h@k
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); \guZc}V]:\
DataSource ds = (DataSource) ctx.lookup(jndi); .[hQ#3)W
Connection cn = ds.getConnection(); %:n1S]Vr
多用于jsp中 mN^92@eebC
2、执行sql语句 {6v|d{V+e
1)用Statement来执行sql语句 /vl]Oa&U
String sql; {R7>-Y[4)2
Statement sm = cn.createStatement(); nu] k<^I5|
sm.executeQuery(sql); // 执行数据查询语句(select) /(w:XTO<
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Z1FO.[FV
2)用PreparedStatement来执行sql语句 \`#;J?Y|`F
String sql; PXcpROg56
sql = "insert into user (id,name) values (?,?)"; oW-Tw@D
PreparedStatement ps = cn.prepareStatement(sql); Q/6T?{\U7
ps.setInt(1,xxx); U&PAs
e
ps.setString(2,xxx); C+Wb_
... "aN<3b
ResultSet rs = ps.executeQuery(); // 查询 GdavCwJ
int c = ps.executeUpdate(); // 更新 aW7{T6.,
)^uLZMNaI
3、处理执行结果 $jb 0/
查询语句,返回记录集ResultSet #D3e\(
更新语句,返回数字,表示该更新影响的记录数 Hw5\~!FX
ResultSet的方法 e0HG"z4
1、next(),将游标往后移动一行,如果成功返回true;否则返回false PKR0y%Ar
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 "_ b
Sy
v#.FK:u}
4、释放连接 *$x/(!UE
cn.close(); BbZ-dXC<
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection D>,]EE-
!Y-MUZ$f
可滚动、更新的记录集 kwdmw_
1、创建可滚动、更新的Statement 5+GW%U/
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); h)q:nlKUW
该Statement取得的ResultSet就是可滚动的 PG9won5_
2、创建PreparedStatement时指定参数 $Trkow%F]
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); =1lKcA[z
ResultSet.absolute(9000); J={$q1@lq
批量更新 -9/YS
1、Statement -Q;5A;sr2
Statement sm = cn.createStatement(); 6rL'hB!!]*
sm.addBatch(sql1); N~ljU;wo-9
sm.addBatch(sql2); Qp<?[C}'W
... )_b#c+
sm.executeBatch() yw5MlZ4P=
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 4hztYOhJ{
2、PreparedStatement Hjli)*ev
PreparedStatement ps = cn.preparedStatement(sql); M|FwYF^
{ +&tY&dQQB
ps.setXXX(1,xxx); K;G1cFFyG
... f3U#|(%(*
ps.addBatch(); ;C-5R U
V
} bslv_OxJ
ps.executeBatch(); !,Wd$UK
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 7|T<dfQk
%96JH
YcX
事务的处理 'g#Ml`cm
1、关闭Connection的自动提交 -:m;ePK
cn.setAutoCommit(false); iwCnW7:
2、执行一系列sql语句 H|T:_*5
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close dW<.
Statement sm ; nG$*[7<0u
sm = cn.createStatement(insert into user...); a2UER1Yp"
sm.executeUpdate(); Mq42^m:qe
sm.close(); VZF/2d84&w
sm = cn.createStatement("insert into corp...); JrseU6N
sm.executeUpdate(); }_0?S0<#
sm.close(); 9M~EH?>+[
3、提交 .%3bXK+F
cn.commit(); mT5d[lz
4、如果发生异常,那么回滚 I1kx3CwJ{P
cn.rollback();