java 数据库基本操作 |A2W8b
{]
1、java数据库操作基本流程 QGu7D #%|
2、几个常用的重要技巧: LJ:mJ#
可滚动、更新的记录集 7v.#o4nPK
批量更新 D6"~fjHh
事务处理 [+Yl;3&]
(bM)Nd
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 IH*U!_ `
1、取得数据库连接 y_;]=hEL
1)用DriverManager取数据库连接 m7weR>aS4
例子 A)~/~
String className,url,uid,pwd; 0#2T0zk
className = "oracle.jdbc.driver.OracleDriver"; xop-f#U*
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; BvNl?A@]A
uid = "system"; v[p/c.p?i
pwd = "manager"; {-:4O\/
Class.forName(className); w i![0IE )
Connection cn = DriverManager.getConnection(url,uid,pwd); ~Tpe,juG_
2)用jndi(java的命名和目录服务)方式 n$}R/*
例子 I 0x`H)DA
String jndi = "jdbc/db"; \a9D[wk;@
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); OcyiL)tv 5
DataSource ds = (DataSource) ctx.lookup(jndi); cWX"e6
Connection cn = ds.getConnection(); 5&GQ=m
多用于jsp中 p3>Q<
2、执行sql语句 - I1cAt
1)用Statement来执行sql语句 5e~ j
String sql; Ac*B[ywA3
Statement sm = cn.createStatement(); dlU
JYI
sm.executeQuery(sql); // 执行数据查询语句(select) ;H D 4~3
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); oP 6.t-<dU
2)用PreparedStatement来执行sql语句 ({ :yw
String sql; S&;T_^|
sql = "insert into user (id,name) values (?,?)"; {Zd)U "
PreparedStatement ps = cn.prepareStatement(sql); ui0J}DM
ps.setInt(1,xxx); z&6]vN'
ps.setString(2,xxx); n0>5'm%ES
... YL0WUD_>
ResultSet rs = ps.executeQuery(); // 查询 1( QWt
int c = ps.executeUpdate(); // 更新 E.En$'BvB
Q 37V!
3、处理执行结果 ySPlyhGF
查询语句,返回记录集ResultSet WOe{mwhhj
更新语句,返回数字,表示该更新影响的记录数 24.7S LXO
ResultSet的方法 <s59OdzP
1、next(),将游标往后移动一行,如果成功返回true;否则返回false bahc{ZC2
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 =0jmm(:Jh
$\JQGic`
4、释放连接 A>ug'.
cn.close(); XSL
t;zL:
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection +S:u[x
dvrvpDoE.
可滚动、更新的记录集 5Xq.=/eX
1、创建可滚动、更新的Statement 8k*
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); hSLwiX~
该Statement取得的ResultSet就是可滚动的 9~Y)wz
2、创建PreparedStatement时指定参数 '>S8t/
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ` maN5)
ResultSet.absolute(9000); CBz(hCaI
批量更新 f6dE\
1、Statement cN[q)ts
Statement sm = cn.createStatement(); CguU+8]
sm.addBatch(sql1);
zO7lsx2=
sm.addBatch(sql2); OoU '86)
... OLd$oxKR
sm.executeBatch()
8E.5k@
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 h!X'SGK
2、PreparedStatement t2!$IHE:
PreparedStatement ps = cn.preparedStatement(sql); h~^qG2TYWq
{ ;_Of`C+
ps.setXXX(1,xxx); %i]uW\~U
... v"Ud mv "
ps.addBatch(); D
KMbs
} ,~ia$vI}R
ps.executeBatch(); "\R@lUx.Y
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ]w&?k:y>
tSh}0N)
事务的处理 dmTW]P2
1、关闭Connection的自动提交 G74a9li@
cn.setAutoCommit(false); ]'bQ(<^#
2、执行一系列sql语句 nfCd*f
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close zei9,^
C
Statement sm ; b|V4Fp
sm = cn.createStatement(insert into user...); \CEnOq
sm.executeUpdate(); 6LF^[b/u
sm.close(); #u]_7/(</`
sm = cn.createStatement("insert into corp...); }GU6Q|s[u[
sm.executeUpdate(); sQ3ayB`
sm.close(); S:B-nI
3、提交 ngH~4HyT
cn.commit(); c?3F9w#
4、如果发生异常,那么回滚 ck4T#g;=
cn.rollback();