java 数据库基本操作 tPho4,x$
1、java数据库操作基本流程 KP!ctlP~
2、几个常用的重要技巧: "@E(}z'sM
可滚动、更新的记录集 |70Lh+
批量更新 Y<-dd"\
事务处理 ||k^pzj%
_zj}i1!E"
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 BM]sW:-v
1、取得数据库连接 *HN0em
1)用DriverManager取数据库连接 b7bbrR8
例子 B^uQv|m
String className,url,uid,pwd; w`Js"_\
className = "oracle.jdbc.driver.OracleDriver"; ? k*s!YCZ
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Y:XxTa*
uid = "system"; u!&Vbo? .B
pwd = "manager"; @[4 Tdf
Class.forName(className); fhp][)g;
Connection cn = DriverManager.getConnection(url,uid,pwd); I 0}+}{M:
2)用jndi(java的命名和目录服务)方式 2@S{e$YK`
例子 ]`x\Oj&
String jndi = "jdbc/db"; cC6W1K!
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); nAJ<@a
DataSource ds = (DataSource) ctx.lookup(jndi); {'#^
Connection cn = ds.getConnection(); 0@ 9em~
多用于jsp中 PO[
AP%;
2、执行sql语句 :kDHwYv$
1)用Statement来执行sql语句 ~h{v^}
String sql; T=w5FT
Statement sm = cn.createStatement(); z`D;8x2b
sm.executeQuery(sql); // 执行数据查询语句(select) lT3, G#(
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); j6KGri
2)用PreparedStatement来执行sql语句 6
2r%q^r`i
String sql; }*4K]3et$
sql = "insert into user (id,name) values (?,?)"; zl j%v/9
PreparedStatement ps = cn.prepareStatement(sql); \$Nx`daFi
ps.setInt(1,xxx); H}QOoXWkg
ps.setString(2,xxx); e8@@Pi<sB
... dkC[Jt
ResultSet rs = ps.executeQuery(); // 查询 "1H?1"w~
int c = ps.executeUpdate(); // 更新 el*C8TWlw
<5Jp2x#
3、处理执行结果 3!0Eh8ncI
查询语句,返回记录集ResultSet }F1|&
A
更新语句,返回数字,表示该更新影响的记录数 ZgL4$%
ResultSet的方法 eM*@zo<-
1、next(),将游标往后移动一行,如果成功返回true;否则返回false m1X0stFRs"
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 uJ4RjLM`
>uuP@j
4、释放连接 z&o"K\y\
cn.close(); D84`#Xbi
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection wY2#xD
2bS)|#v<_t
可滚动、更新的记录集 gd6We)&
1、创建可滚动、更新的Statement dwKre#4F
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); _'k?9eN`
该Statement取得的ResultSet就是可滚动的 [EDw0e
2、创建PreparedStatement时指定参数 |*0oz=
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 9KVeFl
ResultSet.absolute(9000); sAIL+O
批量更新 l|`%FB^ k
1、Statement +pJ;}+
Statement sm = cn.createStatement(); ysfR@ sH7
sm.addBatch(sql1); nn"!x|c
sm.addBatch(sql2); ,qak_bP
... .}6 YKKqS
sm.executeBatch() DNdwMSwp
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 >De\2gbJ
2、PreparedStatement KL!k'4JNY
PreparedStatement ps = cn.preparedStatement(sql); [1'`KJ]
{ pJx88LfR
ps.setXXX(1,xxx); Re('7m h~
... E27wxMU
ps.addBatch(); ^:K"Tv.=
} b7{)B?n
ps.executeBatch(); mCe,(/>l+
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Xvm.Un<N
GwV2`2
事务的处理 J[;c}
1、关闭Connection的自动提交 5.#r\' Z#
cn.setAutoCommit(false); "-kb=fY
2、执行一系列sql语句 +/7UM x1
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close [a\:K2*'
Statement sm ; x`w
4LF
sm = cn.createStatement(insert into user...); %up]"L&i
sm.executeUpdate(); *'vX:n&t
sm.close(); H^p?t=Y
sm = cn.createStatement("insert into corp...); }8p;w T!
sm.executeUpdate(); qr$=oCqa
sm.close(); kg7oH.0E
3、提交 9zEO$<e o
cn.commit(); I)V2cOrXM
4、如果发生异常,那么回滚 =U!'v X d
cn.rollback();