java 数据库基本操作 4H
4W
1、java数据库操作基本流程 s0D,n1x
2、几个常用的重要技巧: R k'5L
可滚动、更新的记录集 4DLp+6zP
批量更新 Dqxtc|vo
事务处理 KH=4A-e,0
/i!3Fr"
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ko7*9`
1、取得数据库连接 dio<?6ZD9P
1)用DriverManager取数据库连接 rHSA5.[1P
例子 XEX."y
String className,url,uid,pwd; 322)r$!"
className = "oracle.jdbc.driver.OracleDriver"; c>~q2_}W(
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; owR`Z`^h)
uid = "system"; T{A5,85
pwd = "manager"; 8?yRa{'"
Class.forName(className); 76'@}wNnw
Connection cn = DriverManager.getConnection(url,uid,pwd); Ng Jp2ut
2)用jndi(java的命名和目录服务)方式 !k5I#w :
例子 bY@ S[
String jndi = "jdbc/db"; k'6Poz+<
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); b '9L}q2m
DataSource ds = (DataSource) ctx.lookup(jndi); Q|$?d4La8
Connection cn = ds.getConnection(); MJyz0.9 c
多用于jsp中 ^i;y2c
2、执行sql语句 C<G`wXlP|
1)用Statement来执行sql语句 e6
&-f
String sql; sJ3O ]
Statement sm = cn.createStatement(); AiDV4lHr
sm.executeQuery(sql); // 执行数据查询语句(select) =cP7"\
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); BH;7CK=7R
2)用PreparedStatement来执行sql语句 ~ZxFL$<'3
String sql; )8,) &F
sql = "insert into user (id,name) values (?,?)"; Sd9%tO9mf
PreparedStatement ps = cn.prepareStatement(sql); (>)f#t[9J
ps.setInt(1,xxx); 7^hwRZJ{
ps.setString(2,xxx); Y%GIKtP
... fR^aFT
ResultSet rs = ps.executeQuery(); // 查询 :nLhg$wMs
int c = ps.executeUpdate(); // 更新 Yw!(]8PYdU
>}I BPC
3、处理执行结果 {hRM=f7
查询语句,返回记录集ResultSet Fv!KLw@
更新语句,返回数字,表示该更新影响的记录数 USDqh437
ResultSet的方法 mh$ Nwr/W:
1、next(),将游标往后移动一行,如果成功返回true;否则返回false `@tnEg
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 3;E,B7,mQ
fGf C[DuY
4、释放连接 \9Yc2$dY
cn.close(); =rL^^MZp
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection ^#0k\f>_
h%=>iQ%enc
可滚动、更新的记录集 jmkVolz
1、创建可滚动、更新的Statement vR*TW
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 5 0KB:1(g
该Statement取得的ResultSet就是可滚动的 #q-7#pp
2、创建PreparedStatement时指定参数 T+knd'2V6
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); i0jR~vF
{B
ResultSet.absolute(9000); p$+.]
批量更新 '*d);{D8
1、Statement q33Z.3R
Statement sm = cn.createStatement(); [W*xPXr*
sm.addBatch(sql1); Wf>P[6
sm.addBatch(sql2); P_y8[Y]?
... FVo_=O)
sm.executeBatch() 2$@N4
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 MmL)CT
2、PreparedStatement YB?5s`vr9d
PreparedStatement ps = cn.preparedStatement(sql); EZw<)Q
{ !J/fJW>m6
ps.setXXX(1,xxx); O)EA2`)E
... ~L55l2u7
ps.addBatch(); MzP
q(`W
} g q`S`
ps.executeBatch(); )^q7s&p/
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 PQJI~u9te}
&X`zk
事务的处理 1{0 L~
1、关闭Connection的自动提交 {OBV+}#
cn.setAutoCommit(false); y<0RgG1qp
2、执行一系列sql语句 mcgkNED
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ob(S/t
Statement sm ; FcaO-
sm = cn.createStatement(insert into user...); BJ,D1E
sm.executeUpdate(); J.;{`U=:
sm.close(); \]7i-[
sm = cn.createStatement("insert into corp...); ("!P_Q#
sm.executeUpdate(); xoQ;fVNp
sm.close(); K>_~zW nc
3、提交 OMM5p=2Q
cn.commit(); *41
2)zEy
4、如果发生异常,那么回滚 )u67=0s2i+
cn.rollback();