java 数据库基本操作 c <Fr^8
1、java数据库操作基本流程 ~qT5F)$B-
2、几个常用的重要技巧: b"iPuN!p
可滚动、更新的记录集 ;<hLy(@
批量更新 yH/m@#
事务处理 _TEjB:9eY
R.^
Y'TLyc
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 dg-nv]7
1、取得数据库连接 j`7q7}
1)用DriverManager取数据库连接 Bq@_/*'*Y
例子 u7L&cx
String className,url,uid,pwd; gM>geWB<
className = "oracle.jdbc.driver.OracleDriver"; ^ZuwUuuf
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ebfT%_N
uid = "system"; grrM[Y7#~b
pwd = "manager"; ZW7z[,tk<.
Class.forName(className); nHyqfd<V>
Connection cn = DriverManager.getConnection(url,uid,pwd); ^ZP
$(a4
2)用jndi(java的命名和目录服务)方式 4MUN1/DId`
例子 stQRl_('
String jndi = "jdbc/db"; VUmf;~
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); &L`^\B]k|
DataSource ds = (DataSource) ctx.lookup(jndi); VH M&Y-G
Connection cn = ds.getConnection(); kn%i#Fz
多用于jsp中 6
);8z!+
2、执行sql语句
8}C_/qeM
1)用Statement来执行sql语句 #83`T&Xw*
String sql; 7x#QkImQ
Statement sm = cn.createStatement(); 17la/7l<
sm.executeQuery(sql); // 执行数据查询语句(select) ]-g9dV_[>j
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 4 '"C8vw.
2)用PreparedStatement来执行sql语句 (P'{A>aHl0
String sql; Ui|z#{8&
sql = "insert into user (id,name) values (?,?)"; }ff+RGxLIG
PreparedStatement ps = cn.prepareStatement(sql); \w#)uYK{i_
ps.setInt(1,xxx); +adwEYRrr
ps.setString(2,xxx); FNlS)Bs
... '-X[T}
ResultSet rs = ps.executeQuery(); // 查询 Q-<h)WTA
int c = ps.executeUpdate(); // 更新 ~
kwS`
}iIZA>eF
3、处理执行结果 C2
4"H|D
查询语句,返回记录集ResultSet #K&XY6cTj
更新语句,返回数字,表示该更新影响的记录数 )[wB:kG
ResultSet的方法 z|bAZKSRYx
1、next(),将游标往后移动一行,如果成功返回true;否则返回false H Q :Y:
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 4g+Dp&U
=aB c.PJ^
4、释放连接 "o)jB~:L
cn.close(); |tN:o=
6
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection hg7^#f95u
Zz/
z7~{
可滚动、更新的记录集 *q; u%; 4
1、创建可滚动、更新的Statement Nnx dO0X
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); t#d{hEr
该Statement取得的ResultSet就是可滚动的 8Wba Hw_
2、创建PreparedStatement时指定参数 Uz=OTM
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); \r1nMw 3&
ResultSet.absolute(9000); LIE5of
批量更新 d0V*[{
1、Statement w~4T.l#1
Statement sm = cn.createStatement(); I9Lt>*
sm.addBatch(sql1); "O~7s}
sm.addBatch(sql2); @)XR
... u.ej<Lo
sm.executeBatch() QpCTHpZ
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 uN&UYJ'B
2、PreparedStatement U0=: `G2l
PreparedStatement ps = cn.preparedStatement(sql); qr4.s$VGs*
{ 1R,SA:L$
ps.setXXX(1,xxx); # Rhtaq9
... x7GYWK
9
ps.addBatch(); ]w0_!Z&
} [2{2w68D!
ps.executeBatch(); p~WX\;
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 "^Vnnb:Z*o
&6e A.
事务的处理 .;F%k,!v
1、关闭Connection的自动提交 zJ)`snN|
cn.setAutoCommit(false); t|P+^SL
2、执行一系列sql语句 6L"b O'_5K
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close !&},h=
Statement sm ; G5hf m-
sm = cn.createStatement(insert into user...); }Qa
sm.executeUpdate(); H1c>3c
sm.close(); KwNOB _
sm = cn.createStatement("insert into corp...); 0SR[)ma
sm.executeUpdate(); s2`} ~
sm.close(); -e O>d}
3、提交 U1Y0G[i)
cn.commit(); L"RE[" m
4、如果发生异常,那么回滚 O{x-9p
cn.rollback();