java 数据库基本操作 A `H&"A
1、java数据库操作基本流程 4!I;U>b b
2、几个常用的重要技巧: F+lsza
可滚动、更新的记录集 !,I530eh7
批量更新 o:.6{+|N
事务处理 GWQ_X9+q
zRz7*o&l
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 .3tyNjsn\
1、取得数据库连接 `H^?jX>7
1)用DriverManager取数据库连接 -kv'C6gB
例子 Me.t_)
String className,url,uid,pwd; +FYQ7UE
className = "oracle.jdbc.driver.OracleDriver"; ^T{ww=/v
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ;)SWUXa;{
uid = "system"; LK?V`J5wY
pwd = "manager"; Q)H1\
Class.forName(className); M.[A%_|P
Connection cn = DriverManager.getConnection(url,uid,pwd); r
N.<S[
2)用jndi(java的命名和目录服务)方式 PXH"%vVF
例子 MV~-']2u
String jndi = "jdbc/db"; ^EG@tB $<
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); W{{{c2 .
DataSource ds = (DataSource) ctx.lookup(jndi); VkD8h+)
Connection cn = ds.getConnection(); C4`u3S
多用于jsp中 gmU0/z3&
2、执行sql语句 Gp PlO]
1)用Statement来执行sql语句 ]h`<E~
String sql; xpzQ"'be
Statement sm = cn.createStatement(); Hy_}e"
sm.executeQuery(sql); // 执行数据查询语句(select) 2".^Ma^D!
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); J4xJGO
2)用PreparedStatement来执行sql语句 uqN:I)>[P
String sql; s-z*Lq*
sql = "insert into user (id,name) values (?,?)"; /=|5YxY
PreparedStatement ps = cn.prepareStatement(sql); %)|_&Rh
ps.setInt(1,xxx); qM|-2Zl!+
ps.setString(2,xxx); cSkJlhwNn
... ckZZ)lW`*
ResultSet rs = ps.executeQuery(); // 查询 r2Wx31j{
int c = ps.executeUpdate(); // 更新 pFUW7jE
mHnHB.OL
3、处理执行结果 )Q!3p={S*
查询语句,返回记录集ResultSet */kX|Sur
更新语句,返回数字,表示该更新影响的记录数 .&Vyo<9Ck
ResultSet的方法 Wb|xEwq d`
1、next(),将游标往后移动一行,如果成功返回true;否则返回false p{sbf;-x}
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 mp\`9j+{
hlgBx~S[
4、释放连接 neHozmm|
cn.close(); ub#>kCL9
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection il)LkZ@
Je5UVf3>2&
可滚动、更新的记录集 \Jcj4
1、创建可滚动、更新的Statement E@f2hW2
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ;M95A
该Statement取得的ResultSet就是可滚动的 CXzN4!
2、创建PreparedStatement时指定参数 w'Cn3b)`
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 5T,In+~Kd
ResultSet.absolute(9000); P/'9k0zs)
批量更新 cITF=Ez
1、Statement H,?)6pZ
Statement sm = cn.createStatement(); 1VH$l(7IQ
sm.addBatch(sql1); q*h1=H52
sm.addBatch(sql2); :=0XT`iY
... nhUL{ER
sm.executeBatch() ^J([w~&
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ~(|~Ze>
2、PreparedStatement 2K8?S
PreparedStatement ps = cn.preparedStatement(sql); 1 o;*`
{ c04"d"$ x
ps.setXXX(1,xxx); 2Sq+w;/
... \mBH6GS
ps.addBatch(); 6]#\|lds1
} !A 6l\_
ps.executeBatch(); c1,dT2:=
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 N1O& fMz
s`bC?wr5h
事务的处理 V&'
:S{i
1、关闭Connection的自动提交 =Wl*.%1 b
cn.setAutoCommit(false); SSS)bv8m
2、执行一系列sql语句 Fe4QWB6\U
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close _>/T<Db
Statement sm ; .q>4? +
sm = cn.createStatement(insert into user...); m^8KHa
sm.executeUpdate(); wR"4slY_%
sm.close(); P p}N-me>_
sm = cn.createStatement("insert into corp...); Z1(-FT6O
sm.executeUpdate(); )"&$.bWn
sm.close(); ic"n*SZa
3、提交 iz2I4 _N
cn.commit(); 0'DlsC/`*
4、如果发生异常,那么回滚 I& `>6=)
cn.rollback();