java 数据库基本操作 ~fXNj-'RW
1、java数据库操作基本流程 w S
2、几个常用的重要技巧: B{Cm`f8E
可滚动、更新的记录集 R$:-~<O
批量更新 F-;J N
事务处理 O/~T+T%
FQWjL>NB
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 UFB|IeX?q
1、取得数据库连接 YgEd%Z%4
1)用DriverManager取数据库连接 /~"-q
例子 .eJKIck
String className,url,uid,pwd; Vl5r~+$|
className = "oracle.jdbc.driver.OracleDriver"; Igo`\JY
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 5U?O1}P
uid = "system"; QV[&2&&^<<
pwd = "manager"; |O8e;v72g^
Class.forName(className); mIlg=8:
Connection cn = DriverManager.getConnection(url,uid,pwd); } 9@rhW
2)用jndi(java的命名和目录服务)方式 ^%\a,~
例子 ,+i^]yF3j
String jndi = "jdbc/db"; nDrRK
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); RZz?_1'
DataSource ds = (DataSource) ctx.lookup(jndi); Il=6t
Connection cn = ds.getConnection(); 2"6L\8hd2
多用于jsp中 oiyvKMHz7
2、执行sql语句 QytO0K5
1)用Statement来执行sql语句 ?1\5X<|,
String sql; k5RzW4zq;
Statement sm = cn.createStatement(); SzLlJUV X
sm.executeQuery(sql); // 执行数据查询语句(select) HYl+xH'.j
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); %pZT3dcK
2)用PreparedStatement来执行sql语句 "@x(2(Y&
String sql; +wQ5m8E
sql = "insert into user (id,name) values (?,?)"; Ec7xwPk
PreparedStatement ps = cn.prepareStatement(sql); A+/Lt>+AS
ps.setInt(1,xxx); \9+,ynJH8z
ps.setString(2,xxx); dX?j/M-
... G]B0LUT6c
ResultSet rs = ps.executeQuery(); // 查询 >\JPX
int c = ps.executeUpdate(); // 更新 oIrc))j,$
ckX8eg!f
3、处理执行结果 L91(|gQP
查询语句,返回记录集ResultSet HG7Qdw2+O
更新语句,返回数字,表示该更新影响的记录数 dz#"9i5b
ResultSet的方法 oCo~,~kTR
1、next(),将游标往后移动一行,如果成功返回true;否则返回false .\bJ,of9
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 dOD(<
lr&2,p<
4、释放连接 AG >D,6Y
cn.close(); tN{0C/B9
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection l&H-<Z.8m
{A}T^q!m]
可滚动、更新的记录集 <(E)M@2
1、创建可滚动、更新的Statement uz8eS'8
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); i?_Q@uA~<:
该Statement取得的ResultSet就是可滚动的 =o@}~G&HA
2、创建PreparedStatement时指定参数 rbf5~sw&8+
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); mpYBMSLM
ResultSet.absolute(9000); L'y0$
批量更新 " lD -*e4
1、Statement zZ}.2He8
Statement sm = cn.createStatement(); Wi$?k{C
sm.addBatch(sql1); QmBHD;Gf
sm.addBatch(sql2); t(}Y /'
... 9ERdjS
sm.executeBatch() 5T/+pC$e=
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 XzAXcxC6G
2、PreparedStatement 3\2&?VAjR
PreparedStatement ps = cn.preparedStatement(sql); >(:3H+
{ 55v=Ij?M
ps.setXXX(1,xxx); TrDTay
... IiKU=^~w
ps.addBatch(); B)k/]vz)*D
} !5 S#
ps.executeBatch(); e\z,^
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 0Y`+L6&UX
|f}wOkl
事务的处理 `c:r`Oi?
1、关闭Connection的自动提交 ZZi9<g1
cn.setAutoCommit(false); 6X ]I`e
2、执行一系列sql语句 eI|FrBq%
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close z{.&sr>+v
Statement sm ; D*L@I@
[
sm = cn.createStatement(insert into user...); nR%w5oe
sm.executeUpdate(); ;zqxDl_
sm.close(); Vb 36R_u
sm = cn.createStatement("insert into corp...); 8\il~IFyi
sm.executeUpdate(); :MDFTw~ |
sm.close(); w[2E:Nj
3、提交 1sUgjyGQ
cn.commit(); zRh)q,Dt
4、如果发生异常,那么回滚 $zz4A~
cn.rollback();