java 数据库基本操作 s4>xh=PoJ
1、java数据库操作基本流程 < !]7Gt
2、几个常用的重要技巧: AI2 >{V
可滚动、更新的记录集 m\ /V 0V\
批量更新 7s1LK/R|u
事务处理 NjSjE_S2B8
Fprhu;h
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 6
i]B8Ziq{
1、取得数据库连接 *1_A$14l
1)用DriverManager取数据库连接 j,#R?Ig
例子 m`8tHHF
String className,url,uid,pwd; G)\6W#de4
className = "oracle.jdbc.driver.OracleDriver"; KT8]/T`U
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; &qZ:"k
uid = "system"; |*zvaI(}
pwd = "manager"; YQ5d!a.
Class.forName(className); i%9xt1c_
Connection cn = DriverManager.getConnection(url,uid,pwd); /f
-\
3
2)用jndi(java的命名和目录服务)方式 JC4Z^/\.
例子 z#sSLE.$Z
String jndi = "jdbc/db"; P4~C0z
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); N9cUlrDO
DataSource ds = (DataSource) ctx.lookup(jndi); ^v@&
q
Connection cn = ds.getConnection(); 1PT0<C-
多用于jsp中 kam\dn04
2、执行sql语句 !,PoH
1)用Statement来执行sql语句 a5%IjgQ&z
String sql; y?{YQ)fj
Statement sm = cn.createStatement(); PWs=0.Wj
sm.executeQuery(sql); // 执行数据查询语句(select) R~(_m#6`:
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); >]WQ1E[=
2)用PreparedStatement来执行sql语句 5K?%Eo72!=
String sql; +)TOcxF%
sql = "insert into user (id,name) values (?,?)"; yy|F6Pq3`
PreparedStatement ps = cn.prepareStatement(sql); Le}-F{~`^
ps.setInt(1,xxx); ;]SP~kG
ps.setString(2,xxx); O.+X,CQG*
... +jX.::UPm
ResultSet rs = ps.executeQuery(); // 查询 l%$co07cX
int c = ps.executeUpdate(); // 更新 (Y]G6>
Oa
`oo(\O7t=
3、处理执行结果 w\ 7aAf3O
查询语句,返回记录集ResultSet )NS&1$
更新语句,返回数字,表示该更新影响的记录数 =k22f`8ew
ResultSet的方法 nD;8)VI'I
1、next(),将游标往后移动一行,如果成功返回true;否则返回false fHwr6"DJ
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 \}mn"y
#me'1/z
4、释放连接 P[C03a!lXg
cn.close(); a]_eSU@
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 5*7
\Yjk?
M]OZS\9.B
可滚动、更新的记录集 *1
l"|=_&s
1、创建可滚动、更新的Statement BA|*V[HBE
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); `1"Xj ^
YM
该Statement取得的ResultSet就是可滚动的 h^"OC$
2、创建PreparedStatement时指定参数 ?BnjtefIe
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); :0B'
b
ResultSet.absolute(9000); [\e2 ID;
批量更新 G=%SMl>[
1、Statement B":u5_B
Statement sm = cn.createStatement(); &c1zEgl
sm.addBatch(sql1); :u>9H{a
sm.addBatch(sql2); >pn5nn1a
... tXnD>H YV
sm.executeBatch() 6,;7iA]
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Fr ryZe=
2、PreparedStatement @^kt[$X;
PreparedStatement ps = cn.preparedStatement(sql); KN9 e""
{ Acib<Mi2!-
ps.setXXX(1,xxx); 5 MD=o7O^
... p-o!K\o-1
ps.addBatch(); L5yv}:.U
} \4|o5, +(@
ps.executeBatch(); |cUBS)[)X
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 iZ-"l3)D
|VD}:
事务的处理 )$e_CJ}9e
1、关闭Connection的自动提交 7cJh^M
cn.setAutoCommit(false); w(Hio-l=
2、执行一系列sql语句 42mZ.,<
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close uKocEWB=/F
Statement sm ; H '(Ky
sm = cn.createStatement(insert into user...); g}=opw6z
sm.executeUpdate(); <rpXhcR
sm.close(); \zPcnDB
sm = cn.createStatement("insert into corp...); /{d5$(Y"
sm.executeUpdate(); ==pGRauq
sm.close(); 1#<KZN =$
3、提交 VaRP+J}UA.
cn.commit(); N/&t)7
4、如果发生异常,那么回滚 41V}6+$g
cn.rollback();