java 数据库基本操作 w3Z;&sFd
1、java数据库操作基本流程 U?&&yynK
2、几个常用的重要技巧: kcio]@#
可滚动、更新的记录集 ,l7',@6Y
批量更新 f,0,:)
事务处理 i;I!Jc_b'
hjx=?
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 T)tf!v3v
1、取得数据库连接 c!Wj^
1)用DriverManager取数据库连接 rLx'.:
例子 KGNBzy~9
String className,url,uid,pwd; JLu>w:\
className = "oracle.jdbc.driver.OracleDriver"; j*#k%;c
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Wj"GS!5
uid = "system"; wLOS,=
pwd = "manager"; ' T%70)CM~
Class.forName(className); Ot([5/K
Connection cn = DriverManager.getConnection(url,uid,pwd); tr-muhuK
2)用jndi(java的命名和目录服务)方式 Dh.pH1ZY3n
例子 Eq6.
s)10
String jndi = "jdbc/db"; ,*j@Zb_r
Context ctx = (Context) new InitialContext().lookup("java:comp/env");
LAO2Py#
DataSource ds = (DataSource) ctx.lookup(jndi); 1rGi"kdf
Connection cn = ds.getConnection(); %IHra6
多用于jsp中 3U&rK)F
2、执行sql语句 .j^=]3
1)用Statement来执行sql语句 m 7/b.B}
String sql; w i=&W
Statement sm = cn.createStatement(); 1qd(3A41
sm.executeQuery(sql); // 执行数据查询语句(select) .$N8cYu0
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); %W,V~kb
2)用PreparedStatement来执行sql语句 W $E Ao+V
String sql; JsV-:J
sql = "insert into user (id,name) values (?,?)"; _a-At
PreparedStatement ps = cn.prepareStatement(sql); n2;Vrs,<1&
ps.setInt(1,xxx); B(qwTz 51
ps.setString(2,xxx); yYn7y1B
... ?i5=sK\
ResultSet rs = ps.executeQuery(); // 查询 h[}e5A]}
int c = ps.executeUpdate(); // 更新 Zg/
],/ `
z%44@TP
3、处理执行结果 Dio9'&DtC
查询语句,返回记录集ResultSet $0P7^4)w:
更新语句,返回数字,表示该更新影响的记录数 t\-|J SZ
ResultSet的方法 mDO! o
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ZE9.r`
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 yB|1?L#
85lcd4&~
4、释放连接 biENRJQ.
cn.close(); C8D`:k
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection SGu`vN]
.-)kIFMi
可滚动、更新的记录集 iXL?ic
1、创建可滚动、更新的Statement xNjWo*y v
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ?C']R(fQ\
该Statement取得的ResultSet就是可滚动的 /@U bN\
2、创建PreparedStatement时指定参数 |,tKw4
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); }s[`T
ResultSet.absolute(9000); HSVl$66
批量更新 qB3E
1、Statement *MQ`&;Qa,
Statement sm = cn.createStatement(); `1uGU[{x
sm.addBatch(sql1); ] !n3j=*
sm.addBatch(sql2); Pbt7T
Q
... vU$n*M1`$
sm.executeBatch() A9MTAm{
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 :*s@L2D6
2、PreparedStatement D 9UM8Hxi
PreparedStatement ps = cn.preparedStatement(sql); U$;UW3-
{ -b|"%e<'
ps.setXXX(1,xxx); R2JPLvs
... J$lfI^^
ps.addBatch(); "28zLo3
} w~yC^`
ps.executeBatch(); zbgGK7
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 k n/xt
f~7V< v
事务的处理 k8r1)B4ab
1、关闭Connection的自动提交 wNU;gz
cn.setAutoCommit(false); ]r'D
2、执行一系列sql语句 M3r;Pdj2r
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close VOIni<9y
Statement sm ; eD7qc1*G
sm = cn.createStatement(insert into user...); mtdy@=?1Y
sm.executeUpdate(); ?!O4ia3nFk
sm.close(); |a%Wd
sm = cn.createStatement("insert into corp...); hzT)5'_
sm.executeUpdate(); F|@\IVEB]
sm.close(); Tgh?=]H
3、提交 -hc8IS
cn.commit(); v0?SN>fZ
4、如果发生异常,那么回滚 BGHZL~
cn.rollback();