java 数据库基本操作 ]:r(U5 #
1、java数据库操作基本流程 OQJ#>*?
2、几个常用的重要技巧: 6QYHPz
可滚动、更新的记录集 ujf]@L?
批量更新 8Q(A1U
事务处理 :\]qB&
]@6L,+W"
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 8~}~d}wW
1、取得数据库连接 }rQ0*h
1)用DriverManager取数据库连接 Gspb\HJ^
例子 pt%*Y.)az
String className,url,uid,pwd; !"LFeqI$lr
className = "oracle.jdbc.driver.OracleDriver"; )tv~N7
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; =.]{OT
uid = "system"; | Kq<}R
pwd = "manager"; aT~=<rEDy
Class.forName(className); iOB*K)U1
Connection cn = DriverManager.getConnection(url,uid,pwd); $Xr4=9(|7
2)用jndi(java的命名和目录服务)方式 {
V$}qa{P
例子
.Q!p Q"5
String jndi = "jdbc/db"; s>I~%+V.?:
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); W) ?s''WE;
DataSource ds = (DataSource) ctx.lookup(jndi); FvXpqlp
Connection cn = ds.getConnection(); n#S?fsQN
多用于jsp中 :I2spBx
2、执行sql语句 "H\R*\-0
1)用Statement来执行sql语句 B.4Or]
String sql; 98Y1-Z^ .
Statement sm = cn.createStatement(); fP/;t61Z
sm.executeQuery(sql); // 执行数据查询语句(select) #OwxxUeZ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); wCEcMVT
2)用PreparedStatement来执行sql语句 n+1`y8dy
String sql; )tx2lyY:
sql = "insert into user (id,name) values (?,?)"; 9hei8L:
PreparedStatement ps = cn.prepareStatement(sql); Ov;q]Vn>
ps.setInt(1,xxx); ?P;=_~X
ps.setString(2,xxx); J6mUU3F9f
... HBm(l@#.
ResultSet rs = ps.executeQuery(); // 查询 jG%J.u^k
int c = ps.executeUpdate(); // 更新 ()ww9L2
T}jW,Ost
3、处理执行结果 MP
p
查询语句,返回记录集ResultSet |)OC1=As
更新语句,返回数字,表示该更新影响的记录数 #!C|~=
ResultSet的方法 5^Ny6t
1、next(),将游标往后移动一行,如果成功返回true;否则返回false u/apnAW@M
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ZmvtUma
6Z5$cR_vC7
4、释放连接 TMD*-wYr
cn.close(); uBw[|,yn2*
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection c27Zh=;Tj
' L-h2
可滚动、更新的记录集 kvN<o-B
1、创建可滚动、更新的Statement Xb@dQRVX
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); +bk+0k9k5
该Statement取得的ResultSet就是可滚动的 xD9ZL
2、创建PreparedStatement时指定参数 7[1VFc#tf
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); QN;GMX5&
ResultSet.absolute(9000); r_MP[]f|0
批量更新 +4F; m_G6
1、Statement
&MBm1T|Y
Statement sm = cn.createStatement(); F$S/zh$)0
sm.addBatch(sql1); y]g5S-G
sm.addBatch(sql2); `('NH]^
... l%qfaU2
sm.executeBatch() Ckhwd
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 AZ
SaI
2、PreparedStatement ,xutI
PreparedStatement ps = cn.preparedStatement(sql); M hjIE<OI=
{ ab[V->>%
ps.setXXX(1,xxx); s$~H{za
... `)NTJc$):
ps.addBatch(); 65GC7 >[
} G+tzp&G@
ps.executeBatch(); (!a\23
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 jGYl*EBx
v}<z_i5/C.
事务的处理 Ky*xAx:
1、关闭Connection的自动提交 [$M l;K
cn.setAutoCommit(false); Yc5<Y-W
2、执行一系列sql语句 Lr Kx
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close RN$q,f[#
Statement sm ; MEOfVh
sm = cn.createStatement(insert into user...); E O "
sm.executeUpdate(); GL^
j
|1
sm.close(); Mo]iVj8~
sm = cn.createStatement("insert into corp...); }Qh%Z)
sm.executeUpdate(); q)PSHr=Z
sm.close(); yMOYTN@]
3、提交 y2PxC. -
cn.commit(); &zPM#Q
4、如果发生异常,那么回滚 u1|v3/Q-
cn.rollback();