java 数据库基本操作 N+vsQ!Qz
1、java数据库操作基本流程 dpT?*qLM
2、几个常用的重要技巧: ";upu
可滚动、更新的记录集 xg4wtfAbS
批量更新 )Wk&c8|y
事务处理 ?weuq"*a
}%c0EY'
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 &w{z
1、取得数据库连接 "$3~):o
1)用DriverManager取数据库连接 -,ojZFyRi
例子 {rzQ[_)EC
String className,url,uid,pwd; x=N0H
className = "oracle.jdbc.driver.OracleDriver"; TpYdIt9#>
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; T#KVN{O
uid = "system"; ~ymSsoD^
pwd = "manager"; QS@eqN
Class.forName(className); 9R:?vk4
Connection cn = DriverManager.getConnection(url,uid,pwd); 8\+XtS
2)用jndi(java的命名和目录服务)方式 <.ZD.u
例子 Z^ .qX\<M
String jndi = "jdbc/db"; (rQ)0g@
Context ctx = (Context) new InitialContext().lookup("java:comp/env");
`ghNS
DataSource ds = (DataSource) ctx.lookup(jndi); !>WW(n07Ma
Connection cn = ds.getConnection(); H {uR+&<
多用于jsp中 ,nWZJ&B
2、执行sql语句 of'H]IZ
1)用Statement来执行sql语句 u}7r\MnwK,
String sql; .PCbGPbk
Statement sm = cn.createStatement(); miV 8jaV
sm.executeQuery(sql); // 执行数据查询语句(select) {5SJ0'.B2g
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 5*O]`Q7
2)用PreparedStatement来执行sql语句 Mn*5oH
String sql; aW#^@||B
sql = "insert into user (id,name) values (?,?)"; ]sqp^tQ`e
PreparedStatement ps = cn.prepareStatement(sql); qxHsmGV
ps.setInt(1,xxx); -3SRGr
ps.setString(2,xxx); C9j5Pd5q1L
... d 1 O+qS
ResultSet rs = ps.executeQuery(); // 查询 :eBp`dmn
int c = ps.executeUpdate(); // 更新 5N907XVu
%1M!4**W
3、处理执行结果 ig'4DmNC
查询语句,返回记录集ResultSet JY9hD;`6y
更新语句,返回数字,表示该更新影响的记录数 1#x@
ResultSet的方法 .VkLF6
1、next(),将游标往后移动一行,如果成功返回true;否则返回false zc1~ q
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 f.RwV+lq
85](,YYz
4、释放连接 zeuSk|O
cn.close(); h[]3#
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection lAAP V
^3nB2G.ax
可滚动、更新的记录集 6M bMAh5>
1、创建可滚动、更新的Statement OKCX>'j:S
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); [ZETyM`
该Statement取得的ResultSet就是可滚动的 'D?sRbJ=
2、创建PreparedStatement时指定参数 2'WdH1UrBc
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); )J&!>GP
ResultSet.absolute(9000); {#l@9r%
批量更新 ?Q6ZZQ~
1、Statement J|b:Zo9<f"
Statement sm = cn.createStatement(); pXe]hnY
sm.addBatch(sql1); 6K5KkEp
sm.addBatch(sql2); e(k$k>?
... WhL1OG
sm.executeBatch() (z'!'?v;
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Ec['k&*7,
2、PreparedStatement 3M{b:|3/q
PreparedStatement ps = cn.preparedStatement(sql); s`,. &
{ fQ,(,^!;
ps.setXXX(1,xxx); <$`udP@
... pl.=u0 *
ps.addBatch(); @3>nVa
} !7anJl
ps.executeBatch(); MM Nz2DEy[
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 D"n
3If%
dUpOg{I.x
事务的处理 ~{s7(^ P
1、关闭Connection的自动提交 h_h6@/1l
cn.setAutoCommit(false); 0"M0tA#
2、执行一系列sql语句 e7gWz~
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close DYCXzFAa
Statement sm ; 1H,hw
sm = cn.createStatement(insert into user...); P
C
sm.executeUpdate(); ,6a }l;lv
sm.close(); d*<