java 数据库基本操作 i O|,,;_
1、java数据库操作基本流程 ZKPkx~,U[
2、几个常用的重要技巧: S)|b%mVwR
可滚动、更新的记录集 =T4w:
批量更新 s;WCz
事务处理 ucP MT0k
&it/@8yH
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ,6Q-k4_
1、取得数据库连接 l*H"]6cXRL
1)用DriverManager取数据库连接 n1(X%%2
例子 &)jZ|Q~
String className,url,uid,pwd; K)\gbQ|
className = "oracle.jdbc.driver.OracleDriver"; m9cT}x&j
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; r['C.S6
uid = "system"; 6|cl`}g_j
pwd = "manager"; DJ0T5VE W3
Class.forName(className); \%Q
rN+WQ
Connection cn = DriverManager.getConnection(url,uid,pwd); lB~'7r`
2)用jndi(java的命名和目录服务)方式 :]QxT8B
例子 oa !P]r
String jndi = "jdbc/db"; {=7i}xY]T
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 1^^D :tt
DataSource ds = (DataSource) ctx.lookup(jndi); S
Tk#hhx
Connection cn = ds.getConnection(); JHH&@Cn
多用于jsp中 T=dvc}
2、执行sql语句 1u+(rVQN
1)用Statement来执行sql语句 fGWK&nONyk
String sql; T["(YFCByg
Statement sm = cn.createStatement(); 7!nAWlQ&-E
sm.executeQuery(sql); // 执行数据查询语句(select) Hvo27THLo
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Y{tuaBzD
2)用PreparedStatement来执行sql语句 /y|r iW
String sql; K({,]<l5
sql = "insert into user (id,name) values (?,?)"; $Xc<K_Z
PreparedStatement ps = cn.prepareStatement(sql); ITlkw~'G
ps.setInt(1,xxx); YH9]T,
ps.setString(2,xxx); }8#Czo jt
... w/6@R 4)p
ResultSet rs = ps.executeQuery(); // 查询 j)qh>y)
int c = ps.executeUpdate(); // 更新 {U-EBXV
Mu%,@?zM^/
3、处理执行结果 Fsj[J E
查询语句,返回记录集ResultSet *G41%uz
更新语句,返回数字,表示该更新影响的记录数 ,`@|C
Z-4A
ResultSet的方法 ~U+'3.Wo
1、next(),将游标往后移动一行,如果成功返回true;否则返回false f"^tOgGH
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 U~t(YT
]bweQw@i
4、释放连接 X-FHJ4
cn.close(); Q*(o;\s
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ? d\8Q't*
Ntiz-qW
可滚动、更新的记录集 jMbK7
1K%
1、创建可滚动、更新的Statement g>zL{[e!
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); >K%x44|
该Statement取得的ResultSet就是可滚动的 -;"l5oX
2、创建PreparedStatement时指定参数 J[wXG6M
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ]]3D`
F}
ResultSet.absolute(9000); -1JHhRr]
批量更新 u`|fmVI
1、Statement A,qG*lv
Statement sm = cn.createStatement(); B4aZ3.&W
sm.addBatch(sql1); 64fG,b
sm.addBatch(sql2); `Cxe`w4
... 0{F.DDiNT
sm.executeBatch() glgk>83I+
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 {H2i+"cF
2、PreparedStatement Y\sjm]_
PreparedStatement ps = cn.preparedStatement(sql); UXHFti/A<
{ @1@WB]mQQ
ps.setXXX(1,xxx); [=+/
... ^&HYnwk
ps.addBatch(); g"Bv!9*H
} Kx0dOkE
ps.executeBatch(); 7!%"8Rl-
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 f
lB2gr^
"g-NUl`'
事务的处理 J]B5w{??b
1、关闭Connection的自动提交 `l"~"x^Rr
cn.setAutoCommit(false); {eUfwPAa3
2、执行一系列sql语句 D9en
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close mM.&c5U
Statement sm ; 9G~P)Z!0
sm = cn.createStatement(insert into user...); [dMxr9M
sm.executeUpdate(); ]XU#i#;c
sm.close(); 'zK*?= ^jk
sm = cn.createStatement("insert into corp...); q=6Y2Q
sm.executeUpdate(); 7i.aZ2a%
sm.close(); @jKB!z9{
3、提交 n4johV.#
cn.commit(); ?f..N,s
4、如果发生异常,那么回滚 <H 6Uo#ao
cn.rollback();