java 数据库基本操作 p2uZ*sY(D
1、java数据库操作基本流程 m}o4Vr;"
2、几个常用的重要技巧: 1_6oM/?'
可滚动、更新的记录集 Tt\G y
批量更新 -5sKJt]+i
事务处理 O#B2XoZa+
QK@[b3-h1
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 'MY0v_
1、取得数据库连接 ]U)Yg
1)用DriverManager取数据库连接 TjLW<D(i>
例子 )lDmYt7me
String className,url,uid,pwd; GR>kxYM%q
className = "oracle.jdbc.driver.OracleDriver"; :|PgGhW
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; .Arcsg
uid = "system"; |++\"g
pwd = "manager"; \O(~:KN
Class.forName(className); XX[CTh?O%
Connection cn = DriverManager.getConnection(url,uid,pwd); 6PdLJ#LS
2)用jndi(java的命名和目录服务)方式 4g^Xe-
例子 :*dfP/GO
String jndi = "jdbc/db"; t @vb3
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); P&}J(;Lbl
DataSource ds = (DataSource) ctx.lookup(jndi); mB<*we
Connection cn = ds.getConnection(); ?$Jj^/luD
多用于jsp中 RA$q{$arb
2、执行sql语句 *dmS'/
1)用Statement来执行sql语句 ~3,k8C"pRq
String sql; mo
Statement sm = cn.createStatement(); w
sm.executeQuery(sql); // 执行数据查询语句(select) ^M~Z_CQL2
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); mq6TwM
2)用PreparedStatement来执行sql语句
y)GH=@b
String sql; y,cz;2
sql = "insert into user (id,name) values (?,?)"; s?~lMm' !
PreparedStatement ps = cn.prepareStatement(sql); ]x:>!y
ps.setInt(1,xxx); 3T84f[CFJ
ps.setString(2,xxx); %8$ldNhV
... q3}WO]TBj
ResultSet rs = ps.executeQuery(); // 查询 ~1.B
fOR8
int c = ps.executeUpdate(); // 更新 \_8.\o"@*#
9U]j@*QN
3、处理执行结果 ^&Wa?
m.
查询语句,返回记录集ResultSet O#72h]
更新语句,返回数字,表示该更新影响的记录数 A8U\/GP
ResultSet的方法 s>c0K@ADO
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 3*!w c.=
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ]@A}v\wa
f S-PM3
4、释放连接 iM(Q-%HP_
cn.close(); r%412#
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection t5;)<N`
gUHx(Fi[4
可滚动、更新的记录集 dBNx2T}_0
1、创建可滚动、更新的Statement @e:=
D
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); jN T+?2
该Statement取得的ResultSet就是可滚动的 GiS:Nq`$(
2、创建PreparedStatement时指定参数 DuI>z?bS
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); /wT<p
ResultSet.absolute(9000); J1g+H2
批量更新 Eu|O<9U\
1、Statement S:8 WBY] M
Statement sm = cn.createStatement(); +sFpIiJg
sm.addBatch(sql1); =>htX(k}
sm.addBatch(sql2); x".!&5
... !yo@i_1D
sm.executeBatch() .)Zs:50l
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Ci_Qra 6
2、PreparedStatement 8T?D#,/
PreparedStatement ps = cn.preparedStatement(sql); FL E3LH
{ o8h`9_
ps.setXXX(1,xxx); 7r o&Q%
... ;DXg
ps.addBatch(); Pmdf:?B
} Q:U>nm>xA
ps.executeBatch(); hI 1or4V
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 \dJOZ2J<z
TX).*%f[r
事务的处理 N~~
sM"n
1、关闭Connection的自动提交 hMnm>
cn.setAutoCommit(false); ;b_l/T(
2、执行一系列sql语句 ?Sr7c|a2
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close >PK 6CR
Statement sm ; @UQ421Z`
sm = cn.createStatement(insert into user...); H*HL:o-[
sm.executeUpdate(); SZ1yy["
sm.close(); 6_g:2=6S
sm = cn.createStatement("insert into corp...); X.+|o@G
sm.executeUpdate(); 5
BLAa1
sm.close(); \>[k0<
3、提交 b} FhC"'i
cn.commit(); M@+Pq/f:
4、如果发生异常,那么回滚 _F},Wp:Oh
cn.rollback();