java 数据库基本操作 -,Oq=w*EV
1、java数据库操作基本流程 }j_2K1NS{
2、几个常用的重要技巧: ;UnJrP-if
可滚动、更新的记录集 \I[f@D-J
批量更新 N}/|B}
事务处理 Y+kfMA v
nF#1B4b>
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 |n/qJIE6
1、取得数据库连接 :,f~cdq=
1)用DriverManager取数据库连接 z5_#]:o&
例子 ]E:K8E
String className,url,uid,pwd; ,P.yl~'Al
className = "oracle.jdbc.driver.OracleDriver"; N+3]C9 2o
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; <|kS`y
uid = "system"; {: H&2iF
pwd = "manager"; s{:l yp
Class.forName(className); $.0l% $ 7
Connection cn = DriverManager.getConnection(url,uid,pwd); Ig{
3>vB
2)用jndi(java的命名和目录服务)方式 ;&2f {
例子 pFW^
String jndi = "jdbc/db"; u &qFE=5:
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 6 *GR_sMm
DataSource ds = (DataSource) ctx.lookup(jndi); zcrM3`Zh
Connection cn = ds.getConnection(); ^K]`ZQjKC
多用于jsp中 x[dR5
2、执行sql语句 (=eJceE!
1)用Statement来执行sql语句 GX\6J]x=^2
String sql; Fo: 60)Lr
Statement sm = cn.createStatement(); {S6:LsFfm
sm.executeQuery(sql); // 执行数据查询语句(select) y~'h/tjM@=
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); &&s3>D^Ta
2)用PreparedStatement来执行sql语句 ,ej89
String sql; t"Tv(W?_
sql = "insert into user (id,name) values (?,?)"; /T\'&s3D+
PreparedStatement ps = cn.prepareStatement(sql); ">|G^@|:A
ps.setInt(1,xxx); O+w82!<:
ps.setString(2,xxx); Q8GI;`Rb
... 62D UF
ResultSet rs = ps.executeQuery(); // 查询 W3E7y?
int c = ps.executeUpdate(); // 更新 +!JTEKHKH
gZ W(z
3、处理执行结果 ,CED%
查询语句,返回记录集ResultSet ~\]lMsk+
更新语句,返回数字,表示该更新影响的记录数 bSvr8FY3d
ResultSet的方法 /YrBnccqD
1、next(),将游标往后移动一行,如果成功返回true;否则返回false *2^+QKDG
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 hVe39BBtO
E-v#G~
4、释放连接 N/V~>UJ0{*
cn.close(); P
?A:0a
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection T?e(m
4 >`2vb
可滚动、更新的记录集 SsBiCctn
1、创建可滚动、更新的Statement R|g50Q
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 9=5xt;mEs}
该Statement取得的ResultSet就是可滚动的 0Bn35.K
2、创建PreparedStatement时指定参数
*m6h(8(7Z
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); bD:[r))#e
ResultSet.absolute(9000); SCq:jI
批量更新 N% !TFQf
1、Statement L}Rsg'U
Statement sm = cn.createStatement(); j0uu*)Rk
sm.addBatch(sql1); )[np{eF.k
sm.addBatch(sql2); kdW$>Jqb
... ; nc3O{rU
sm.executeBatch() Hpj7EaMZ_
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 X6-;vnlKN
2、PreparedStatement aESlbH
PreparedStatement ps = cn.preparedStatement(sql); iY;>LJmp
{ MJugno
ps.setXXX(1,xxx); vT{+Z\LL=
... }l<:^lX
ps.addBatch(); <X"_S'O
} 1haNpLfS>
ps.executeBatch(); mhW*rH*m
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ncdj/C
Y_=
]w1
事务的处理 k{C03=xk
1、关闭Connection的自动提交 yN{TcX
cn.setAutoCommit(false); {v,NNKQ4x
2、执行一系列sql语句 3XSfXS{lwP
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close aL^
58M y&
Statement sm ; t|?eNKVV9'
sm = cn.createStatement(insert into user...); r) g:-[Ox9
sm.executeUpdate(); bc]SY =
sm.close(); 7-VP)|L#G
sm = cn.createStatement("insert into corp...); 0q o]nw
sm.executeUpdate(); U28frRa
sm.close(); S1a6uE
3、提交 ht_'GBS)
cn.commit(); trz&]v=:
4、如果发生异常,那么回滚 td 5!
S]
cn.rollback();