java 数据库基本操作 a5caryZ"z
1、java数据库操作基本流程 LGB}:;$AL
2、几个常用的重要技巧: -!q^/ux
可滚动、更新的记录集 AT%6K.
批量更新 m~04I~8vk
事务处理 2ci[L:U
Y O&@
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 OYSq)!:
1、取得数据库连接 V/`vX;%
1)用DriverManager取数据库连接 A*G ~#v^
例子 gu|=uW K
String className,url,uid,pwd; zX lcu_rc
className = "oracle.jdbc.driver.OracleDriver"; e.\dqt~%y
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; `R;i1/
uid = "system"; u8.F_'` z
pwd = "manager"; D6-R>"}
Class.forName(className); ulE5lG0c
Connection cn = DriverManager.getConnection(url,uid,pwd); bgLa`8
2)用jndi(java的命名和目录服务)方式 bmu] zJ
例子 zZ6m`]{B9?
String jndi = "jdbc/db"; p4V* %A&w
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); tk]D)+{u&c
DataSource ds = (DataSource) ctx.lookup(jndi); Om^(CAp
Connection cn = ds.getConnection(); 9U8x&Z]P
多用于jsp中 `JO>g=,4
2、执行sql语句 ,OWk[0/
1)用Statement来执行sql语句 rY6x):sC
String sql; 793 15A
Statement sm = cn.createStatement(); LaO8)lqR
sm.executeQuery(sql); // 执行数据查询语句(select) $C.a@gm
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 1RJFPv
2)用PreparedStatement来执行sql语句 :.4O
Hp1
String sql; ^3[_4av
sql = "insert into user (id,name) values (?,?)"; 3m= _a
PreparedStatement ps = cn.prepareStatement(sql); b{qN7X~>
ps.setInt(1,xxx); n&Ckfo_D
ps.setString(2,xxx); 2TUV9Z
... :a6LfPEAX
ResultSet rs = ps.executeQuery(); // 查询 tsAV46S
int c = ps.executeUpdate(); // 更新 |]4!WBK
ao2^3e
3、处理执行结果 3Rc*vVnI
查询语句,返回记录集ResultSet S[1<Qrv]
更新语句,返回数字,表示该更新影响的记录数 ;.V/ngaj
ResultSet的方法 lG)wa
1、next(),将游标往后移动一行,如果成功返回true;否则返回false IRN,=
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 @G4Z
W_W !v&@E=
4、释放连接 .KrLvic
cn.close(); !"N,w9MbD
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection h.edb6
2XR!2_)O5
可滚动、更新的记录集 bW`nLiw}%
1、创建可滚动、更新的Statement .q2r!B
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); F@<cp ?dR
该Statement取得的ResultSet就是可滚动的 WSozDNF!'f
2、创建PreparedStatement时指定参数 RvR.t"8
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); b$@I(.X:
ResultSet.absolute(9000); L(3&,!@
批量更新 ;mpY cpI
1、Statement ;pm/nu
Statement sm = cn.createStatement(); >~,~X9
sm.addBatch(sql1); (PPC?6s
sm.addBatch(sql2); Tf#Op
v)
... :
;8L1'
sm.executeBatch() 7)U
ik}0
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 jGouwta
2、PreparedStatement {+lU 4u
PreparedStatement ps = cn.preparedStatement(sql); mX>N1zAz
{
,hf W2}
ps.setXXX(1,xxx); ?$`kT..j,u
... =R:O`qdC4e
ps.addBatch(); P<>NV4
} &B5&:ib1D
ps.executeBatch(); *SJ[~
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 .$s']' =
r\QV%09R
事务的处理 ZklO9Ox(
1、关闭Connection的自动提交 RL&0?OT
cn.setAutoCommit(false); J<L\IP?%
2、执行一系列sql语句 Y*#xo7#B
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close P84YriLo
Statement sm ; vJs6nVbK
sm = cn.createStatement(insert into user...); [f:&aS+
sm.executeUpdate(); ~rb]u
Ny-
sm.close();
Qq6'[Od
sm = cn.createStatement("insert into corp...); dG+$!*6Z
sm.executeUpdate(); E!ZLVR.K
sm.close(); q0q-Coh>
3、提交 ?Sh"%x
cn.commit(); A3.I|/
4、如果发生异常,那么回滚 aoz+T h3
cn.rollback();