java 数据库基本操作 4Z5#F]OA7
1、java数据库操作基本流程 Yl({)qK{
2、几个常用的重要技巧: o"+
i&Wp~
可滚动、更新的记录集 1}g:|Q
批量更新 %SA!p;
事务处理 reiU%C
-x]`DQUg
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 yoS? s
1、取得数据库连接 K*vU5S
1)用DriverManager取数据库连接 $8=@R'
例子 wk$,k
String className,url,uid,pwd; `f`TS#V
className = "oracle.jdbc.driver.OracleDriver"; P:{<*`q
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Qvqqvk_tv
uid = "system"; `
\ZqgX4
pwd = "manager"; iHBB,x
Class.forName(className); 74J@F2g}?
Connection cn = DriverManager.getConnection(url,uid,pwd); "/+zMLY
2)用jndi(java的命名和目录服务)方式 2qU&l|>
例子 S4A q'
String jndi = "jdbc/db"; < bUe/m
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); X.#oEmA,P
DataSource ds = (DataSource) ctx.lookup(jndi); NiSO'=y$n
Connection cn = ds.getConnection(); |:[9O`U)s
多用于jsp中 Zi
ESlf$
2、执行sql语句 |a(fejO3
1)用Statement来执行sql语句 ?IhB-fd>@
String sql; Sc$UZ/qPT
Statement sm = cn.createStatement(); ";NRzY
sm.executeQuery(sql); // 执行数据查询语句(select) ]z ==
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 1wn&js C
2)用PreparedStatement来执行sql语句 WeJ@xL
String sql; Xu} U{x>
sql = "insert into user (id,name) values (?,?)"; \caH pof
PreparedStatement ps = cn.prepareStatement(sql); rT6?!$"%.
ps.setInt(1,xxx); MDO$m g
ps.setString(2,xxx); PuCc2'#
... )&W**!(C
ResultSet rs = ps.executeQuery(); // 查询 WFv!Pbq,
int c = ps.executeUpdate(); // 更新 ,.mBJSE3
}iiHr|l3
3、处理执行结果 0kDBE3i#
查询语句,返回记录集ResultSet R: Z_g!h
更新语句,返回数字,表示该更新影响的记录数 1~yZ T
ResultSet的方法 iEHh{H(
1、next(),将游标往后移动一行,如果成功返回true;否则返回false f~h~5
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 (-^bj
gS9>N/b|
4、释放连接 WZewPn>#q
cn.close(); !iu5OX7K|
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection |+f-h,
P,z:Z|}8
可滚动、更新的记录集 _elX<o4
1、创建可滚动、更新的Statement x\\7G^$<h
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); >lzA]aM$c
该Statement取得的ResultSet就是可滚动的 +RDJY(Y$
2、创建PreparedStatement时指定参数 :0~QRc-u
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); \;9W.d1iU
ResultSet.absolute(9000); u=NG6G
批量更新 UT]?;o"
1、Statement -4 Ux,9&
Statement sm = cn.createStatement(); "Ij I'c
sm.addBatch(sql1); `=)2<Ca;~@
sm.addBatch(sql2); r@}bDkx
... 0!GAk
sm.executeBatch() Jfhk@27T
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 b>=_*nw9
2、PreparedStatement ~^US/"
PreparedStatement ps = cn.preparedStatement(sql); &"E
lm
{ WlwY <)
ps.setXXX(1,xxx); 5W? PCOh\
... >FF5x#^&c
ps.addBatch(); i'HQQWd
} ;sOsT?)7$
ps.executeBatch(); w4};q%OBj
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 \=e8%.#@J
/bVZ::A&_
事务的处理 YZwaD b
1、关闭Connection的自动提交 x4kWLy7Sz
cn.setAutoCommit(false); /@oLe[Mz$
2、执行一系列sql语句 n=sXSxl
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 1TN}GsAj
Statement sm ; a\5FAkI
sm = cn.createStatement(insert into user...); {E_{JB~`
sm.executeUpdate(); 2KJ1V+g@a6
sm.close(); p~jlx~1-]
sm = cn.createStatement("insert into corp...); &X>7n~@0
sm.executeUpdate(); 5f7zk
sm.close(); ERMa# L
3、提交 1Y/$,Oa5
cn.commit(); \Sy7"a
4、如果发生异常,那么回滚 0D&> Gyc*0
cn.rollback();