java 数据库基本操作 gubw&W
1、java数据库操作基本流程 I+W:}}"j
2、几个常用的重要技巧: k|`Qk!tr
可滚动、更新的记录集 eL88lV]I
批量更新 2B b,ZC*
事务处理 Hq#q4Y
]DjnzClx
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Scfe6+\EW
1、取得数据库连接 ~-
eB
1)用DriverManager取数据库连接 5Zn: $?7
例子 m{f+!
String className,url,uid,pwd; qyzH*#d=Cf
className = "oracle.jdbc.driver.OracleDriver"; ko~D;M:
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ujS C
uid = "system"; w_#C8}2
pwd = "manager"; ){*9$486
Class.forName(className); epgAfx-_OH
Connection cn = DriverManager.getConnection(url,uid,pwd); T'!p{Fbg;
2)用jndi(java的命名和目录服务)方式 HutQx
例子 4Q:r83#
String jndi = "jdbc/db"; +<bvh<]Od
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ^Q9K]Vo
DataSource ds = (DataSource) ctx.lookup(jndi); KzQuLD(e
Connection cn = ds.getConnection(); rlY n"3%
多用于jsp中 kQD~v+u{`
2、执行sql语句 TeKU/&fkc
1)用Statement来执行sql语句 B*:W`}G]_c
String sql; ?-JW2 E"uT
Statement sm = cn.createStatement(); Q7-'5s
sm.executeQuery(sql); // 执行数据查询语句(select) q\xsXM
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Zs2;VW4RW
2)用PreparedStatement来执行sql语句 9XmbHS[0V
String sql; pgBIYeY,
sql = "insert into user (id,name) values (?,?)"; YRQ?:a{H
PreparedStatement ps = cn.prepareStatement(sql); %OOy90b2
ps.setInt(1,xxx);
i,,mt_/,
ps.setString(2,xxx); gO#%*
W
... F},kfCFF
ResultSet rs = ps.executeQuery(); // 查询 kgd
dq
int c = ps.executeUpdate(); // 更新 B]I*ymc#
{t|Q9&
3、处理执行结果 C5Mpm)-%
查询语句,返回记录集ResultSet #j'7\SV
更新语句,返回数字,表示该更新影响的记录数 l ;S_ J^S
ResultSet的方法 ;gLOd5*0
1、next(),将游标往后移动一行,如果成功返回true;否则返回false YmD~&J
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 VFq7nV/O
IV~5Y{(l
4、释放连接 XZrzG P(
cn.close(); (_AU)
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection z9w]{Zd_,d
NIHcX6Nw
可滚动、更新的记录集 U/ax`_
1、创建可滚动、更新的Statement m -0}Pe9L
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); mQ3gp&d3W
该Statement取得的ResultSet就是可滚动的 5w5"rcV
2、创建PreparedStatement时指定参数 0E9 lv"3o
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); KQ ^E\,@o
ResultSet.absolute(9000); SgkW-#
批量更新 i
^,
$/
1、Statement Bf;<3k)5.
Statement sm = cn.createStatement(); A@Cvx7X
sm.addBatch(sql1); 8S5Q{[ !
sm.addBatch(sql2);
J^!wk9q
... MzF,is
sm.executeBatch() F~/~_9RJ
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 rpc;*t+z
2、PreparedStatement F^&@[k7WW
PreparedStatement ps = cn.preparedStatement(sql); *Ag3qnY
{ uK0L>
ps.setXXX(1,xxx); qp{~OW3
... c3WF!~1r
ps.addBatch(); i!eY"|o
} &%tW
ps.executeBatch(); WBR# Ux
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 "n{JH9sA:
l!": s:/'
事务的处理 -`$J& YU
1、关闭Connection的自动提交 }!"Cvu
cn.setAutoCommit(false); ( dh9aR_a
2、执行一系列sql语句 /Mj|Px%
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 2fXwJG'
Statement sm ; 8!
/ue.T
sm = cn.createStatement(insert into user...); Zzmo7kFx3
sm.executeUpdate(); 7!;zkou
sm.close(); 0^)~p{Zh
sm = cn.createStatement("insert into corp...); Jl|^^?
sm.executeUpdate(); G?!8T91;
sm.close(); *+(eH#_2/
3、提交 AC!yc(^<
cn.commit(); nI] zRduC
4、如果发生异常,那么回滚 S5r.so
cn.rollback();