java 数据库基本操作 Yrq~5)%
1、java数据库操作基本流程 mj7#&r,1l
2、几个常用的重要技巧: 5*u+q2\F
可滚动、更新的记录集 xr^LFn)
批量更新 5wU]!bxr
事务处理 SQ+Gvq%Q]
) ;Y;Q
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 iuul7VR-%
1、取得数据库连接 Dk5 1z@
1)用DriverManager取数据库连接 'i|YlMFI g
例子 >Y@H4LF;1x
String className,url,uid,pwd; M x"\5i
className = "oracle.jdbc.driver.OracleDriver"; z},# ~L6$q
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; jq0O22
-R
uid = "system"; W: z;|FF
pwd = "manager"; Q\sK"~@3
Class.forName(className); ]JQULE)
Connection cn = DriverManager.getConnection(url,uid,pwd); m+z&Q
2)用jndi(java的命名和目录服务)方式 =~LJ3sIX
例子 Z*6IW7#
String jndi = "jdbc/db"; ":N9(}9
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 9QJyZ
DataSource ds = (DataSource) ctx.lookup(jndi); 4Ftu
Connection cn = ds.getConnection(); l,aay-E
多用于jsp中 V0 a3<6@4
2、执行sql语句 aw&,S"A@
1)用Statement来执行sql语句 '8kP.l
String sql; ~6md !o%i
Statement sm = cn.createStatement(); )NT*bLRPQ
sm.executeQuery(sql); // 执行数据查询语句(select) (A.C]hD
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); {R{=+2K!|k
2)用PreparedStatement来执行sql语句 _Y m2/3!
String sql; v4 E}D
sql = "insert into user (id,name) values (?,?)"; 6Q5^>\Y
PreparedStatement ps = cn.prepareStatement(sql); X1_5KH
ps.setInt(1,xxx); Bk{]g=DO
ps.setString(2,xxx); lr&a;aZp
... pEz_qy[#
ResultSet rs = ps.executeQuery(); // 查询 -yNlyHv9
int c = ps.executeUpdate(); // 更新 Z0r'S]fe
yEy6]f+>+
3、处理执行结果 M X]n&
查询语句,返回记录集ResultSet <9b&<K:
更新语句,返回数字,表示该更新影响的记录数 XL/u#EA0<
ResultSet的方法 V>3X\)qu
1、next(),将游标往后移动一行,如果成功返回true;否则返回false XQw9~$
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 )0k53-h&
}c:M^Ff
4、释放连接 G=bCNn<
cn.close(); [()koU#w.
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 5SQ8}Or3
[mueZQyI?0
可滚动、更新的记录集 YuwI&)l
1、创建可滚动、更新的Statement |;{6&S
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 7_[L o4_
该Statement取得的ResultSet就是可滚动的 >=w)x,0yX
2、创建PreparedStatement时指定参数 2MK-5Kg
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); dlnX_+((KC
ResultSet.absolute(9000); ^xk'Z
批量更新 K)iF>y|{*q
1、Statement WTiD[u
Statement sm = cn.createStatement(); a?oI>8*
sm.addBatch(sql1); &uVnZ@o42
sm.addBatch(sql2); hXya*#n#
... 5#z1bu
sm.executeBatch() ZYNsHcTY
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 M
D#jj3y
2、PreparedStatement AQ^u
PreparedStatement ps = cn.preparedStatement(sql); +
>!;i6|
{ b\,+f n
ps.setXXX(1,xxx); q ZZK#,Qb
... )Q JUUn#
ps.addBatch(); (**oRwr%
} ]eV8b*d6
ps.executeBatch(); K:WDl;8(d
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 'Z]w^<
g0E'g
事务的处理 I]_5}[I
1、关闭Connection的自动提交 :rP=t ,
cn.setAutoCommit(false); Zj
Z^_X3
2、执行一系列sql语句 iU:cW=W|M\
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ?\n>
AC
Statement sm ; z'7]h TA
sm = cn.createStatement(insert into user...); V28M lP
sm.executeUpdate(); yIE!j%u
sm.close(); z0Z%m@
sm = cn.createStatement("insert into corp...); !dT4
sm.executeUpdate(); 5~S5F3
sm.close(); lNv|M)I
3、提交 s,_m{ to
cn.commit(); Rk8P
ax/JK
4、如果发生异常,那么回滚 NX&_p!_V
cn.rollback();