java 数据库基本操作 OVh/t#On
1、java数据库操作基本流程 z
vYDE]
2、几个常用的重要技巧: P`%ppkzV6
可滚动、更新的记录集 *HXq`B
批量更新 X%F9.<4
事务处理 RU>vnDaC
{oJa8~P
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 4
?c1c
1、取得数据库连接 \S@A
/t6pa
1)用DriverManager取数据库连接 k?8W2fC
例子 IGqmH=-
String className,url,uid,pwd; JZnWzqFw
className = "oracle.jdbc.driver.OracleDriver"; 0Its;|
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; +8Px` v1L
uid = "system"; Vl z T
pwd = "manager"; `x#~-
Class.forName(className); i-=ff
Connection cn = DriverManager.getConnection(url,uid,pwd); O``MUb b
2)用jndi(java的命名和目录服务)方式 =!c+|X`
例子 J-ZM1HoB
String jndi = "jdbc/db"; Kk(ucO
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); cU6#^PFu
DataSource ds = (DataSource) ctx.lookup(jndi); E0hp%:
Connection cn = ds.getConnection(); s*X\%!l9
多用于jsp中 &B85;
2、执行sql语句 v}Nx*%
1)用Statement来执行sql语句 $^XPk#$m
String sql; $P@cS1sB
Statement sm = cn.createStatement(); '_<`dzz
sm.executeQuery(sql); // 执行数据查询语句(select) 3"hR:'ts
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); .#eXNyCe
2)用PreparedStatement来执行sql语句 hpyre B
String sql; 2r0!h98
sql = "insert into user (id,name) values (?,?)"; (qP$I:Q4]v
PreparedStatement ps = cn.prepareStatement(sql); R
_Y&Y-
ps.setInt(1,xxx); 8WGM%n#q
ps.setString(2,xxx); :V2Q n-N
... prs<ZxbQb
ResultSet rs = ps.executeQuery(); // 查询 Xda<TX@-
int c = ps.executeUpdate(); // 更新 iHn]yv3
#
_Kj.
3、处理执行结果 c>!J@[,
查询语句,返回记录集ResultSet V<pqc&f.
更新语句,返回数字,表示该更新影响的记录数 -Mvw'#(0
ResultSet的方法 vWovR`
1、next(),将游标往后移动一行,如果成功返回true;否则返回false htRZ}e
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 DmrfD28j~F
kC5,yj
4、释放连接 n6Zx0ad?
cn.close(); |K-lgrA
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection y
m{/0&7
~b[4'm@
可滚动、更新的记录集 O*v+<|0!l
1、创建可滚动、更新的Statement M!l5,ycF
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); D ` X6'PP
该Statement取得的ResultSet就是可滚动的 e;'T?&t
2、创建PreparedStatement时指定参数 T!A}ipqb
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); F?eb Yk1
ResultSet.absolute(9000); L
_y|l5
批量更新 NETC{:j
1、Statement c):*R ]=
Statement sm = cn.createStatement(); SkA'+(
sm.addBatch(sql1); XXcf!~uO
sm.addBatch(sql2); FxX3Pq8h
... `VE&Obp[
sm.executeBatch() P$ef,ZW"
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 o)=VPUe
2、PreparedStatement EI.Pk>ZIm
PreparedStatement ps = cn.preparedStatement(sql); =*}Mymhk(
{ 5O W(] y|
ps.setXXX(1,xxx); tQaCNS$=
... piotd,
ps.addBatch(); hUxhYOp
} 6<$|;w-OV
ps.executeBatch(); JJ0
CM:xe
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 wT=hO+
#/dde9y
事务的处理 jGhg~-m
1、关闭Connection的自动提交 B/hHkOoo
cn.setAutoCommit(false); \87J~K'
2、执行一系列sql语句 z]|[VM?4L
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close hb8XBBKR
Statement sm ; r(T/^<
sm = cn.createStatement(insert into user...); AS_+}*WSFQ
sm.executeUpdate(); _5w?v~6 5
sm.close(); N:[;E3?O
sm = cn.createStatement("insert into corp...); [5*-V^m2
sm.executeUpdate(); UjOhaj "h
sm.close(); |I5?5 J\
3、提交 s)8M? |[`I
cn.commit(); %,cFX[D/)
4、如果发生异常,那么回滚 5a!e%jj
cn.rollback();