java 数据库基本操作 S[y_Ewzq
1、java数据库操作基本流程 h\Y~sm?!`
2、几个常用的重要技巧: <Pe'&u
可滚动、更新的记录集 FxK!h.C.
批量更新 +.^pAz U}R
事务处理 7 u Q +]d
l'2vo=IQ
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 q2`mu4B
1、取得数据库连接 L$!2<eK
1)用DriverManager取数据库连接 T 8]*bw
例子 D_ej%QtB@
String className,url,uid,pwd; 1\/vS$bi(
className = "oracle.jdbc.driver.OracleDriver"; 9)=bBQyr:
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; qSD`S1'2;
uid = "system"; K+L9cv4 |*
pwd = "manager";
zZ51jA9x
Class.forName(className); iDgc$'%?
Connection cn = DriverManager.getConnection(url,uid,pwd); Ji=`XsV
2)用jndi(java的命名和目录服务)方式 Cl&)#
例子 k'e1ZAn
String jndi = "jdbc/db"; $JBb]
v8_
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); x+'Ea.^
DataSource ds = (DataSource) ctx.lookup(jndi); wM;=^br
Connection cn = ds.getConnection(); `RU RC"
多用于jsp中 cR55,DR,#W
2、执行sql语句 oL>o*/
1)用Statement来执行sql语句 ?/@XJcm+
String sql; Q=[ IO,f
Statement sm = cn.createStatement(); Abmi=]\bx
sm.executeQuery(sql); // 执行数据查询语句(select) 9]G~i`QQ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); :]8A;`G}
2)用PreparedStatement来执行sql语句 } 21!b :a
String sql; vs$.i
sql = "insert into user (id,name) values (?,?)"; #-"C_~-MH
PreparedStatement ps = cn.prepareStatement(sql); ?TW? 2+
ps.setInt(1,xxx); {m,LpI0wG
ps.setString(2,xxx); Aq'~'hS`1
... QJx<1#
ResultSet rs = ps.executeQuery(); // 查询 0d~?|Nv -
int c = ps.executeUpdate(); // 更新 [;D1O;c'W.
] ONmWo77o
3、处理执行结果 y6G6wk;
查询语句,返回记录集ResultSet N0K <zxR
更新语句,返回数字,表示该更新影响的记录数 m*7RC4"J
ResultSet的方法 7g o Rj
1、next(),将游标往后移动一行,如果成功返回true;否则返回false HG5E,^1n
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 `!ja0Sq]U
bG.`>
4、释放连接 *'{9(Oj
cn.close(); 7fT_]H8
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection PCc{0Rp\vk
L0%W;m
可滚动、更新的记录集 }^n"t>Z8
1、创建可滚动、更新的Statement ka_R|xG\
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); (CYQ>)a
该Statement取得的ResultSet就是可滚动的 UhU+vy6)/
2、创建PreparedStatement时指定参数 \vL{f;2J
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); n5fc_N/8O=
ResultSet.absolute(9000); Yfz`or\@=
批量更新 ] J|#WtS
1、Statement d:z7
U
Statement sm = cn.createStatement(); wwa)VgoS[
sm.addBatch(sql1); Mt~2&$>
sm.addBatch(sql2); f{(D+7e}
... <hgfgk7<
sm.executeBatch() W<~u0AyO
3
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 n2'XWbMaL
2、PreparedStatement Je K0><
PreparedStatement ps = cn.preparedStatement(sql); [cfXcl
{ >#.du}t
ps.setXXX(1,xxx); b0N7[M1Xl
... ^'b\OUty-
ps.addBatch(); O;(n[k
} 1n>AN.nI
ps.executeBatch(); @]V_%,
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 2aUE<@RU[
9A\\2Zz6F
事务的处理 U[ogtfv`m
1、关闭Connection的自动提交 Fj&8wZ)v)
cn.setAutoCommit(false); gm: xtN
2、执行一系列sql语句 [F,s=,S'M
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close --7@rxv
Statement sm ; }ol<DV
sm = cn.createStatement(insert into user...); Te>m9Pav
sm.executeUpdate(); }$3pS:_N~
sm.close(); ~yRKNH*M
sm = cn.createStatement("insert into corp...); ng[LSB*57Y
sm.executeUpdate(); lt0byn$vz
sm.close(); GM0pHmC
3、提交 x^ Y sXzu
cn.commit(); XpT~]q}
4、如果发生异常,那么回滚 ,esUls'nz'
cn.rollback();