java 数据库基本操作 g
'a?
1、java数据库操作基本流程 ,ri--<
2、几个常用的重要技巧: l]y%cJ~$'D
可滚动、更新的记录集 G0Tc}_o<Y
批量更新 W?J[K;<
事务处理 ]mo<qWRc>p
S{7ik,Gdg
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 "gajBY
1、取得数据库连接 .x?zky^
1)用DriverManager取数据库连接 |P0L,R
例子 k:)u7A+
String className,url,uid,pwd; <L
( =
className = "oracle.jdbc.driver.OracleDriver"; '=G
Ce%A
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; _m?(O /BTx
uid = "system"; <O)X89dFM
pwd = "manager"; (DP9& b
Class.forName(className); =&:f+!1$
Connection cn = DriverManager.getConnection(url,uid,pwd); JK]tcP
2)用jndi(java的命名和目录服务)方式
@:QdCG+
例子 ?[1qC=[Z<
String jndi = "jdbc/db"; L0|hc
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); v:Z4z6M-
DataSource ds = (DataSource) ctx.lookup(jndi); , !%R5*?=D
Connection cn = ds.getConnection(); 1
u_24
多用于jsp中 #iU8hUbo
2、执行sql语句 o"}&qA;
1)用Statement来执行sql语句 X<}o>
6|d
String sql; zMr!WoW
Statement sm = cn.createStatement(); >g"M.gW
sm.executeQuery(sql); // 执行数据查询语句(select) >aC\_Mc
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); U;Ll.BFP
2)用PreparedStatement来执行sql语句 $EGRaps{j>
String sql; h k!,
sql = "insert into user (id,name) values (?,?)"; *:tjxC
PreparedStatement ps = cn.prepareStatement(sql); )!}-\5F
ps.setInt(1,xxx); i|]Va44
ps.setString(2,xxx); FJ(B]n[>
... m":SE? {{&
ResultSet rs = ps.executeQuery(); // 查询 C| L^Ds0
int c = ps.executeUpdate(); // 更新 2
ssj(Qo
$FusDdCv3
3、处理执行结果 *xo;pe)9
查询语句,返回记录集ResultSet 7kX$wQZ_
更新语句,返回数字,表示该更新影响的记录数 e_~fJ
ResultSet的方法
^*xHy`
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Ds%&Mi
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 |!?WQ[
z(`
}:t
4、释放连接 MYw8wwX0kJ
cn.close(); 6%\Q*r*N
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection *fH_lG%
,s><kHJ
可滚动、更新的记录集 95^i/6Gl!P
1、创建可滚动、更新的Statement \SiHrr5
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); (e8G
(
该Statement取得的ResultSet就是可滚动的 `kNi*I^
2、创建PreparedStatement时指定参数 "o{)X@YN]
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 8L-4}!~C
ResultSet.absolute(9000); 6vgBqn[
批量更新 `/w\2n
1、Statement EY)Gi`lK
Statement sm = cn.createStatement(); K/2. 1o;9
sm.addBatch(sql1); MZ5Y\-nq\
sm.addBatch(sql2); mGe|8In
... Z%+BWS3YqY
sm.executeBatch() zRV!(Y
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 (/SGT$#8
2、PreparedStatement Q'|0?nBOY
PreparedStatement ps = cn.preparedStatement(sql); 1^L`)Up
{ SY'2A)
ps.setXXX(1,xxx); rps(Jos_~
... {4:
-0itG
ps.addBatch(); `k(u:yGK
} H\fcY p6
ps.executeBatch(); MCk^Tp!
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 zb5N,!%r
,\o<y|+`S
事务的处理 o3n3URu\
1、关闭Connection的自动提交 i s L{9^
cn.setAutoCommit(false); P3iA(3I24<
2、执行一系列sql语句 rQ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close OE'K5oIM
Statement sm ; ,Z>wbMJig
sm = cn.createStatement(insert into user...); -B1YZ/.rz"
sm.executeUpdate(); K1T1@ j
sm.close(); FXx.$W
sm = cn.createStatement("insert into corp...); N5nvL)a~
sm.executeUpdate(); -<^jGrb
sm.close(); [J0*+C9P*
3、提交 Ue(r}*
cn.commit(); oi2J:Y4
4、如果发生异常,那么回滚 1GtOA3,~;-
cn.rollback();