java 数据库基本操作 {jX
h/`
1、java数据库操作基本流程 ))"
*[
2、几个常用的重要技巧: MVW2%6
可滚动、更新的记录集 {CM%QMM
批量更新 3McBTa!
事务处理 V=pg9KR!T
li4rK<O
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 2} ,|RQETy
1、取得数据库连接 QfuKpcT&
1)用DriverManager取数据库连接 ]>NP?S
)R
例子 P#/k5]g
String className,url,uid,pwd; wz-9+VN6
className = "oracle.jdbc.driver.OracleDriver"; N:j"W,8
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 6% @@~"
uid = "system"; qNP&f8fH
pwd = "manager"; _7(>0GY
Class.forName(className); B{ wx"mK
Connection cn = DriverManager.getConnection(url,uid,pwd); ?u/Uov@rD
2)用jndi(java的命名和目录服务)方式 yIBT*,4
例子 X6jW mo8]
String jndi = "jdbc/db"; wf!?'*
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); *]Nd
I
DataSource ds = (DataSource) ctx.lookup(jndi); #/NZ0IbHk
Connection cn = ds.getConnection(); S3V3<4CB
多用于jsp中 qEC-'sl<
2、执行sql语句 kw8?::
<
1)用Statement来执行sql语句 B w1ir
String sql; F6*n,[5(
Statement sm = cn.createStatement(); M),i4a?2
sm.executeQuery(sql); // 执行数据查询语句(select) -/:N&6eRb
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); &?m|PK) I
2)用PreparedStatement来执行sql语句 3 8>?Z]V
String sql; q-%;~LF
sql = "insert into user (id,name) values (?,?)"; _&TA|Da
PreparedStatement ps = cn.prepareStatement(sql); isaDIl;L/
ps.setInt(1,xxx); 5;wA7@
ps.setString(2,xxx); =B9Ama
... xc.(-g[
ResultSet rs = ps.executeQuery(); // 查询 .CI {g2
int c = ps.executeUpdate(); // 更新 nUi
4!|r
b4GD}kR
3、处理执行结果 g9>
0N#<
查询语句,返回记录集ResultSet XUT,)dL
更新语句,返回数字,表示该更新影响的记录数 t|Cp<k]B
ResultSet的方法
3n;UXYJ%
1、next(),将游标往后移动一行,如果成功返回true;否则返回false )UA$."~O
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 J0BA@jH5
iR;Sd >)
4、释放连接 T
`x:80
cn.close(); {-*+G]
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection }eUeADbC
}gQ FWT
可滚动、更新的记录集 X~ n=U4s}O
1、创建可滚动、更新的Statement +}H2|vP
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); U)~?/s{v
该Statement取得的ResultSet就是可滚动的 ]-d:wEj
2、创建PreparedStatement时指定参数 =e'b*KTL,
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); XXsN)2
ResultSet.absolute(9000); EoM}Co
批量更新 G8%Q$
1、Statement %Q:i6 ~
Statement sm = cn.createStatement(); '\qd{mM\r
sm.addBatch(sql1); fZU#%b6G
sm.addBatch(sql2); WZq0$:I;R
... Rg3 Lo ?
sm.executeBatch() .v<c_~y
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 _"
0VM>
2、PreparedStatement 1vlRzkd
PreparedStatement ps = cn.preparedStatement(sql); b0
))->&2
{ E)liuu!qI
ps.setXXX(1,xxx); RD_IGV
... 7Io]2)V
ps.addBatch(); MxMrLiqU6l
} ad^7t<a}<
ps.executeBatch(); 8F|8zX&
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 0{bGVLp
k,o|"9H
事务的处理 6x%uWZa'
1、关闭Connection的自动提交 >SO !{
cn.setAutoCommit(false); G0p|44_~t
2、执行一系列sql语句 T_ifDQX;
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close k$`~,LJ p
Statement sm ; o~7~S
sm = cn.createStatement(insert into user...); l$KC\$?%*
sm.executeUpdate(); U
X)k;h
sm.close(); rZ<n0w
sm = cn.createStatement("insert into corp...); 90OSe{
sm.executeUpdate(); s)Bl1\Q
sm.close(); *:r@-=M3=
3、提交 wYnsd7@I
cn.commit(); r )8[LN-
4、如果发生异常,那么回滚 JjarMJr|D
cn.rollback();