java 数据库基本操作 d5^ipu
1、java数据库操作基本流程 *xL#1
2、几个常用的重要技巧: sPc\xY
可滚动、更新的记录集 y7,~7f!N2
批量更新 >]C;sP
事务处理 u$<FKp;I
H@aCo(#
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 tEP^w
1、取得数据库连接 B*DH^";t
1)用DriverManager取数据库连接 {6/%w,{,
例子 nV']^3b
String className,url,uid,pwd; a[9;Okm#
className = "oracle.jdbc.driver.OracleDriver"; /_jApZz
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; T("Fh}
uid = "system"; z:<(b
pwd = "manager"; ?]h+En5z8
Class.forName(className); E8NIH!dI
Connection cn = DriverManager.getConnection(url,uid,pwd); G*J(4~Yw}
2)用jndi(java的命名和目录服务)方式 {p6",d."N&
例子 pR\etXeL d
String jndi = "jdbc/db"; \I'A:~b)L
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); _Q.3X[88C
DataSource ds = (DataSource) ctx.lookup(jndi);
kAy.o
Connection cn = ds.getConnection(); 8
LaZ5
多用于jsp中 *bv
Iqa
2、执行sql语句 L/<Up
1)用Statement来执行sql语句 m^]/
/j
String sql; 8|7Tk[X1j
Statement sm = cn.createStatement(); 6{+~B2Ef
sm.executeQuery(sql); // 执行数据查询语句(select) =797;|B H
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ;?n*w+6<
2)用PreparedStatement来执行sql语句 $T3/*xN
String sql; 5-]%D(y
sql = "insert into user (id,name) values (?,?)"; {MYlW0)~
PreparedStatement ps = cn.prepareStatement(sql); 7*[>e7:A
ps.setInt(1,xxx); 6e~+@S
ps.setString(2,xxx); j&8 ~X2?*
... WQ"ZQ
ResultSet rs = ps.executeQuery(); // 查询 #NL1N_B
int c = ps.executeUpdate(); // 更新 zROyG
D-,sF8{ i
3、处理执行结果 Pu
axS
查询语句,返回记录集ResultSet T<! `~#kM
更新语句,返回数字,表示该更新影响的记录数 )(DV~1r=
ResultSet的方法 p}(w"?2
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Ii[rM/sG
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 MgtyO3GUAD
&V$'{
4、释放连接 v8pUt\m"
cn.close(); jl:O~UL6i
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection /9GqEQsfM
c+4SGWmO
可滚动、更新的记录集 +m>Kb edl
1、创建可滚动、更新的Statement GD< Afni
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); $L`7(0U-
该Statement取得的ResultSet就是可滚动的 \nxt\KD
2、创建PreparedStatement时指定参数 <T0-m?D_$
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); R^8Opf_UN
ResultSet.absolute(9000); < W&~tVv
批量更新 ^OA}#k
NTW
1、Statement *xLMs(gg
Statement sm = cn.createStatement(); zlFl{t
sm.addBatch(sql1); wlKL|N
sm.addBatch(sql2); .!9]I'9M
... 2'pxA:
sm.executeBatch() 0s<o5`v
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 RKBjrSZg8
2、PreparedStatement 8E0Rg/DnT
PreparedStatement ps = cn.preparedStatement(sql); KE5f`h
{ da[l[b;
ps.setXXX(1,xxx); sDbALAp
+
... _0vXujz
ps.addBatch(); @H{$,\\
} ]L_HnmD6
ps.executeBatch(); K"=v|a.
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 RbrvY
,][+:fvS
事务的处理 GXHk{G@TS
1、关闭Connection的自动提交 pr;L~$JW
cn.setAutoCommit(false); YHKm{A ]
2、执行一系列sql语句 z*9/ "M
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ^k-H$]
Statement sm ; yyA/x,
sm = cn.createStatement(insert into user...); 5h20\b?=$
sm.executeUpdate(); /n"A%6S
sm.close(); J v)]7u
sm = cn.createStatement("insert into corp...); ?94da4p
sm.executeUpdate(); 9Z+@i:_}
sm.close(); m9PcDhv
3、提交 "[#jq5>
:
cn.commit(); F48`1+
4、如果发生异常,那么回滚 N!Y'W)i16
cn.rollback();