java 数据库基本操作 z/&a\`DsU
1、java数据库操作基本流程 *[~o~e/YCb
2、几个常用的重要技巧: qq7X",s
可滚动、更新的记录集 }%FuL5Tx
批量更新 4|41^B5Y
事务处理 1
u_24
.C;_4jE
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 n,:.]3v%
1、取得数据库连接 _AB9BQm
1)用DriverManager取数据库连接 ?&<o_/`-H5
例子 c[RLYu
String className,url,uid,pwd; a(DZGQ-as
className = "oracle.jdbc.driver.OracleDriver"; Y{2d4VoW6
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; XL/o y'_
uid = "system"; rbuL@=S@*
pwd = "manager"; j484b2uj1
Class.forName(className); bb/?02*)H
Connection cn = DriverManager.getConnection(url,uid,pwd); ytV)!xe
2)用jndi(java的命名和目录服务)方式 qM!f
例子 |}p}`Mb)a
String jndi = "jdbc/db"; ~& WN)r'4y
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); eGSp(o5 6
DataSource ds = (DataSource) ctx.lookup(jndi); Z*9]:dG:!
Connection cn = ds.getConnection(); , 64t
多用于jsp中 jM1%6
2、执行sql语句 1LId_vJtJ
1)用Statement来执行sql语句 m_Ac/ctf
String sql; Ao,!z
Statement sm = cn.createStatement(); O][Nl^dl
sm.executeQuery(sql); // 执行数据查询语句(select) i$^B-
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); Q$h:[_v
2)用PreparedStatement来执行sql语句 "3i80R\w`F
String sql; _X2EBpZp
sql = "insert into user (id,name) values (?,?)"; -llx:
PreparedStatement ps = cn.prepareStatement(sql); t-7U1B}=<C
ps.setInt(1,xxx); @-&(TRbZo
ps.setString(2,xxx); w Al}:|+n
... uGUv~bE
ResultSet rs = ps.executeQuery(); // 查询 hKZ`DB4
int c = ps.executeUpdate(); // 更新 ,WB_C\.#XN
Z-h7
3、处理执行结果 +5t
bK
查询语句,返回记录集ResultSet Ds%&Mi
更新语句,返回数字,表示该更新影响的记录数 sId(PT^
ResultSet的方法 uQu/(5
1、next(),将游标往后移动一行,如果成功返回true;否则返回false z(`
}:t
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 bA<AG*
\aVY>1`
4、释放连接 z'oiyXEE3
cn.close(); ){
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection }uI7\\S
#3Ej0"A@-B
可滚动、更新的记录集 !H1tBg]5
1、创建可滚动、更新的Statement rx6-~0!eI=
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); .Y(lB=pV
该Statement取得的ResultSet就是可滚动的 Z2rzb{oS}
2、创建PreparedStatement时指定参数 f7Df %&d
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 4d e]?#=
ResultSet.absolute(9000); t.E4Tqzc>
批量更新 Yb%-tv:
1、Statement .-KtB(t
Statement sm = cn.createStatement(); ]KXMGH_
sm.addBatch(sql1); 8L-4}!~C
sm.addBatch(sql2); "<w2v'6S
... M .)}e7
sm.executeBatch() ^6aS]t
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 *K,hrpYR
2、PreparedStatement
$' (QTEM
PreparedStatement ps = cn.preparedStatement(sql); ) Kc%8hBv
{ *m$PH"
ps.setXXX(1,xxx); MZ5Y\-nq\
... BU9J_rCIv
ps.addBatch(); -!|WZ
} :GQIlA8cF$
ps.executeBatch(); .5Knb c
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 )XP#W|;
-.{oqs$
事务的处理 4N~+G `
1、关闭Connection的自动提交 ,'C30 A*p
cn.setAutoCommit(false); v.Xoq
2、执行一系列sql语句 $Eio$TI
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close JYwyR++uo
Statement sm ; >sQ2@"y)s2
sm = cn.createStatement(insert into user...); eB=v~I3
sm.executeUpdate(); a(@p0YpKT
sm.close(); =9pw uH
sm = cn.createStatement("insert into corp...); Pknc[h},
sm.executeUpdate(); |As2"1_f
sm.close(); bR`rT4.F
3、提交 JAlU%n?R
cn.commit(); U~*c#U"bh
4、如果发生异常,那么回滚 iUI y,Y
cn.rollback();