java 数据库基本操作 n NAJ8z}Nt
1、java数据库操作基本流程 6g$+ ))g
2、几个常用的重要技巧: iPE-j#|
可滚动、更新的记录集 23Eg|Xk
批量更新 >O~xu^N?
事务处理 -[+FVvS
aIkxN&
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 d[ {=/~0
1、取得数据库连接 xXLKL6F(\
1)用DriverManager取数据库连接 $BNn 1C8[
例子 bZa?h.IF
String className,url,uid,pwd; ]jM D'vg^b
className = "oracle.jdbc.driver.OracleDriver"; KxiZx I
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; M"~B_t,Nw
uid = "system"; &0Nd9%>
pwd = "manager"; /@on=~
Class.forName(className); >R.~'A/$F
Connection cn = DriverManager.getConnection(url,uid,pwd); ;/ p)vR
2)用jndi(java的命名和目录服务)方式 }<S|_F
例子 bp5hS/A^1w
String jndi = "jdbc/db"; mA{gj[@:x
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); R[o KhU
DataSource ds = (DataSource) ctx.lookup(jndi); ' Bdvqq
Connection cn = ds.getConnection(); @ /c{gD
多用于jsp中 `SOaQ|H
2、执行sql语句 hj9bMj
1)用Statement来执行sql语句 x~KS;hA
String sql; <;W4Th<4
Statement sm = cn.createStatement(); (A"oMnjWd
sm.executeQuery(sql); // 执行数据查询语句(select) vW~_+:),e
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); r?H {Y3,
2)用PreparedStatement来执行sql语句 4?8GK
String sql; )v'3pTs2
sql = "insert into user (id,name) values (?,?)"; DfqXw^BKD
PreparedStatement ps = cn.prepareStatement(sql); m@"!=CTKd
ps.setInt(1,xxx); 1eKJ46W
ps.setString(2,xxx); e?F r/n
... X/'B*y'=U
ResultSet rs = ps.executeQuery(); // 查询 ?jb7Oq#[
int c = ps.executeUpdate(); // 更新 LgB}!OLQ
q-p4k`]
3、处理执行结果 R:OoQ^c
查询语句,返回记录集ResultSet 6eQrupa
更新语句,返回数字,表示该更新影响的记录数 T*'5-WV|3t
ResultSet的方法 NW^}u~-f
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ;Q-sie(#
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 mo<g'|0
hZ$* sf
4、释放连接 l*pCG`@J#
cn.close(); v]vrD2L
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection .\<
\J|3
`/Z8mFs Y
可滚动、更新的记录集 ~d>O.*Q)
1、创建可滚动、更新的Statement w[loV
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); JQI`9$asuC
该Statement取得的ResultSet就是可滚动的 ijC;"j/(
2、创建PreparedStatement时指定参数 OB5{EILej
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); At.WBa3j%{
ResultSet.absolute(9000); CYG'W FvZZ
批量更新 I%pQ2T$;
1、Statement @bS>XWI>
Statement sm = cn.createStatement(); ~H?RHYP~
sm.addBatch(sql1); Cc9<ABv?
sm.addBatch(sql2); Bg;bBA!L
... Y|KX:9Y@
sm.executeBatch() Jtc?p{
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 h]G}E9\l
2、PreparedStatement vFy/
PreparedStatement ps = cn.preparedStatement(sql); R"K{@8b
{ W~R_-
]k@g
ps.setXXX(1,xxx); 2<YHo{0BLS
... lD\lFN(:
ps.addBatch(); #& Rx(
} rHN>fySn7
ps.executeBatch(); g'hBs
D1'
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Hk$|.TjzI
RrGS$<
事务的处理 _MnMT9
1、关闭Connection的自动提交 kU4Zij-O
cn.setAutoCommit(false); ;Mw9}Reh@
2、执行一系列sql语句 '[:].?M
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close {. eC"
Statement sm ; nhQ.U>&-M
sm = cn.createStatement(insert into user...); k'
pu%nWN
sm.executeUpdate(); (#7pGGp*E
sm.close(); w QwY_ _
sm = cn.createStatement("insert into corp...); N4'b]:`n
sm.executeUpdate(); vy6NH5Q
sm.close(); hF!yp7l;
3、提交 p8o%H-Xk
cn.commit(); }?8KFe7U
4、如果发生异常,那么回滚 M[HPHNsA&
cn.rollback();