java 数据库基本操作 xNNoB/DR
1、java数据库操作基本流程 M} IRagm
2、几个常用的重要技巧: B[ f{Ys
可滚动、更新的记录集 B;8YX>r
批量更新 tUmI#.v
事务处理 b8J\Lm|J
@= c{GAj
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 t|*PC
1、取得数据库连接 i3.8m=>
1)用DriverManager取数据库连接 [Cz.K?+#M
例子 dXh@E7
String className,url,uid,pwd; 1Tn!.E *
className = "oracle.jdbc.driver.OracleDriver"; E<3hy
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 3zb;q@JV
uid = "system"; y+RT[*bX5o
pwd = "manager"; %r5&CUE5?
Class.forName(className); Y2Mti-\
Connection cn = DriverManager.getConnection(url,uid,pwd); s)HbBt-
2)用jndi(java的命名和目录服务)方式 o'Q)V
例子 F9e$2J)C
String jndi = "jdbc/db"; W%09.bF
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); SVp]}!jI
DataSource ds = (DataSource) ctx.lookup(jndi);
0k5Zl?
Connection cn = ds.getConnection(); xPh%?j?*v
多用于jsp中 +G&h
2、执行sql语句 (
$3j
1)用Statement来执行sql语句 'uUp1+
String sql; v@k62@;
Statement sm = cn.createStatement(); ~?vm97l
sm.executeQuery(sql); // 执行数据查询语句(select) Do(7LidC5
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); {e2 (
2)用PreparedStatement来执行sql语句 uNnwz%w
String sql; Iz2K
sql = "insert into user (id,name) values (?,?)"; 3V`K^X3
PreparedStatement ps = cn.prepareStatement(sql); vi0% jsI
ps.setInt(1,xxx); K0]'v>AWr
ps.setString(2,xxx); w\;=3C`
... ;T6^cS{ Gj
ResultSet rs = ps.executeQuery(); // 查询 v,RLN`CID
int c = ps.executeUpdate(); // 更新 2 c'=^0:
^ h^2='p
3、处理执行结果 +byw*Kk
查询语句,返回记录集ResultSet !23W=N}82
更新语句,返回数字,表示该更新影响的记录数 BzA(yCu$:
ResultSet的方法 "zw?AC6
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Ul[>LKFY
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 H/Goaf%
t1B0M4x9
4、释放连接 6mEW*qp2F
cn.close(); 'oTcx Jx
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection NV;5T3
ywk;
可滚动、更新的记录集 z$-/yT"M
1、创建可滚动、更新的Statement ,I=ClmR
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); $X9Ban]
该Statement取得的ResultSet就是可滚动的 B>o\;) l3O
2、创建PreparedStatement时指定参数 vD) LRO
Z
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); v%&f00
ResultSet.absolute(9000); 1q~U3'l:$
批量更新 !j4C:L3F
1、Statement "JVzv U]
Statement sm = cn.createStatement(); 5%?La`C9[
sm.addBatch(sql1); P,iLqat
sm.addBatch(sql2); Vw9^otJu
... *@G4i
sm.executeBatch() 5G){7]P+r"
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 #X"\:yN
2、PreparedStatement [ZURs3q
PreparedStatement ps = cn.preparedStatement(sql); /^uvY
{ N jq#@*>[p
ps.setXXX(1,xxx); ]Nt97eD)
... ACl:~7;
ps.addBatch(); p/lMv\`5
} GQ|kcY=
ps.executeBatch(); -5vc0"?E
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 o^&;
`XOd
'[Oi_gE.
事务的处理 AXPUJ?V
1、关闭Connection的自动提交 qvYYKu
cn.setAutoCommit(false); 7L;yN..0
2、执行一系列sql语句 ~uC4>+dk
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close /l+x&xYD
Statement sm ; j\dkv_L
sm = cn.createStatement(insert into user...); ":7cZ1VN2
sm.executeUpdate(); 8<!qT1
sm.close(); bq[Q
sm = cn.createStatement("insert into corp...); /gy;~eB01
sm.executeUpdate(); o;];ng
sm.close(); r.i.w0B(
3、提交 4C01=,6ye
cn.commit(); pJa FPO..|
4、如果发生异常,那么回滚 e,~c~Db*
Q
cn.rollback();