java 数据库基本操作 r0/aw
1、java数据库操作基本流程 sL4j@Lt
2、几个常用的重要技巧: n%K^G4k^
可滚动、更新的记录集 rGmxK|R
批量更新 z]HaE|j}S
事务处理 1{-yF :A
z2U^z*n{
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 MRN=-|fV^
1、取得数据库连接 :-tMH02c
1)用DriverManager取数据库连接 +[2ep"5H
例子 k@|Go)~
String className,url,uid,pwd; ESmWK;7b
className = "oracle.jdbc.driver.OracleDriver"; KXT9Wt=
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr;
ni?5h5-
uid = "system"; C17$qdV/
pwd = "manager"; 4vJg"*?
Class.forName(className); Ny5$IIFe
Connection cn = DriverManager.getConnection(url,uid,pwd); Y6RbRcJw
2)用jndi(java的命名和目录服务)方式 /2>.*H_2
例子 NnRX 0]
String jndi = "jdbc/db"; &a!MT^anA~
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); &cZl2ynPi
DataSource ds = (DataSource) ctx.lookup(jndi); S1a6uE
Connection cn = ds.getConnection(); -8Q}*Z
多用于jsp中 ~v6]6+
2、执行sql语句 i9eE/
.
1)用Statement来执行sql语句 ]{ir^[A6
String sql; Cs'<;|r(
Statement sm = cn.createStatement(); 821;; ]H
sm.executeQuery(sql); // 执行数据查询语句(select) Q" G;L
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Cg3 d
2)用PreparedStatement来执行sql语句 Y2aN<>f
String sql; 8}K4M(
sql = "insert into user (id,name) values (?,?)"; LV@tt&|N
PreparedStatement ps = cn.prepareStatement(sql); W|(U}PrC
ps.setInt(1,xxx); jidRh}>a=
ps.setString(2,xxx); O"~CZh,:r}
... KnC:hus
ResultSet rs = ps.executeQuery(); // 查询 F$@(0c
int c = ps.executeUpdate(); // 更新 Eg(.L,dj
6PT"9vR`)
3、处理执行结果 I~Q
G
查询语句,返回记录集ResultSet 0y`r.)G
更新语句,返回数字,表示该更新影响的记录数 9@>Q7AUCQ
ResultSet的方法 `Sal-|[Cv[
1、next(),将游标往后移动一行,如果成功返回true;否则返回false & ^;3S*p
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 o[%\W
?$.JgG%Z+g
4、释放连接 :B~m^5
cn.close(); ?izl#?
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection p&2oe\j$,
p :zRgwcn
可滚动、更新的记录集 (*Z:ByA
1、创建可滚动、更新的Statement ?T)M z
q}
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); a FL;E
该Statement取得的ResultSet就是可滚动的 H,EGB8E2
2、创建PreparedStatement时指定参数 PZihC
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); \Vx_$E
ResultSet.absolute(9000); 1ZY~qP+n+
批量更新
wwE3N[
1、Statement .u:aX$t+
Statement sm = cn.createStatement(); :6J&%n
sm.addBatch(sql1); /vs79^&
sm.addBatch(sql2); Ch_eK^ g1
... RMHJI6?LB
sm.executeBatch() Xi0fX$-,
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 g(dReC
2、PreparedStatement ej,R:}C%`
PreparedStatement ps = cn.preparedStatement(sql); ;)q"X>FMZe
{ -8yN6
0|
ps.setXXX(1,xxx); (_=R<:
... {uurLEe?
ps.addBatch(); 3.6Gh|7
} JPM~tp?;<
ps.executeBatch(); :!wl/X
~
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 o(yyj'=(
4"veq rC
事务的处理 Nx"|10gC
1、关闭Connection的自动提交 ZF@$3
cn.setAutoCommit(false); Of>2 m<
2、执行一系列sql语句 \. a 7F4h
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close $f=6>Kn|^]
Statement sm ; sGx3O i
sm = cn.createStatement(insert into user...); !8&EkXTw,
sm.executeUpdate(); >qZl
s'
sm.close(); gxmY^"Jy
sm = cn.createStatement("insert into corp...); 06z+xxCo
sm.executeUpdate(); aSMoee@!
sm.close(); hQeG#KQ
3、提交 B.:1fT7lI
cn.commit(); z9E*1B+
4、如果发生异常,那么回滚 <R?S
cn.rollback();