java 数据库基本操作 l]inG^s
1、java数据库操作基本流程 JPS22i)P
2、几个常用的重要技巧: XodA(73`i
可滚动、更新的记录集 MVz=:2)J2
批量更新 Y$!K<c k
事务处理 QIF|pZ+^
:L&Bbw(
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 M4pEwD
1、取得数据库连接 R_\{a*lV0
1)用DriverManager取数据库连接 ZO{uG(u
例子 BKfcK>%g
String className,url,uid,pwd; |{+D65R
className = "oracle.jdbc.driver.OracleDriver"; {S(?E_id5b
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; K>6#MI
uid = "system"; {&8-OoH ~
pwd = "manager"; _KC)f'Cx
Class.forName(className); Oga0CR_
Connection cn = DriverManager.getConnection(url,uid,pwd); }9t$Cs%
2)用jndi(java的命名和目录服务)方式 6+BR5Nr
例子 Q.#@xaX'{`
String jndi = "jdbc/db"; Q+)fI
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); d*Dq=.F(
DataSource ds = (DataSource) ctx.lookup(jndi); *:bNK5I.t
Connection cn = ds.getConnection(); y$7Fq'
多用于jsp中 /8@JWK^I{
2、执行sql语句 X0J@c "%0
1)用Statement来执行sql语句 a \B<(R.
String sql; r^-3( 77n
Statement sm = cn.createStatement(); q.FgX
sm.executeQuery(sql); // 执行数据查询语句(select) 0e9W>J9
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); n|IdEgD$
2)用PreparedStatement来执行sql语句 +[8s9{1{C
String sql; 0[TZ$<v"
sql = "insert into user (id,name) values (?,?)"; U|6 ME%xm
PreparedStatement ps = cn.prepareStatement(sql); Sx+.<]t2A
ps.setInt(1,xxx); L.>tJ.ID
ps.setString(2,xxx); F=yrqRS=
... *DObtS_
6
ResultSet rs = ps.executeQuery(); // 查询 P!'Sx;C^f
int c = ps.executeUpdate(); // 更新 kM|akG
AJ` b-$Q
3、处理执行结果 HS.3PE0^C
查询语句,返回记录集ResultSet NmYSk6kWJ
更新语句,返回数字,表示该更新影响的记录数 rc1EJ(c
ResultSet的方法 Um]>B`."wK
1、next(),将游标往后移动一行,如果成功返回true;否则返回false u&?J+
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ]78I
*5 ]fjh{
4、释放连接 JYOyz+wNd
cn.close(); )Yz`
6
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection V;mKJ.d${
p{xO+Nx1a
可滚动、更新的记录集 &N GYV
1、创建可滚动、更新的Statement 2+
F34
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); z"bgtlfb8
该Statement取得的ResultSet就是可滚动的 ,Y=r]
fk
2、创建PreparedStatement时指定参数 , fFB.q"
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); hc2[,Hju{O
ResultSet.absolute(9000); %YG ~ql
批量更新 GJai!$v
1、Statement PF*<_p" j
Statement sm = cn.createStatement(); ~ ?m';
sm.addBatch(sql1); Y v }G"-=
sm.addBatch(sql2); Brr{iBz*"
... |lOxRUf~
sm.executeBatch() g*F?
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 U(]a(k<r
2、PreparedStatement ))cL+r
PreparedStatement ps = cn.preparedStatement(sql); 'A
.c*<_
{ VlRN
ps.setXXX(1,xxx); YlwCl4hq
... |`_qmk[:R
ps.addBatch(); ?Q[uIQ?dV
} //]g78]=O
ps.executeBatch(); N~_GJw@
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 gN1b?_g
uS<7X7|!0
事务的处理 =z'- B~
1、关闭Connection的自动提交 _HX1E
cn.setAutoCommit(false); M8a^yoZn
2、执行一系列sql语句 lrB@n?hk
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close /9 NQ u
Statement sm ; I8@NQ=UV0
sm = cn.createStatement(insert into user...); I]bqle0M
sm.executeUpdate(); evNo(U\C
sm.close(); 1%Xwk2l,8b
sm = cn.createStatement("insert into corp...); uFOxb}a9v
sm.executeUpdate(); m5Q,RwJ!xK
sm.close(); &$t BD@7
3、提交 `}#(Ze*V:
cn.commit(); =Ig'Aw$ x
4、如果发生异常,那么回滚 v Ic0V
cn.rollback();