java 数据库基本操作 7 <9yH:1
1、java数据库操作基本流程 M;w?[yEZ
2、几个常用的重要技巧: G(iJi
可滚动、更新的记录集 -d+aV1n
批量更新 o:S0*
事务处理 P>i%7:OMZA
JL=U,Mr6
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 rH8@69,B
1、取得数据库连接 2I/xJ+
1)用DriverManager取数据库连接 K+*Q@R D
例子 0AK,&nbF
String className,url,uid,pwd; |re}6#TgcT
className = "oracle.jdbc.driver.OracleDriver"; j;b42G~p
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ~y HU^5D
uid = "system"; = ?D(g
pwd = "manager"; /ID3s`D)
Class.forName(className); $
_j[2EU
Connection cn = DriverManager.getConnection(url,uid,pwd); 7hP<f}xL
2)用jndi(java的命名和目录服务)方式 p)aeH`;O
例子 :bu>],d-8'
String jndi = "jdbc/db"; 6W[}$#w
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); XfPFo6
DataSource ds = (DataSource) ctx.lookup(jndi); kOOGw:/
Connection cn = ds.getConnection(); M<O{O}t<
多用于jsp中 in+}/mwfC
2、执行sql语句 ; Uc0o!1
1)用Statement来执行sql语句 j#r6b]k(Hv
String sql; Hy.AyU|L
Statement sm = cn.createStatement(); &LO"g0w
sm.executeQuery(sql); // 执行数据查询语句(select) Od+6 -J
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ,.iRnR
2)用PreparedStatement来执行sql语句 dzLQI}89+k
String sql; K<?nq0-
sql = "insert into user (id,name) values (?,?)"; '* mH*?Y
PreparedStatement ps = cn.prepareStatement(sql); Z4<L$i;/jN
ps.setInt(1,xxx); n0Y+b[+wj
ps.setString(2,xxx); dQoYCS}IaV
... )?+$x[f!*
ResultSet rs = ps.executeQuery(); // 查询 v+p{|X-
int c = ps.executeUpdate(); // 更新 Lbe\@S
rX_@Ihv'
3、处理执行结果 r/pH_@
查询语句,返回记录集ResultSet HhO".GA
更新语句,返回数字,表示该更新影响的记录数 o FjIA!
ResultSet的方法 ;iDPn2?6?x
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 21k5I #U
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 )`^p%k
^u3V
E
4、释放连接 wFG3KzEq ~
cn.close(); h -iJlm
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection !9 fz(9
P[s8JDqu
可滚动、更新的记录集 >S$Z
1、创建可滚动、更新的Statement xsWur(> ]
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); A?Bif;
该Statement取得的ResultSet就是可滚动的 t_mIOm)S%
2、创建PreparedStatement时指定参数 Bl=tYp|a
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); =zwOq(Bh W
ResultSet.absolute(9000); cuOvN"nuNj
批量更新 MZmb`%BZ
1、Statement R<B7K?SxV~
Statement sm = cn.createStatement(); n3J53| %v
sm.addBatch(sql1); ^eW}XRI
sm.addBatch(sql2); 'X shmZ0&
... 6 uKTGc4
sm.executeBatch() _X@v/sAy
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 wEzKqD
2、PreparedStatement hYawU@R
PreparedStatement ps = cn.preparedStatement(sql); ve&zcSeb
{ ca+[0w@S
ps.setXXX(1,xxx); fS^!ZPe1
... 7FRmx4(!
ps.addBatch(); a#c6[!
} >>[G1
ps.executeBatch(); ~on(3|$
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 P./VmY'
ZJlEKib%2
事务的处理 Rb\6;i8R
1、关闭Connection的自动提交 EI\9_}@,
cn.setAutoCommit(false); GguFo+YeZ
2、执行一系列sql语句 Wh&8pH:
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 3"F`ZJ]=
Statement sm ;
>0l"P"]
sm = cn.createStatement(insert into user...); +f[ED4E>'(
sm.executeUpdate(); q 4V7
sm.close(); |ae97 5
sm = cn.createStatement("insert into corp...); D-,L&R!`
sm.executeUpdate(); >MPr=W%E
sm.close(); >2By
+/!X
3、提交 w |l1'
cn.commit(); F]9nB3:W
4、如果发生异常,那么回滚 Wa?; ^T
cn.rollback();