java 数据库基本操作 cHo@F!{o=
1、java数据库操作基本流程 O?\UPNb:K
2、几个常用的重要技巧: j11FEE<W
可滚动、更新的记录集 sNB*S{
批量更新 vd<r}3i*
事务处理 X!H[/b:1O
@jh\yj rW
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ]JDKoA{S0
1、取得数据库连接 <14,xYpE
1)用DriverManager取数据库连接 [0c7fH`8V
例子 wHx@&Tp
String className,url,uid,pwd; JTGA\K
className = "oracle.jdbc.driver.OracleDriver"; /B"FGa04p(
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; g
Va;!
uid = "system"; (sM$=M<$
pwd = "manager"; B|9[DNd
Class.forName(className); W5i{W'
Connection cn = DriverManager.getConnection(url,uid,pwd); p>M8:,
2)用jndi(java的命名和目录服务)方式 m\*;Fx
例子 f2h`bO
String jndi = "jdbc/db"; Ln-UN$2~F
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); M2Q*#U>6r
DataSource ds = (DataSource) ctx.lookup(jndi); L#h uTKX}
Connection cn = ds.getConnection(); JG^fu*K
多用于jsp中 wFbw3>'a9
2、执行sql语句 `-_kOxe3
1)用Statement来执行sql语句 PFR64HK2
String sql; OVq(ulwi+
Statement sm = cn.createStatement(); 2/o_,k
sm.executeQuery(sql); // 执行数据查询语句(select) ^*?mb)
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); O q3aboAt
2)用PreparedStatement来执行sql语句 D[jPz0
String sql; \B/!}Tn;
sql = "insert into user (id,name) values (?,?)"; zX]4DLl,
PreparedStatement ps = cn.prepareStatement(sql); 9}-;OJe
ps.setInt(1,xxx); ( JMk0H3u
ps.setString(2,xxx); Gx)U~L$B
... =;L44.,g
ResultSet rs = ps.executeQuery(); // 查询 A4K8DP
int c = ps.executeUpdate(); // 更新 eewlK]
'kuLkM,
3、处理执行结果 o?,c#g
查询语句,返回记录集ResultSet FTgqE@
更新语句,返回数字,表示该更新影响的记录数 $sILCn
ResultSet的方法 k'6x_
G
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 8kdJ;%^N
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 2^aXXPC
2xxw8_~C
4、释放连接 P>U7RX
e
cn.close(); 5,_DM
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection e^=b#!}-5:
=|+%^)E
可滚动、更新的记录集
KP@bz
1、创建可滚动、更新的Statement \d)HwO
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); R6cd;| fan
该Statement取得的ResultSet就是可滚动的 $G<!+^T
2、创建PreparedStatement时指定参数 } *:H\GL
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); tUGnp'r
ResultSet.absolute(9000); m'n<.1;1{j
批量更新 YMG~k3Yb
1、Statement X_HU?Q_N
Statement sm = cn.createStatement(); :DG7Z
sm.addBatch(sql1); PenkqDc}
sm.addBatch(sql2); m!-R}PQC
... ]]Fe:>
sm.executeBatch() S^Mx=KJG
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 V}aZ}m{J
2、PreparedStatement zhZ!!b^6<
PreparedStatement ps = cn.preparedStatement(sql); a&z$4!wQB
{ mI>=S
ps.setXXX(1,xxx); 9Zj9e
... -|DBO0q
ps.addBatch(); pqF!1
} }PUY~
u
ps.executeBatch(); STjk<DP(
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 'z9}I
#
Mp`!zwR
事务的处理 [QDM_n
1、关闭Connection的自动提交 a{
p1Yy-]
cn.setAutoCommit(false); X..<U}e
2、执行一系列sql语句 {>Yna"p
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close DCP
B9:u
Statement sm ; Lk lD^AJA
sm = cn.createStatement(insert into user...); b"JX6efnN
sm.executeUpdate(); h+DK
.$
sm.close(); c#zx" ,K
sm = cn.createStatement("insert into corp...); QTIC5cl,
sm.executeUpdate(); !d
Z:Ih.[{
sm.close(); [R0E4A?M
3、提交 <4:%M
cn.commit(); q[TGEgG
4、如果发生异常,那么回滚 D KRF#*[=d
cn.rollback();