java 数据库基本操作 rjHL06qE
1、java数据库操作基本流程 eJlTCXeZ|
2、几个常用的重要技巧: 3!ZndWSHV
可滚动、更新的记录集 A@^Y2:pY
批量更新 d#'aT mu!
事务处理 -AWL :<
i{vM NI{
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 .-Yhpw>f
1、取得数据库连接 Ksr.'
1)用DriverManager取数据库连接 ;rC)*=4#
例子 NBU[> P
String className,url,uid,pwd; wGr5V!
className = "oracle.jdbc.driver.OracleDriver";
!*5vXN
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 3=SIIMp7=
uid = "system"; )*Xd
pwd = "manager"; $)8b)Tb
Class.forName(className); gTa6%GM>
Connection cn = DriverManager.getConnection(url,uid,pwd); Y%m^V?k
2)用jndi(java的命名和目录服务)方式 KF(N=?KO
例子 FwKT_XkY
String jndi = "jdbc/db"; {N!Xp:(<7_
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); e:#c\Ay+
DataSource ds = (DataSource) ctx.lookup(jndi); D',[M)
Connection cn = ds.getConnection(); s~V%eq("}
多用于jsp中 9M8n
2、执行sql语句 _\uyS',
1)用Statement来执行sql语句 /i.3v45t"
String sql; V/"P};n
Statement sm = cn.createStatement(); ancs
sm.executeQuery(sql); // 执行数据查询语句(select) m_
>+$uL
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); HY|=Z\l"
2)用PreparedStatement来执行sql语句 ?Zu2=<DU
String sql; 9O1#%
sql = "insert into user (id,name) values (?,?)"; C{^U^>bU
PreparedStatement ps = cn.prepareStatement(sql); b}s)3=X@q
ps.setInt(1,xxx); g?-HAk6
ps.setString(2,xxx); V}_M\Y^^;
... FyY<Vx'yQ
ResultSet rs = ps.executeQuery(); // 查询 M`{~AIqd(
int c = ps.executeUpdate(); // 更新 %an"cQ
]
&Cv0oi&B
3、处理执行结果 <O+T4.z
查询语句,返回记录集ResultSet ;]XK e')
更新语句,返回数字,表示该更新影响的记录数 G>Uam TM
ResultSet的方法 pH!e<m
1、next(),将游标往后移动一行,如果成功返回true;否则返回false MOp06
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 fg}&=r
C
0@tMB7
4、释放连接 MhT.Zg\
cn.close(); ti%uyXfja
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection #ub!
OZ2YflT
可滚动、更新的记录集 NWx.l8G
1、创建可滚动、更新的Statement 33/aYy
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); g<d#zzP"T
该Statement取得的ResultSet就是可滚动的 A|Z'\D0
2、创建PreparedStatement时指定参数 o$disJ
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); CI%4!K;{
ResultSet.absolute(9000); uv>T8(w
批量更新 Vm+e%
1、Statement vQK*:IRKK
Statement sm = cn.createStatement(); X=_`$
0
sm.addBatch(sql1); H! IL5@@K
sm.addBatch(sql2); (4ueO~jb$
... yhwwF
n\
sm.executeBatch() >d1gVBhk
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 VEUdw(-?s
2、PreparedStatement 4Og&w]
PreparedStatement ps = cn.preparedStatement(sql); DSb/+8KT
{ 'Ll,HgU;
ps.setXXX(1,xxx); 6h8fzqRzc
... L&*/s&>b
ps.addBatch(); sA!,)'6
} >M1m(u84#
ps.executeBatch(); @!;EW
R]
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 0C3s
I" AgRa
事务的处理 7NG^I6WP-
1、关闭Connection的自动提交 6@N?`6Bt
cn.setAutoCommit(false); pyvZ[R9
2、执行一系列sql语句 /1s|FI$-L
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 4^|;a0Qy]
Statement sm ; ~D[5AXV`^
sm = cn.createStatement(insert into user...); L!fiW`>0G
sm.executeUpdate(); *p&c}2'
sm.close(); 8Df(|>mK
sm = cn.createStatement("insert into corp...); TttD}`\.
sm.executeUpdate(); +aa( YGL
sm.close(); =[X..<bW9:
3、提交 Yr7%C
cn.commit(); iP nu *29
4、如果发生异常,那么回滚 EUxkYl
cn.rollback();