java 数据库基本操作 8bIP"!=*W
1、java数据库操作基本流程 nM,:f)z
2、几个常用的重要技巧: O'y8q[2KE
可滚动、更新的记录集 i+_LKHQN
批量更新 SQKhht`M
事务处理 gFDnt
]%Q!%uTh
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 /jbAf ]"F;
1、取得数据库连接 ?t#wK}d.
1)用DriverManager取数据库连接 ?#xl3Z ;I
例子 !l:GrT8J
String className,url,uid,pwd; ;nY#/%f
className = "oracle.jdbc.driver.OracleDriver"; =2Y;)wrF
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ,_[x|8m
uid = "system"; ><V*`{bD9)
pwd = "manager"; m,l/=M
Class.forName(className); O%bbyR2
Connection cn = DriverManager.getConnection(url,uid,pwd); F3tps
jQ
2)用jndi(java的命名和目录服务)方式 gQ1obT"|
例子 SN{z)q
String jndi = "jdbc/db"; e8m,q~%#/
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); H;H=8'
DataSource ds = (DataSource) ctx.lookup(jndi); 7T~M`$h
Connection cn = ds.getConnection(); baxZ>KNi
多用于jsp中 )*')
2、执行sql语句 dC11kqqj
1)用Statement来执行sql语句 7Cgi&
String sql; aZfMeW
Statement sm = cn.createStatement(); ^^y eC|~N:
sm.executeQuery(sql); // 执行数据查询语句(select) fgLjF,Y
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); \}j MC
2)用PreparedStatement来执行sql语句 _fAgp_)
String sql; *Gsj pNr-
sql = "insert into user (id,name) values (?,?)"; +y7z>Fwl
PreparedStatement ps = cn.prepareStatement(sql); ua\t5M5
ps.setInt(1,xxx); kaG/8G(
ps.setString(2,xxx); BZR{}Aj4pa
... FDHW'OP4
ResultSet rs = ps.executeQuery(); // 查询 ^t>mdxuq
int c = ps.executeUpdate(); // 更新 LPk@t^[
l_B735
3、处理执行结果 z>x@o}#u\|
查询语句,返回记录集ResultSet G\.~/<Mg+
更新语句,返回数字,表示该更新影响的记录数 ]9@:7d6
ResultSet的方法 *S$vSDJCW
1、next(),将游标往后移动一行,如果成功返回true;否则返回false JA^o/%a^
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 c9(3z0!F?
]
V
D
4、释放连接
Fr%#
cn.close(); ! 'zd(kv<
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection T$Z9F^w
[ks_wvY:'
可滚动、更新的记录集 y^.66BH
1、创建可滚动、更新的Statement *}[\%u$ T
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); }Zhe%M=}G
该Statement取得的ResultSet就是可滚动的 RLF&-[mr3
2、创建PreparedStatement时指定参数 GES}o9?#
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); qJey&_
ResultSet.absolute(9000); }@DCc f$<
批量更新 )SV.|
1、Statement MKK ^-T
Statement sm = cn.createStatement(); g \mE
sm.addBatch(sql1); kA:Y^2X'
sm.addBatch(sql2); !_W:%t)g
... blO4)7m
sm.executeBatch() 4kOO3[r
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 #-{<d%qk
2、PreparedStatement % rBzA<
PreparedStatement ps = cn.preparedStatement(sql); ofvR0yV
{ UwN Vvo
ps.setXXX(1,xxx); FD=%
4#|
... c*USA
eP
ps.addBatch(); JsEJ6!1
} Qg> NJ\*Q
ps.executeBatch(); <-lM9}vd
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 STKL
2TK \pfD
事务的处理 uvys>]+
1、关闭Connection的自动提交 iP:i6U]
cn.setAutoCommit(false); |vI*S5kn6A
2、执行一系列sql语句 KE?t?p
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ,'L>:pF3
Statement sm ; PyeNu3Il4
sm = cn.createStatement(insert into user...); 6[bopin
sm.executeUpdate(); D9rQ%|}S
sm.close(); 6BE,L
sm = cn.createStatement("insert into corp...); .i0K-B
sm.executeUpdate(); kpOdyn(
sm.close(); hpdI5
3、提交 K_Y-N!h
cn.commit();
01kRe
4、如果发生异常,那么回滚 (;NJ<x
cn.rollback();