java 数据库基本操作 0{o 8-#
1、java数据库操作基本流程 #3?"#),q
2、几个常用的重要技巧: Ue,eEer
可滚动、更新的记录集 23p.g5hJi
批量更新 e*(
_Cvxp
事务处理 =8p[ (<F=
"Ya;&F.'
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 F/A)2 H_
1、取得数据库连接 CnY dj~
1)用DriverManager取数据库连接 ?H!&4o
例子 U'5p;j)_
String className,url,uid,pwd; lu.xv6+
className = "oracle.jdbc.driver.OracleDriver"; F3Vvqt*2
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 1ATH$x
uid = "system"; DX3jE p2
pwd = "manager"; l<sWM$ez
Class.forName(className); 2e ~RM2PQ
Connection cn = DriverManager.getConnection(url,uid,pwd); HQ4WunH2Y
2)用jndi(java的命名和目录服务)方式 AC fhy[,
例子 B1i'Mzm-4
String jndi = "jdbc/db"; \[+':o`LH
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 436SIh
DataSource ds = (DataSource) ctx.lookup(jndi); )F'hn+(B|G
Connection cn = ds.getConnection(); ahM?;p
多用于jsp中 c-@EHv
2、执行sql语句 yFFNzw{
1)用Statement来执行sql语句 95D(0qv
String sql; lu1T+@t
Statement sm = cn.createStatement(); d]=>U^K
sm.executeQuery(sql); // 执行数据查询语句(select) hiR+cPSF
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); T~}g{q,tR
2)用PreparedStatement来执行sql语句 B]7QOf"
String sql; &\/}.rF
sql = "insert into user (id,name) values (?,?)"; rHjR 4q
PreparedStatement ps = cn.prepareStatement(sql); T z+Y_
ps.setInt(1,xxx); MI8c>5?
ps.setString(2,xxx); ;%u)~3B$JK
... dwzk+@]8
ResultSet rs = ps.executeQuery(); // 查询 F
'HYWH0?
int c = ps.executeUpdate(); // 更新 : NH'>'
^'sOWIzeiY
3、处理执行结果 _1$+S0G;
查询语句,返回记录集ResultSet | 8n,|%e
更新语句,返回数字,表示该更新影响的记录数 yAel4b/}
ResultSet的方法 0b,{4DOD
1、next(),将游标往后移动一行,如果成功返回true;否则返回false :KRe==/
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 63i&e/pv
dUceZmAl
4、释放连接 Gh'{O/F4*
cn.close(); :J5CmU$
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection uk.x1*0x
i2Gh!5]f
可滚动、更新的记录集 ,?GAFgK:
1、创建可滚动、更新的Statement #:
,X^"w3
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); R ta_\Aj!
该Statement取得的ResultSet就是可滚动的 ! -gOqo
2、创建PreparedStatement时指定参数 0R,Y[).U
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); sD<8-n
ResultSet.absolute(9000); n6IN I~,
批量更新 jLul:*
L
1、Statement u/?;J1z:
Statement sm = cn.createStatement(); ~BI! l
sm.addBatch(sql1); <*{(>
sm.addBatch(sql2); -f(<2i
... gBd~:ZUa
sm.executeBatch() `jDmbD
+=
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 jB d9
$`
2、PreparedStatement (]<G)+*
PreparedStatement ps = cn.preparedStatement(sql); !P _'n
{ n] n3/wpO
ps.setXXX(1,xxx); $4TawFf"nc
... 2 BwpxV8
ps.addBatch(); X@B,w_b
} @ j4~`~8
ps.executeBatch(); !r0 z3^*N
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 F8Z6Ss|v3
TUd=qnu
事务的处理 S#7.y~e\
1、关闭Connection的自动提交 =G<S!qW
cn.setAutoCommit(false); %5bN@XD
2、执行一系列sql语句 HmEU;UbO-
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close &T-udgR9
Statement sm ; m=IA/HOR^
sm = cn.createStatement(insert into user...); \RTX fe-`
sm.executeUpdate(); 1FC1*7A[
sm.close(); 9hs7B!3pc>
sm = cn.createStatement("insert into corp...); ch}(v'xv(
sm.executeUpdate(); nr{}yQu
sm.close(); gC S%J40r
3、提交 F(:]lM|
cn.commit(); rw dj
4、如果发生异常,那么回滚 }Rq-IRa'
cn.rollback();