java 数据库基本操作 Y4+]5;B8
1、java数据库操作基本流程 =w3 cF)&
2、几个常用的重要技巧: e)y+]
可滚动、更新的记录集 /#z"c]#
批量更新 =te4p@
事务处理 di(H-=9G62
r0@s3/
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 k8!:`jG
1、取得数据库连接 ,rjl|F*
T
1)用DriverManager取数据库连接 2*< PmKI
例子 dV{mmHL
String className,url,uid,pwd; l<qEX O
className = "oracle.jdbc.driver.OracleDriver"; njaKU?6%d2
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; *+k
yuY J
uid = "system"; OrF.wcg
pwd = "manager"; jZQ{XMF
Class.forName(className); P'o]#Az
Connection cn = DriverManager.getConnection(url,uid,pwd); CED[\n
2)用jndi(java的命名和目录服务)方式 1>/ iYf
例子 v$xurj:v#i
String jndi = "jdbc/db"; =4sx(<
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); /x)i}M)
DataSource ds = (DataSource) ctx.lookup(jndi); Yhz Dw8f
Connection cn = ds.getConnection(); iUFG!,+d
多用于jsp中 x:Q$1&3N
2、执行sql语句 xSm~V3bc
1)用Statement来执行sql语句 &JYkh >
String sql; /6F\]JwU
Statement sm = cn.createStatement(); 7[mP@ {
sm.executeQuery(sql); // 执行数据查询语句(select) kT]jJbb"
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ]0O3kiVQ
2)用PreparedStatement来执行sql语句
.<E7Ey#
String sql; upaQoX/C
sql = "insert into user (id,name) values (?,?)"; ;<GK{8
PreparedStatement ps = cn.prepareStatement(sql); {>PEl;,-
ps.setInt(1,xxx); *7=`]w5k1
ps.setString(2,xxx); PJ=| g7I
... r,3\32[?
ResultSet rs = ps.executeQuery(); // 查询 `Z#':0Z
int c = ps.executeUpdate(); // 更新 /MMnW$)
#C'E'g0
3、处理执行结果 I5Ty@J#
查询语句,返回记录集ResultSet pN_%>v"o
更新语句,返回数字,表示该更新影响的记录数 (.i wD&
ResultSet的方法 sIbPMu`&U
1、next(),将游标往后移动一行,如果成功返回true;否则返回false O)DAYBv^
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Wsp c;]&
;" D~F
4、释放连接 7z$bCO L=S
cn.close(); *FC|v0D
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Q"uK6ANp'
&*E! %57
可滚动、更新的记录集 L7n G5i
1、创建可滚动、更新的Statement u\MxQIo'u
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); '@
p464
该Statement取得的ResultSet就是可滚动的 :xTm-L
2、创建PreparedStatement时指定参数 }I MV@z B
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ;y{(#X#
ResultSet.absolute(9000); ?S9vYaA$
批量更新 k
]T
1、Statement .XkD2~;
Statement sm = cn.createStatement(); +sTPTCLE
sm.addBatch(sql1); =y(*?TZH
sm.addBatch(sql2); H+5+;`;
... p] N/]2rR
sm.executeBatch() @h_ bXo
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 DUH DFG
2、PreparedStatement "'GhE+>Z
PreparedStatement ps = cn.preparedStatement(sql); DF>tQ
{ 19-V;F@;
ps.setXXX(1,xxx); m`n~-_
... SjY|aW+wAL
ps.addBatch();
H:9G/Nev
} fYzP4
ps.executeBatch(); p@Cas
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 XPZ8*8JL
R/Z7}Q W
事务的处理
hSXJDT2
1、关闭Connection的自动提交 ?=^\kXc[
cn.setAutoCommit(false); VXlAK(
2、执行一系列sql语句 [Y?Y@x"MZ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ms!|a_H7r
Statement sm ; 6`G8 UDK>F
sm = cn.createStatement(insert into user...); $.:x3TsA
sm.executeUpdate(); %3|/t-US
sm.close(); !*HJBZ]q
sm = cn.createStatement("insert into corp...); TI<3>R
sm.executeUpdate(); !f&hVLs0
sm.close(); ^E Rdf2
3、提交 Y"r728T`K
cn.commit(); >M!LC
4、如果发生异常,那么回滚 lUA-ug! ^
cn.rollback();