java 数据库基本操作 rmUTl
1、java数据库操作基本流程 {5-4^|!
2、几个常用的重要技巧: vmAMlgZ8{<
可滚动、更新的记录集 ()JM161
批量更新 DF%\1C>
事务处理 k6ERGQ9|I
Z/sB72K1
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 P[ n`X
1、取得数据库连接 3m#v|52oj
1)用DriverManager取数据库连接 Z66akr
例子 r1EccY
String className,url,uid,pwd; gR.zL>=_5e
className = "oracle.jdbc.driver.OracleDriver"; t9&)9,my
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; \MsAdYR
uid = "system"; .oH0yNFX
pwd = "manager"; {2R b^K
Class.forName(className); %*e6@Hm
Connection cn = DriverManager.getConnection(url,uid,pwd); ?,%vndI
2)用jndi(java的命名和目录服务)方式 )s,L:{<
例子 !~04^(
String jndi = "jdbc/db"; p&B98c
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); &zlwV"W
DataSource ds = (DataSource) ctx.lookup(jndi); UA>~xJp=
Connection cn = ds.getConnection(); 6/hY[a!
多用于jsp中 i&-g 0
2、执行sql语句 'Z+w\0}@
1)用Statement来执行sql语句 %lbSV}V)
String sql; IKKd
Statement sm = cn.createStatement(); L-^vlP)Vu
sm.executeQuery(sql); // 执行数据查询语句(select) 3^q,'!PfB
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 4} 'Xrg
2)用PreparedStatement来执行sql语句 O;ZU{VY
String sql; 7]d396%
sql = "insert into user (id,name) values (?,?)"; Yb%H9A
PreparedStatement ps = cn.prepareStatement(sql); j*x8K,fN
ps.setInt(1,xxx); b9)%,3-
ps.setString(2,xxx); UAnq|NJO
... jiYYDGs77
ResultSet rs = ps.executeQuery(); // 查询 h/5n+*x(
int c = ps.executeUpdate(); // 更新 Fo3[KW)8I
`^9 Zbwq
3、处理执行结果 <_uLf9ja
查询语句,返回记录集ResultSet dI5Z*"`R9
更新语句,返回数字,表示该更新影响的记录数 lu`\6
ResultSet的方法 mG7Wu{~=U
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 1}tZ,w>
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 yAU[A
|rH;}t|un
4、释放连接 dD1`[%
cn.close(); %Xh/16X${
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection chQt8Ar3
S6h=}
V)
可滚动、更新的记录集 e-,U@_B
1、创建可滚动、更新的Statement xM9EO(u
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); F}DdErd!f
该Statement取得的ResultSet就是可滚动的 sVZb[|zSri
2、创建PreparedStatement时指定参数 >"f,'S5*
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); BXO(B'1)]
ResultSet.absolute(9000); VE&
?Zd~
批量更新 >{~W"
1、Statement =<_xUh.
Statement sm = cn.createStatement(); Ra'0 ^4t
sm.addBatch(sql1); K0@2>nR
sm.addBatch(sql2); G`ZpFg0Y
... @(JcM=
sm.executeBatch() n }7DL8
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 +&jWM-T"-
2、PreparedStatement s!~M,zsQN
PreparedStatement ps = cn.preparedStatement(sql); CCDoiTu!4
{ pL]C]HGv
ps.setXXX(1,xxx); C.C)&&|X
... H4Ca+;
ps.addBatch(); >^Klq`"?g=
} a^<
ps.executeBatch(); S]KcAz( fX
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 @BbZ(cZ*
i@6MO'y
事务的处理 xQ>c.}J/i
1、关闭Connection的自动提交 iJ~5A'?6
cn.setAutoCommit(false); [3nhf<O
2、执行一系列sql语句 S5@/;T
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 9qIUBH e
Statement sm ;
$Tfq9
sm = cn.createStatement(insert into user...); %.r{+m
sm.executeUpdate(); r) T^ Td1
sm.close(); <GF)5QB
sm = cn.createStatement("insert into corp...); <^UB@'lCm
sm.executeUpdate(); LG [2u
sm.close(); b=9(gZ 9
3、提交 mn{8"@Z
cn.commit(); F@kOj*5,[
4、如果发生异常,那么回滚 Ms<^_\iPN
cn.rollback();