java 数据库基本操作 =-GxJPL
1、java数据库操作基本流程 ycOnPTh
2、几个常用的重要技巧: NRT]dYf"z
可滚动、更新的记录集 2$!,$J-<Y
批量更新 )Td{}vbIh
事务处理 EowzEGq!a5
<6,,:=#
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Pw7uxN`
1、取得数据库连接 mSZg;7DE3*
1)用DriverManager取数据库连接 KQ81Oxu*C
例子 k2,`W2]^E
String className,url,uid,pwd; FyPG5-
className = "oracle.jdbc.driver.OracleDriver"; `T7TWv"M
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 7j&EQm5\9
uid = "system"; uW#s;1H.)
pwd = "manager"; 5M5vxJ)Lh
Class.forName(className); ;
2V$`k
Connection cn = DriverManager.getConnection(url,uid,pwd); `jTB9A"
2)用jndi(java的命名和目录服务)方式 W$;qhB
例子 zOFHdd ,"g
String jndi = "jdbc/db";
kz6fU\U
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); {.KD#W
$5
DataSource ds = (DataSource) ctx.lookup(jndi); R)*l)bpZ#
Connection cn = ds.getConnection(); ~%M*@fm
多用于jsp中 PN<VqtW
2、执行sql语句 HJym|G>%?
1)用Statement来执行sql语句 m}oR*<.
String sql; BYhiP/^
Statement sm = cn.createStatement(); aot2F60J,
sm.executeQuery(sql); // 执行数据查询语句(select) :&:P4Y1
E
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); :i0;jWcb
2)用PreparedStatement来执行sql语句 soQ[Zg4}
String sql; zks7wt]A
sql = "insert into user (id,name) values (?,?)"; 7gB?rJHV,
PreparedStatement ps = cn.prepareStatement(sql);
(#O"
ps.setInt(1,xxx); M
l@F
ps.setString(2,xxx); 4E2/?3D
... !]D`|HoW
ResultSet rs = ps.executeQuery(); // 查询 RjO0*$>h
int c = ps.executeUpdate(); // 更新 YX)Rs
Vf
+TaxH;
3、处理执行结果 U:3OE97
查询语句,返回记录集ResultSet q+p}U}L=
k
更新语句,返回数字,表示该更新影响的记录数 6~2upy~e
ResultSet的方法 r%iFsV_
1、next(),将游标往后移动一行,如果成功返回true;否则返回false w4}Q6_0v
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 w{k ^O7~
GRkN0|ovfj
4、释放连接 &IzNoB
cn.close(); $ xHtI]T
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ePJ_O~c
"M /Cl|z
可滚动、更新的记录集 JR15y3F
1、创建可滚动、更新的Statement La'6k
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ~I;x_0iY4
该Statement取得的ResultSet就是可滚动的 C#yRop_d]o
2、创建PreparedStatement时指定参数 U$+,|\9
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); /J/V1dC}]D
ResultSet.absolute(9000); i '*!c
批量更新 oA7DhU5n
1、Statement DmPsE6G}
Statement sm = cn.createStatement();
_(8#
sm.addBatch(sql1); 4Otq3s34FT
sm.addBatch(sql2); *>mjUT}cP
... BN%cX2j
sm.executeBatch() :3D6OBkB
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 !y/e
Fx
2、PreparedStatement 6B7*|R>
PreparedStatement ps = cn.preparedStatement(sql); esBv,b?*
{ "a~r'+'<
ps.setXXX(1,xxx); P!IA;i
... T|D^kL%m!
ps.addBatch(); 4
?PB
Fbd
} (GpP=lSSeY
ps.executeBatch(); 4:a ~Wlp[
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 :Rv+Bm
r nr-wUW@
事务的处理 H?Q--pG8
1、关闭Connection的自动提交 _a& Z$2O
cn.setAutoCommit(false); _D?/$D7u#%
2、执行一系列sql语句 pL;e(lM
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close `5wiXsNjLY
Statement sm ; 3%GsTq2o
sm = cn.createStatement(insert into user...); <8kCmuGlk
sm.executeUpdate(); 1hi,&h
sm.close(); j
nSZ@u
sm = cn.createStatement("insert into corp...); CdmpKkq#
sm.executeUpdate(); $/g`{OI]K
sm.close(); I(7iD. ^:
3、提交 p!=8 Pq.
cn.commit();
uM\\(g}
4、如果发生异常,那么回滚 pKj:)6t"
cn.rollback();