java 数据库基本操作 uXI_M)
1、java数据库操作基本流程 &J55P]7w
2、几个常用的重要技巧: P::TO-C
可滚动、更新的记录集 !zuxz
批量更新 K)-U1JE7
事务处理 ln$&``L
/d0K7F
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 M8INk,si
1、取得数据库连接 \[BK1JP
1)用DriverManager取数据库连接 w<C#Bka
例子 ~u)}ScTp
String className,url,uid,pwd; /+8JCp
className = "oracle.jdbc.driver.OracleDriver"; 0n@rLF
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; w ihH?~]
uid = "system"; .9,zL=)Ba
pwd = "manager"; 6$fHtJD:
Class.forName(className); m*ISa(#(,
Connection cn = DriverManager.getConnection(url,uid,pwd); ]P#XVDn+;
2)用jndi(java的命名和目录服务)方式 H70LhN
例子 8j Mk)-
String jndi = "jdbc/db"; H]Cy=Zi"
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); U3 */v4/
DataSource ds = (DataSource) ctx.lookup(jndi); nS/)P4z
Connection cn = ds.getConnection(); d1T,eJ}
多用于jsp中 xHoKo
2、执行sql语句 W [Of|?
1)用Statement来执行sql语句 /rg*p
String sql; %F\?R[^5
Statement sm = cn.createStatement(); zBo1P(kek
sm.executeQuery(sql); // 执行数据查询语句(select) f_[<L
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); q:l>O5
2)用PreparedStatement来执行sql语句 L/wD7/ODr
String sql; e@c0WlWa
sql = "insert into user (id,name) values (?,?)"; \x)n>{3C
PreparedStatement ps = cn.prepareStatement(sql); :Mb%A
ps.setInt(1,xxx); M>DaQ`b
ps.setString(2,xxx); kz{/(t
... "Weg7mc#
ResultSet rs = ps.executeQuery(); // 查询 +hvO^?4j
int c = ps.executeUpdate(); // 更新 ^9^WuSq
&@%W29:
3、处理执行结果 UH]l9Aq$P
查询语句,返回记录集ResultSet TS /.`.gT
更新语句,返回数字,表示该更新影响的记录数 P6!jRC"52'
ResultSet的方法 X'%E\/~u
1、next(),将游标往后移动一行,如果成功返回true;否则返回false M9EfU
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Lk~ho?^`
8*8Zc/{
4、释放连接 pF&(7u
cn.close(); pcau}5 .
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection !g Z67
thV>j9'
可滚动、更新的记录集 RMX:9aQ3F
1、创建可滚动、更新的Statement Sczc5FG
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); UQ'\7OS
该Statement取得的ResultSet就是可滚动的 #~SP)Ukp
2、创建PreparedStatement时指定参数 1=#q5dZ]
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); /3;4#:Kkw
ResultSet.absolute(9000); 7.C;NT
批量更新 *4_jA](
1、Statement !xP8#|1
Statement sm = cn.createStatement(); 5Ycco,x
sm.addBatch(sql1); a-l;vDs
sm.addBatch(sql2); $"0M U
... HOw-]JSP2
sm.executeBatch() m0LTx\w!
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Nndddk`
2、PreparedStatement j*F`"df
PreparedStatement ps = cn.preparedStatement(sql); @.G[s)x
{ ~7Ts_:E-
ps.setXXX(1,xxx); f>aEkh6u9
... jZh';M8"
ps.addBatch(); P/xKnm~
} R16'?,
ps.executeBatch(); XpmS{nb
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 bA=
|_Wt
(:._"jp]
事务的处理
0dhF&*h|L
1、关闭Connection的自动提交 n3}!p'-CC
cn.setAutoCommit(false); Of{/t1o?
2、执行一系列sql语句 KC(xb5x
Y
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close NLS%S q
Statement sm ; B+[A]dgS
sm = cn.createStatement(insert into user...); O<96/a'
sm.executeUpdate(); GKvN*
SU=
sm.close(); qY~`8
x
sm = cn.createStatement("insert into corp...); =0^Ruh
sm.executeUpdate(); HFwN
sm.close(); H2Z1TIh
3、提交 ]?3un!o3o
cn.commit(); zXv3:uRp.
4、如果发生异常,那么回滚 e_s&L,ze
cn.rollback();