java 数据库基本操作 SJfsFi?n
1、java数据库操作基本流程 1=>$c
2、几个常用的重要技巧: 7G(X:!
可滚动、更新的记录集 Hmz[pTQ|87
批量更新 E[y?\{
事务处理 8LOzL,Ah
K4KmoGb
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 )+J?(&6
1、取得数据库连接 QJ
QQ-
1)用DriverManager取数据库连接 B{Rig5Sc
例子 a2z o_h2R
String className,url,uid,pwd; @#p4QEQA
className = "oracle.jdbc.driver.OracleDriver"; }-!$KR]:s
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; p"ZPv~("V
uid = "system"; i
):el=
pwd = "manager"; (%bfNs|
Class.forName(className); 5<61NnZ
Connection cn = DriverManager.getConnection(url,uid,pwd); dg-pwWqN
2)用jndi(java的命名和目录服务)方式 IQ\`n|
例子 $iV3>>;eh
String jndi = "jdbc/db"; z-,'W`
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); l{k
DataSource ds = (DataSource) ctx.lookup(jndi); PUI.Un2C_
Connection cn = ds.getConnection(); 4h|D[Cb]
多用于jsp中 1oC/W?l^
2、执行sql语句 pz(clTOD:
1)用Statement来执行sql语句 i"r=b%;;
String sql; =w8*n2
Statement sm = cn.createStatement(); #SL/Jr
DZ
sm.executeQuery(sql); // 执行数据查询语句(select) x9uA@$l^|
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); z*FlZLHY
2)用PreparedStatement来执行sql语句 UZV)A}
String sql; SN11J+
sql = "insert into user (id,name) values (?,?)"; B]jh$@
PreparedStatement ps = cn.prepareStatement(sql); :D(:(`A=
ps.setInt(1,xxx); 9,,1\0-T*
ps.setString(2,xxx); p@P[pzxI
... 9t= erhUr
ResultSet rs = ps.executeQuery(); // 查询 J9/w_,,R$
int c = ps.executeUpdate(); // 更新 U5Rzfm4
}(gXlF
3、处理执行结果 #Qkl| h
查询语句,返回记录集ResultSet A1i-QG/6
更新语句,返回数字,表示该更新影响的记录数 6~^+</?
ResultSet的方法 =uD2j9!"7
1、next(),将游标往后移动一行,如果成功返回true;否则返回false `OduBUI]]
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 }V`Fz',lZ
g-6!+>w*>e
4、释放连接 )Y)7p//
cn.close(); 9gjx!t>`H
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection C}45ZI4
X!r!lW
可滚动、更新的记录集 qD2<-E&M/
1、创建可滚动、更新的Statement ZWYwVAo
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); aFKks .n3
该Statement取得的ResultSet就是可滚动的 u K 8r
2、创建PreparedStatement时指定参数 y![h
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); V$@@!q
ResultSet.absolute(9000); 8 #0?
批量更新 WpRi+NC}ln
1、Statement ZSxKk6n}J
Statement sm = cn.createStatement(); K{HdqmxL.I
sm.addBatch(sql1);
c,x2
sm.addBatch(sql2); \}Hk`n)Aq
... jt?R
a1Z
sm.executeBatch() A9F Z`
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 'v4AM@%u
2、PreparedStatement J0^p\mG
PreparedStatement ps = cn.preparedStatement(sql); D4_D{\xhO
{ obUh+9K
ps.setXXX(1,xxx); -0lpsF
... 3vDV
ps.addBatch();
RtK/bUa
} L[<MBgFKv
ps.executeBatch(); %x L3=4\
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 fFMG9]*
3
nb3rHQ
事务的处理 r0?`t!%V
1、关闭Connection的自动提交 .3oFSc`q
cn.setAutoCommit(false); #kk_iS>8
2、执行一系列sql语句 S =eP/
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 4{*K%pv\
Statement sm ; m&b!\"0
sm = cn.createStatement(insert into user...); Ywlym\
[+
sm.executeUpdate(); -x5^>+Y4
sm.close(); {P(IA2J'S
sm = cn.createStatement("insert into corp...); @^/JNtbH!
sm.executeUpdate(); Ix-FJF-
sm.close(); 2i8'*L+j
3、提交 6SW:'u|90
cn.commit(); >e"1a/2%>&
4、如果发生异常,那么回滚 ^P(HX
cn.rollback();