java 数据库基本操作 MkL)
1、java数据库操作基本流程 R
RE8|%p;B
2、几个常用的重要技巧: dU#-;/}o
可滚动、更新的记录集 CLTkyS)C
批量更新 _jc_(;KPF
事务处理 O%3Hp.|!
<PVwf`W.
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 |UlG@Mn
1、取得数据库连接 o@BV&|
1)用DriverManager取数据库连接 !> =ybRe
例子 64mg :ed&
String className,url,uid,pwd; 8IA1@0n&
className = "oracle.jdbc.driver.OracleDriver"; /)T~(o|i
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Cs_&BSs
uid = "system"; }jUsv8`}8R
pwd = "manager"; f~F{@),acZ
Class.forName(className); _1NK9dp:
Connection cn = DriverManager.getConnection(url,uid,pwd); 'zM=[#!B
2)用jndi(java的命名和目录服务)方式 LFI#wGhXVk
例子 a}uYv:
String jndi = "jdbc/db"; ^DN:.qQ
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 8L,=E ap
DataSource ds = (DataSource) ctx.lookup(jndi); FieDESsX>
Connection cn = ds.getConnection(); >MGWN
多用于jsp中 c}+*$DeT
2、执行sql语句 *5 +GJWKN
1)用Statement来执行sql语句 g@37t @I
String sql; <|3%}?
Statement sm = cn.createStatement(); 'f!U[Qatg
sm.executeQuery(sql); // 执行数据查询语句(select) NJ)Dw`|%|)
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); ~_-]>
SI
2)用PreparedStatement来执行sql语句 jM&di
String sql; ;F#(:-:
sql = "insert into user (id,name) values (?,?)"; F~8'3!<9
PreparedStatement ps = cn.prepareStatement(sql); R0}1:1}$Sn
ps.setInt(1,xxx); WFiX=@SS
ps.setString(2,xxx); s(nT7x+W
... :{2~s
ResultSet rs = ps.executeQuery(); // 查询 VJ=>2'I
int c = ps.executeUpdate(); // 更新 Km;}xke6
00.x*v
3、处理执行结果 JwB'B
查询语句,返回记录集ResultSet At"$Cu!k
更新语句,返回数字,表示该更新影响的记录数 HT6 [Z1
ResultSet的方法 #n'.a1R
1、next(),将游标往后移动一行,如果成功返回true;否则返回false
v&|65[<
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 `Bw]PO
"bIb?e2h9G
4、释放连接 X+C*+k,z
cn.close(); a8f#q]TyQ
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection %\v8FCb
?0_<u4
可滚动、更新的记录集 VD~5]TQ
1、创建可滚动、更新的Statement \4L ur
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 0eNdKE
该Statement取得的ResultSet就是可滚动的 %W"u4
NT7
2、创建PreparedStatement时指定参数 uMEM7$o
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); vY-CXWC7
ResultSet.absolute(9000); \ dFE.4
批量更新 0k5-S~_\
1、Statement @^<odmM
Statement sm = cn.createStatement(); \y5lYb,*c_
sm.addBatch(sql1); jZ|M$I3*
sm.addBatch(sql2); B=!!R]dxA
... K9lekevB
sm.executeBatch() ZQ]qJDk
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 mUa#sTm
2、PreparedStatement Ifn|wrx;g
PreparedStatement ps = cn.preparedStatement(sql); d 2d-Mk
{ 393c |8M
ps.setXXX(1,xxx); Zp>v
... Y
{^*y
ps.addBatch(); tL$,]I$1+
} Z0fa;%:
ps.executeBatch(); AP=h*1udk
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 =P]Z"Ok
*O
:JECKU
事务的处理 .;]WcC<3
1、关闭Connection的自动提交 pL"{Uqi
cn.setAutoCommit(false); x
;|HT
2、执行一系列sql语句 :QGkYJ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close oFj_o
Statement sm ; ^e8xg=8(
sm = cn.createStatement(insert into user...); 2%sZaM
sm.executeUpdate(); (dq_,LI
sm.close(); =/Gd<qz3
sm = cn.createStatement("insert into corp...); . vb##D
sm.executeUpdate(); -N*[f9EJB
sm.close(); m ol,iM*l
3、提交 zr/v .$<
cn.commit(); Y"H`+UV
4、如果发生异常,那么回滚 hSm?Z!+
cn.rollback();