java 数据库基本操作 >H euf"V
1、java数据库操作基本流程 m6
M/G
2、几个常用的重要技巧: |LIcq0Z
可滚动、更新的记录集 71(ppsHk
批量更新 g[b;1$
事务处理 [D|Uwq
q\P{h ij
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 uuHs)
1、取得数据库连接 8}oe))b
1)用DriverManager取数据库连接 $!'Vn)Z7
例子 f
4K)Z
e
String className,url,uid,pwd; I&8!V)r)
className = "oracle.jdbc.driver.OracleDriver"; MYJDfI
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; U>n.+/ss
uid = "system"; J'#o6Ud
pwd = "manager"; !x-9A
Class.forName(className); >PWDo
Connection cn = DriverManager.getConnection(url,uid,pwd); pTQ7woj}
2)用jndi(java的命名和目录服务)方式 yYJ +vs
例子 0n{+_
String jndi = "jdbc/db"; F ww S[3
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 4tiCxf)
DataSource ds = (DataSource) ctx.lookup(jndi); bA"*^"^
Connection cn = ds.getConnection(); B&3@b
多用于jsp中 A9HgABhax
2、执行sql语句 /#x0?d{5
1)用Statement来执行sql语句 r_^]5C\
String sql; QSYKYgxC
Statement sm = cn.createStatement(); k~Y_%#_
sm.executeQuery(sql); // 执行数据查询语句(select) c@O7,y:`I
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); (=53WbOh/t
2)用PreparedStatement来执行sql语句 ~:="o/wo
String sql; L@ N\8mf
sql = "insert into user (id,name) values (?,?)"; &C/,~pJ1S
PreparedStatement ps = cn.prepareStatement(sql); OYfP!,+bn
ps.setInt(1,xxx); ,-1taS
ps.setString(2,xxx); q>a/',m
... oM}P Wf-
ResultSet rs = ps.executeQuery(); // 查询 h_t<Jl
int c = ps.executeUpdate(); // 更新 g3w-Le&T
U,2\ TBz
3、处理执行结果 V+y:!t`
查询语句,返回记录集ResultSet B&lF!
]
更新语句,返回数字,表示该更新影响的记录数 JR/^Go$^
ResultSet的方法 W-"FRTI4
1、next(),将游标往后移动一行,如果成功返回true;否则返回false g5~1uU$O
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 rI1;>/Ir
%lK]m`(
4、释放连接 1'J|yq
cn.close(); 0'y3iar
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection X?] 1/6rV
r`=!4vY2
可滚动、更新的记录集 2fJ2o[v
1、创建可滚动、更新的Statement d,).O
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); h3L{zOff
该Statement取得的ResultSet就是可滚动的 BBm;QOBU
2、创建PreparedStatement时指定参数 uJHf6Ye
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); &AlX).
ResultSet.absolute(9000); #%tN2cFDN
批量更新 7b[vZNi_
1、Statement U_c9T> =
Statement sm = cn.createStatement(); K1Wiiw
sm.addBatch(sql1); GCPSe A~cx
sm.addBatch(sql2); Q2/ZO2
... w873: =
sm.executeBatch() !pLQRnI}6
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 {__"Z<
2、PreparedStatement sIh,@b
PreparedStatement ps = cn.preparedStatement(sql); J$D#)w!$j
{ R nf$
ps.setXXX(1,xxx); "(rG5z3P
... MRdZ '
ps.addBatch(); jDO[u!J6.%
} lf\]^yM #
ps.executeBatch(); \?e{/hXnl
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 H:BWv08~5
7Z/KXc[b
事务的处理 o4CgtqRs
1、关闭Connection的自动提交 e " f/
cn.setAutoCommit(false); t)O$W
2、执行一系列sql语句 \j]i"LpWb
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close n`krK"Ii
Statement sm ; EnGVp<6R
sm = cn.createStatement(insert into user...); Rj9YAW$
sm.executeUpdate(); UmSy p\i
sm.close(); ;V~[kF=t0
sm = cn.createStatement("insert into corp...); ?E0j)P/
(
sm.executeUpdate(); |BGQ|7DyG
sm.close(); W"_")V=QBz
3、提交 Z!P7mH\c}
cn.commit(); dtw4cG
4、如果发生异常,那么回滚 r_f?H@ v
cn.rollback();