java 数据库基本操作 S22 ;g
1、java数据库操作基本流程 vX%gcs/@
2、几个常用的重要技巧: ZQ/5]]}3y
可滚动、更新的记录集 y_#wR/E)u{
批量更新 =ByW`
事务处理 (*]Y<ve
\I]'6N=
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 p}uw-$O
1、取得数据库连接 (*tJCz`Sj
1)用DriverManager取数据库连接 UW3F)
例子 WGn1pW
String className,url,uid,pwd; jnY4(B
className = "oracle.jdbc.driver.OracleDriver"; 8uiQm;W
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; w6 .HvH-@?
uid = "system"; `rV,<
pwd = "manager"; | <$O5b'
Class.forName(className); kA0^~
Connection cn = DriverManager.getConnection(url,uid,pwd); Lf9h;z>#
2)用jndi(java的命名和目录服务)方式 x.RZ!V-
例子 -:q7"s-}b
String jndi = "jdbc/db"; k,& QcYw
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); M}u2aW2]X
DataSource ds = (DataSource) ctx.lookup(jndi); /2q%'"x(
Connection cn = ds.getConnection(); 3]P=co@
多用于jsp中 [u:_Jqf-
2、执行sql语句 <s>SnOD
1)用Statement来执行sql语句 ;7hr8?M|
String sql; $Izk]o;X~
Statement sm = cn.createStatement(); _De;SB%V
sm.executeQuery(sql); // 执行数据查询语句(select) hZy*E [i
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 3t'K@W?AJh
2)用PreparedStatement来执行sql语句 [<t*&Kr+o
String sql; WYL.J5O
sql = "insert into user (id,name) values (?,?)"; 3#unh`3b
PreparedStatement ps = cn.prepareStatement(sql); =Ju}{ bX
ps.setInt(1,xxx); "mA/:8` Q
ps.setString(2,xxx); _QY "#
... +W`~bX+
ResultSet rs = ps.executeQuery(); // 查询 pppbn]%Ob
int c = ps.executeUpdate(); // 更新 )uP= o
b3H;Ea?^^<
3、处理执行结果 DS
yE
查询语句,返回记录集ResultSet \b->AXe8
更新语句,返回数字,表示该更新影响的记录数 Y/gCtSF
ResultSet的方法 2S3F]fG0
1、next(),将游标往后移动一行,如果成功返回true;否则返回false B!0[LlF+
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 y\x<!_&D
QB3AL;7
4、释放连接 uJizR
F
cn.close(); nYY U
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection j#,O,\
_"=~aMXC.)
可滚动、更新的记录集 "$_ypgRrSR
1、创建可滚动、更新的Statement 1mqFnVkf&+
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); b,wO^07-3^
该Statement取得的ResultSet就是可滚动的 [B
Al
2、创建PreparedStatement时指定参数 u CXd%
CzE
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); :>=,sLfJ
ResultSet.absolute(9000); NNX/2
批量更新 _>.%X45xi
1、Statement cQjJ9o7
Statement sm = cn.createStatement(); p%BO:%v
sm.addBatch(sql1); k95vgn%
sm.addBatch(sql2); &IPT$=u
... hwJ.M4
sm.executeBatch() $HRpG
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ^*W3{eyi(L
2、PreparedStatement Oqyh{q%]
PreparedStatement ps = cn.preparedStatement(sql); +e\u4k {3V
{ 4b)xW&K{
ps.setXXX(1,xxx); lc^%:#@
... +x`tvo
ps.addBatch(); lU?"\m
} 1EN5ZN,
ps.executeBatch(); W!g
,
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 !**q20-aP
tB[K4GNSQ
事务的处理 $[d}g
1、关闭Connection的自动提交
eUl[gHP
cn.setAutoCommit(false); ()iJvf>@
2、执行一系列sql语句 I('l)^m%
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ]TQjk{X<
Statement sm ; LxbVRw
sm = cn.createStatement(insert into user...); =o {`vv
sm.executeUpdate(); j>U.(K
sm.close(); ~vgW:]i
sm = cn.createStatement("insert into corp...); *UTk. :G5
sm.executeUpdate(); xg8<b
sm.close(); Z7 @#0;g{
3、提交 A/MOY@%G
cn.commit(); tU(6%zvR
4、如果发生异常,那么回滚 @U}UC G7+
cn.rollback();