java 数据库基本操作 7p~@S4
1、java数据库操作基本流程 sN;U,{
2、几个常用的重要技巧: +$v$P!),
可滚动、更新的记录集 Q)Ppx 7)
批量更新 NIYAcLa@n8
事务处理 XKR?vr7A2
3g5i5 G\
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 qed;
UyN
1、取得数据库连接 =Qz8"rt#
1)用DriverManager取数据库连接 "E'OPR
例子 Xbap'/t
String className,url,uid,pwd; |5Z@7
className = "oracle.jdbc.driver.OracleDriver"; ff{ESFtD
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; `T~M:\^D
uid = "system"; ^:DlrI$
pwd = "manager"; -
+>~
Class.forName(className); 9g 2x+@5T^
Connection cn = DriverManager.getConnection(url,uid,pwd); =fRP9`y
2)用jndi(java的命名和目录服务)方式 -`Z5#8P
例子 X}?cAo2N
String jndi = "jdbc/db"; op"Cc
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); }uZhoA
DataSource ds = (DataSource) ctx.lookup(jndi); hL8QA!
Connection cn = ds.getConnection(); q Rtgk
多用于jsp中 .[CXW2k
2、执行sql语句 4>,
<b1Y
1)用Statement来执行sql语句 S&]JY
String sql; QtX ->6P>
Statement sm = cn.createStatement(); .11iulQ
sm.executeQuery(sql); // 执行数据查询语句(select) m_St"`6 .
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); <27e7H*6
2)用PreparedStatement来执行sql语句 7dW9i7Aj
String sql; (s"_NU j6
sql = "insert into user (id,name) values (?,?)"; E8?Q>%_
PreparedStatement ps = cn.prepareStatement(sql); BD9` +9
ps.setInt(1,xxx); ;((gmg7,
ps.setString(2,xxx); L5eaQu
... 27Lya!/
ResultSet rs = ps.executeQuery(); // 查询 h`5au<h<
int c = ps.executeUpdate(); // 更新 Q_@
Z.{
~ae68&L6
3、处理执行结果 GR|Vwxs<@P
查询语句,返回记录集ResultSet p6jR,m8S
更新语句,返回数字,表示该更新影响的记录数 i:W
oT4
ResultSet的方法 D0-C:gz
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Q}]Q0'X8
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 =3& WH0
}3vB_0[r
4、释放连接 &jg,8
cn.close(); JfC.U,7Nc
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ,ZH)[P)5P
"-I>
可滚动、更新的记录集 ImvkB~8N
1、创建可滚动、更新的Statement 6,oi(RAf
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); a2x2N_\=/D
该Statement取得的ResultSet就是可滚动的 mu:Q2t^
2、创建PreparedStatement时指定参数 9hLPo
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ;qzCoe
ResultSet.absolute(9000); # Dy;x\a
批量更新 fC(lY4,H3R
1、Statement s7&%_!4
Statement sm = cn.createStatement(); } |sP;Rpu
sm.addBatch(sql1); *D`,z3/*
sm.addBatch(sql2); ~6@~fhu
... auS$B%
sm.executeBatch() AbfLV942
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 f^0vkWI2
2、PreparedStatement }3N8EmS
PreparedStatement ps = cn.preparedStatement(sql); lOZ.{0{f,
{ A0&~U0*(~
ps.setXXX(1,xxx); ~;U!?
... &_!BMzp4
ps.addBatch(); >~XX'}
} o F@{&
ps.executeBatch(); >Z>*Iz,LP
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ( 6r9y3'
^=W%G^jJy
事务的处理 rWa7"<`p
1、关闭Connection的自动提交 m*["
cn.setAutoCommit(false); M0_K%Z(zaR
2、执行一系列sql语句 (4b&}46
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Tk+\Biq
Statement sm ; ,g^Bu{?
sm = cn.createStatement(insert into user...); nA+[[(6
sm.executeUpdate(); S:
/ShT
sm.close(); 9}3W0F;
sm = cn.createStatement("insert into corp...); /$ L;m
sm.executeUpdate(); `[Lap=.'.
sm.close(); -4X,x
3、提交 v "oO
cn.commit(); J!S3pS5j
4、如果发生异常,那么回滚 7b
Gzun&
cn.rollback();