java 数据库基本操作 1!"iN~
1、java数据库操作基本流程 s^lm
81;
2、几个常用的重要技巧: ^a #
可滚动、更新的记录集 C%T$l8$
批量更新 \*i[m&3;q
事务处理 ZhnRsn9
;>jLRx<KC
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 #_9Jam%M
1、取得数据库连接 9X ^D(
1)用DriverManager取数据库连接 I;rh(FMV
例子 N&YQZ^o
String className,url,uid,pwd; E!]d?t3b
className = "oracle.jdbc.driver.OracleDriver"; ;]I~AGH:
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; *m.4)2u=
uid = "system"; f)9{D[InM^
pwd = "manager"; ZD`p$:pT
Class.forName(className); RuBL_Vi
Connection cn = DriverManager.getConnection(url,uid,pwd); 7Pp~)Kq=
2)用jndi(java的命名和目录服务)方式 b[;Zl<
例子 me`|i-
String jndi = "jdbc/db"; %}ASll0uq
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); NxzRVsNF
DataSource ds = (DataSource) ctx.lookup(jndi); mJFFst,
Connection cn = ds.getConnection(); /vrjg)fer
多用于jsp中 J,,+JoD
2、执行sql语句 D]B;5f
1)用Statement来执行sql语句 &:}}T=@M1
String sql; Y. 1dk
Statement sm = cn.createStatement(); sA1 XtO<&7
sm.executeQuery(sql); // 执行数据查询语句(select) 2 i:tPe&
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); geJO#;
2)用PreparedStatement来执行sql语句 > a"4aYj
String sql; b+!I_g4P
sql = "insert into user (id,name) values (?,?)"; <cNg_ZZ;8
PreparedStatement ps = cn.prepareStatement(sql); gVU&Yl~/^
ps.setInt(1,xxx); rG"QK!R5
ps.setString(2,xxx); iD`>Bt7gD
... ,.-85isco
ResultSet rs = ps.executeQuery(); // 查询 jB -wJNP/
int c = ps.executeUpdate(); // 更新 }$D{YHF
P d)<Iw^<
3、处理执行结果 -$@4e|e%a
查询语句,返回记录集ResultSet F?.J1]
更新语句,返回数字,表示该更新影响的记录数 g6l&;S40
ResultSet的方法 OaCp3No
1、next(),将游标往后移动一行,如果成功返回true;否则返回false eW.[M ?,
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 yr,Oq~e
wW1>#F
4、释放连接 !dZpV~g0
cn.close(); a/s6|ri`0
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ; +%| !~
5l,Q=V^@l
可滚动、更新的记录集 yE>f.|(
1、创建可滚动、更新的Statement $,DX^I%!
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); [&H?--I
该Statement取得的ResultSet就是可滚动的 +E8}5pDt
2、创建PreparedStatement时指定参数 e_z"<yq
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ^e4y:# Nu
ResultSet.absolute(9000); e,rCutA)
批量更新 jSMs<ox
1、Statement [X=J]e^D
Statement sm = cn.createStatement(); @ 9q/jv`
sm.addBatch(sql1); ^iz2=}Q8
sm.addBatch(sql2); w/Ej>OS
... h&Q9
sm.executeBatch() O({vHqN>
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 HS[N]'dc
2、PreparedStatement t]PO4GA
PreparedStatement ps = cn.preparedStatement(sql); UCDvN
{ ]CZ&JL
ps.setXXX(1,xxx); ZW>?y$C+
...
{H$m1=S
ps.addBatch(); BBUXoz
} i=DoK{`L
ps.executeBatch(); \[F4ooe
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 .pd_SQ~
L7 f'
事务的处理 `z]MQdE_w
1、关闭Connection的自动提交 50J"cGs~
cn.setAutoCommit(false); N,Ys}qP
2、执行一系列sql语句 53jtwklA
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close o;<oXv
Statement sm ; 8jxs%N,aI
sm = cn.createStatement(insert into user...); BR[f{)a5
sm.executeUpdate(); b*@y/ e\u`
sm.close(); hp6%zUR
sm = cn.createStatement("insert into corp...); wU =@,K
sm.executeUpdate(); Y/aNrIK7
sm.close(); H;nq4;^yK
3、提交 }iF"&b0n"
cn.commit(); vJE>H4qPmD
4、如果发生异常,那么回滚 JJe?Zu\
cn.rollback();