java 数据库基本操作 b4 hIeBI\
1、java数据库操作基本流程 c6b0*!D"}
2、几个常用的重要技巧: G^Xd- 7 GQ
可滚动、更新的记录集 P Tnac
批量更新 98*x 'Wp
事务处理 acOJ]]
Dw |3Z
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 7aQcP
1、取得数据库连接 7nz!0I^
1)用DriverManager取数据库连接 pIVq("&
例子 GM}C]MVD
String className,url,uid,pwd; <4zT;:NQ
className = "oracle.jdbc.driver.OracleDriver";
F$*3@Y
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; j;2<-{
uid = "system"; lug}
Uj
pwd = "manager"; =ef1XQ{i*
Class.forName(className); *=vlqpG
Connection cn = DriverManager.getConnection(url,uid,pwd); WF/l7u#4i
2)用jndi(java的命名和目录服务)方式 kUHie
例子 y3yvZD
String jndi = "jdbc/db"; 7<yp"5><)
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); {(\(m/!Z
DataSource ds = (DataSource) ctx.lookup(jndi); j
0
Y
Connection cn = ds.getConnection(); +AK:(r
多用于jsp中 /R%^rz'w
2、执行sql语句 V:\]cGA{
1)用Statement来执行sql语句 8Inx/>eOI
String sql; 0yHjrxc$
Statement sm = cn.createStatement(); 'XTs
-=
sm.executeQuery(sql); // 执行数据查询语句(select) h#{T}[
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); f[qPG&
2)用PreparedStatement来执行sql语句 ypA: P
String sql; 8U^D(jrz
sql = "insert into user (id,name) values (?,?)"; aqfL0Rg+`
PreparedStatement ps = cn.prepareStatement(sql); [A_r1g&_
ps.setInt(1,xxx); Lht[g9
ps.setString(2,xxx); uu>lDvR*
... (/fT]6(
ResultSet rs = ps.executeQuery(); // 查询 E&%jeR
int c = ps.executeUpdate(); // 更新 \Hs|$
~JE|f 7
3、处理执行结果 Bn-J_-%M
查询语句,返回记录集ResultSet +a]j[#
更新语句,返回数字,表示该更新影响的记录数 -SJSTO[/J
ResultSet的方法 *mV&K\_
1、next(),将游标往后移动一行,如果成功返回true;否则返回false aRKv+{K
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 k
]bPI$
Wy(pLBmb
4、释放连接 g9qC{xd
cn.close(); _j 5N=I{U
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection sPpS~wk*
nx;$dxx_Ws
可滚动、更新的记录集 9-G b"hr
1、创建可滚动、更新的Statement B+Q+0tw*i
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); =xBT>h;
该Statement取得的ResultSet就是可滚动的 !~d'{sy6
2、创建PreparedStatement时指定参数 Yzd2G,kZ=
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); OMd# ^z
ResultSet.absolute(9000); =yh3Nd:u
批量更新 3G&0Ciet
1、Statement ~@YQ,\Y
Statement sm = cn.createStatement(); wA r~<
sm.addBatch(sql1); !
o^Ic`FhS
sm.addBatch(sql2); 0l1.O2-
... i>"dBJh]b
sm.executeBatch() v?%3~XoH
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ,F}r@
2、PreparedStatement
i_y:4
PreparedStatement ps = cn.preparedStatement(sql); "!a`ygqpT
{ +@>:%yX
ps.setXXX(1,xxx); M1(9A>|nF
... 0h:G4
ps.addBatch(); iIB9j8
} \=8=wQv
ps.executeBatch(); &GU@8
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 <Cr8V'c
L"^.0*X/d
事务的处理 ~T&%
VvI
1、关闭Connection的自动提交 fD(7FN8
cn.setAutoCommit(false); |1i]L @&
2、执行一系列sql语句 |>@-grs
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close UnjNR[=
Statement sm ; C1D !
V:
sm = cn.createStatement(insert into user...);
{WKOJG+.
sm.executeUpdate(); ;24'f-Eri
sm.close(); -s89)lUkS
sm = cn.createStatement("insert into corp...); j Ii[
sm.executeUpdate(); vu ?3$
sm.close(); QxA0I+i
3、提交 s<d!+<
cn.commit(); KJ pj
4、如果发生异常,那么回滚 NGSS:
cn.rollback();