java 数据库基本操作 ocwh*t)<k
1、java数据库操作基本流程 qq0bIfF\4
2、几个常用的重要技巧: ,(0q
可滚动、更新的记录集 cC'{+j8-a
批量更新 ?zwPF;L*
事务处理 h#K863
:'-FaGy
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 vas
1、取得数据库连接 Xj :?V;
1)用DriverManager取数据库连接 ]d]tQPEU
例子 D'y/pv}!
String className,url,uid,pwd; 4zyy
className = "oracle.jdbc.driver.OracleDriver"; 2"
(vjnfH
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ] -O/{FIv
uid = "system";
xviz{M9g
pwd = "manager"; wy3{>A Z(
Class.forName(className);
sWp]Zy
Connection cn = DriverManager.getConnection(url,uid,pwd); \TM%,RC3K
2)用jndi(java的命名和目录服务)方式 \hSOJ,{)U
例子 ~2Jvb[IM
String jndi = "jdbc/db"; p"Ki$.Y
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ]HoQ6R\E b
DataSource ds = (DataSource) ctx.lookup(jndi); Z_&6<1,H
Connection cn = ds.getConnection(); /p|]*={
多用于jsp中 0m?v@K' l
2、执行sql语句 Vw7NLTE}`
1)用Statement来执行sql语句 nKn,i$sO/.
String sql; '+tU8 Pb
Statement sm = cn.createStatement(); n dRy&[f7
sm.executeQuery(sql); // 执行数据查询语句(select) ]<D9Q>
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); }5#<`8
2)用PreparedStatement来执行sql语句 MW%EJT>@z
String sql; ;Wjb}_V:_
sql = "insert into user (id,name) values (?,?)"; PfTjC"`,
PreparedStatement ps = cn.prepareStatement(sql); D0(QZrVa
ps.setInt(1,xxx); q|)8VmVV
ps.setString(2,xxx); &f1dCL%z7
... E7E>w#T5
ResultSet rs = ps.executeQuery(); // 查询 Jt6~L5[_s
int c = ps.executeUpdate(); // 更新 X5kIM\
;5tSXgGw7
3、处理执行结果 D@T>z;
查询语句,返回记录集ResultSet AtNu:U$
更新语句,返回数字,表示该更新影响的记录数 e-Z+)4fH
ResultSet的方法 [G{{f
1、next(),将游标往后移动一行,如果成功返回true;否则返回false _iBNy
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 i>gbT+*E!
GJW>8*&&(
4、释放连接 Hf
P2o5-
cn.close(); +JE
h7
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection <6k5nE h
ol^J-
可滚动、更新的记录集 P@LYa_UFsN
1、创建可滚动、更新的Statement V[>MKB(
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Y=JfV
该Statement取得的ResultSet就是可滚动的 (hTe53d<S?
2、创建PreparedStatement时指定参数 o$I% 1
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); &-#!]T-P:E
ResultSet.absolute(9000); >
t *+FcD
批量更新 Y4,~s64e
1、Statement VZNMom,Wr
Statement sm = cn.createStatement(); ;' !G?)PZ
sm.addBatch(sql1); b;#Z/phix
sm.addBatch(sql2); mjUln8Jc
... `"J=\3->
sm.executeBatch() $fSV8 n;Y
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 -Y'Qa/:7
2、PreparedStatement {f]K3V
PreparedStatement ps = cn.preparedStatement(sql); O:'UsI1Y
{ X
10(oT
ps.setXXX(1,xxx); dwOB)B@{H
... "`Q~rjc$2
ps.addBatch(); Q:$<`K4)
} qn}w]yGW
ps.executeBatch(); F"xD^<i
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 =}5;rK
)F;`07
事务的处理 8:c[_3w
1、关闭Connection的自动提交 _+%RbJ~H
cn.setAutoCommit(false); ^`NU:"
2、执行一系列sql语句 }=Yvs)
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close E/@w6uIK[
Statement sm ; k4te[6)
sm = cn.createStatement(insert into user...); \O
9j+L"
sm.executeUpdate(); 7a.$tT
sm.close(); >h>X/a(=~
sm = cn.createStatement("insert into corp...); !kZ9Ox9^
sm.executeUpdate(); Rk8>Ak(/
sm.close(); a[iuE`
3、提交 ur^)bp<