java 数据库基本操作 esHQoIhd
1、java数据库操作基本流程 I
j$lDJS
2、几个常用的重要技巧: 5Q 'i2*j
可滚动、更新的记录集 zfwS
批量更新 &BtK($
事务处理 N.4q.
549jWG
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ?Q-h n:F)
1、取得数据库连接 mk3_
1)用DriverManager取数据库连接 /;tPNp{!dw
例子 NM0tp )h
String className,url,uid,pwd; ZxlAk+<]
className = "oracle.jdbc.driver.OracleDriver"; aB]m*~
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; <)\y#N
uid = "system"; 7lS#f1E
pwd = "manager"; p/2jh&
Class.forName(className); {@<J_A
Connection cn = DriverManager.getConnection(url,uid,pwd); &f7fK|}
2)用jndi(java的命名和目录服务)方式 Fe.t/amS/
例子 "dROb}szn
String jndi = "jdbc/db";
bu=?N
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); QT9n,lX
DataSource ds = (DataSource) ctx.lookup(jndi); N? 5x9duK
Connection cn = ds.getConnection(); =7m}yDs6$
多用于jsp中 Q 2A7mGN
2、执行sql语句 i~3u>CT
1)用Statement来执行sql语句 N<QjdD&
String sql; DhX#E&
Statement sm = cn.createStatement(); ,o^y`l
sm.executeQuery(sql); // 执行数据查询语句(select) 01T`Flz
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); M;0]u.D*=
2)用PreparedStatement来执行sql语句 fZxIY,
String sql; U,+[5sbo
sql = "insert into user (id,name) values (?,?)"; Fbu5PWhlc
PreparedStatement ps = cn.prepareStatement(sql); RN)dS>$
ps.setInt(1,xxx); 3SSm5{197
ps.setString(2,xxx); .e'eE
... 6Z`R#d #I
ResultSet rs = ps.executeQuery(); // 查询 w~#nYM=fP!
int c = ps.executeUpdate(); // 更新 -tnQCwq#
.<z!3O&L
3、处理执行结果 dgDy5{_
查询语句,返回记录集ResultSet xl"HotsX-x
更新语句,返回数字,表示该更新影响的记录数 0QvT
ResultSet的方法 ,=aJVb=C
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ifo7%XPcg
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 5OO'v07b
RJy=pNztm
4、释放连接 VR
cn.close(); ltkI}h,e
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection S}f?.7
=CL}
$_
可滚动、更新的记录集 1yV: qp
1、创建可滚动、更新的Statement 4O:W#bx
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); <$N"q
该Statement取得的ResultSet就是可滚动的 uNn[[LS
2、创建PreparedStatement时指定参数 :K
~
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); oQv3GpO
ResultSet.absolute(9000); \}~s2Y5j
批量更新 Y-'78BJk
1、Statement 0<PR+Iv*i
Statement sm = cn.createStatement(); }<z_Q_b+e
sm.addBatch(sql1); i5>+}$1
sm.addBatch(sql2); 5@hNnh16
... O$kq`'9
sm.executeBatch() peJKNX.!q
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 []0mX70N
2、PreparedStatement 6l$L~>
PreparedStatement ps = cn.preparedStatement(sql); N$xtHtz8"
{ SxK:]Aw
ps.setXXX(1,xxx); \uME+NF
... +[J/Zw0{
ps.addBatch(); Fkf97Oi
} BYY RoE[P
ps.executeBatch(); :L_BG)dM
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 aF|d^
`z0{S!
事务的处理 XE3'`D!
1、关闭Connection的自动提交 ,Rx{yf]k
cn.setAutoCommit(false); dq IlD!
2、执行一系列sql语句 eZr&x~]
-w
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close =<@\,xN>C
Statement sm ; UZEI:k,dv
sm = cn.createStatement(insert into user...); x f4{r+
sm.executeUpdate(); $
n,Z
sm.close(); F`nb21{0y&
sm = cn.createStatement("insert into corp...); cst}Ibfi
sm.executeUpdate(); 9s}Kl($
sm.close(); ](eN@Xi&@
3、提交 ^`SA'F,
cn.commit(); )2DQ>cm
4、如果发生异常,那么回滚 XhdSFxW}
cn.rollback();