java 数据库基本操作 5XI*I(.%/
1、java数据库操作基本流程 ntV>m*^
2、几个常用的重要技巧: =fG8YZ(
可滚动、更新的记录集 uN
62>
批量更新 l`&6W?C
事务处理 '.yWL
H>f{3S-%
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 XB-|gPk
1、取得数据库连接 PEEY;x
1)用DriverManager取数据库连接 Nh9!lB m*]
例子 ZPao*2xz
String className,url,uid,pwd; %}XMhWn{
className = "oracle.jdbc.driver.OracleDriver"; i(;-n_:,`
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; z|*6fFE
uid = "system"; %k
#Nu
pwd = "manager"; Vor9
?F&w
Class.forName(className); m1i+{((
Connection cn = DriverManager.getConnection(url,uid,pwd); W;dzLgc
2)用jndi(java的命名和目录服务)方式 2bnIT>(
例子 Z(mn
U;9{v
String jndi = "jdbc/db"; -Y?(Zz_w
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); Az9J{)
DataSource ds = (DataSource) ctx.lookup(jndi); #0^3Wm`X;
Connection cn = ds.getConnection(); L"7`
\4
多用于jsp中 J 7;n;Mx
2、执行sql语句 xKST-:c +
1)用Statement来执行sql语句 0Y*gJ!a
String sql; o!r4 frP
Statement sm = cn.createStatement(); 8/?uU]#Q
sm.executeQuery(sql); // 执行数据查询语句(select) Y~hd<8 ~
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); +1jqCW
2)用PreparedStatement来执行sql语句 5zw23!
String sql; y'|W['
sql = "insert into user (id,name) values (?,?)"; `Mn{bd
PreparedStatement ps = cn.prepareStatement(sql); C%?D E@k
ps.setInt(1,xxx); ,tF" 4|#
ps.setString(2,xxx);
"rDzrz
... n;^k
ResultSet rs = ps.executeQuery(); // 查询 -sH.yAvC6
int c = ps.executeUpdate(); // 更新 `[ ` *@O(y
40d9/$uzh
3、处理执行结果 *5'6E'
查询语句,返回记录集ResultSet 7K]U|K#
更新语句,返回数字,表示该更新影响的记录数 2a(yR>#
ResultSet的方法 ?Gv!d
1、next(),将游标往后移动一行,如果成功返回true;否则返回false lPQ
Ut!xI
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 VueQP|
p F*~)e
4、释放连接 xKLcd+hCZ
cn.close(); .'{6u;8
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection u:H 3.5)%
]#-/i2-K
可滚动、更新的记录集 0/00W6r0
1、创建可滚动、更新的Statement `MYK XBM
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); JvWs/AG1
该Statement取得的ResultSet就是可滚动的 ah"MzU)
2、创建PreparedStatement时指定参数 8j+:s\
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); I;.!
hV>E
ResultSet.absolute(9000); {9|$%4kRl
批量更新 y7IbE
1、Statement z'}= A
Statement sm = cn.createStatement(); nh&J3b}B!
sm.addBatch(sql1); 5nM9!A\D
sm.addBatch(sql2); L!b0y7yR
... `ToRkk&&>{
sm.executeBatch() "K$ Wh1<7
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 #b"5L2D`y'
2、PreparedStatement IU'!?XVo
PreparedStatement ps = cn.preparedStatement(sql); 0@e}hv;
{ -2jBs-z
ps.setXXX(1,xxx); ;'Vipj
... q~'
K9
ps.addBatch(); u388Wj
} B[/['sD
ps.executeBatch(); +?5Uy*$
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 Fb{`a[&
cH* /zNp
事务的处理 WVT5VJ7*
1、关闭Connection的自动提交 o )nT
cn.setAutoCommit(false); <E7Vbb9*
2、执行一系列sql语句 N} x/&e
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 6aF'^6+a
Statement sm ; Ubw!/|mi
sm = cn.createStatement(insert into user...); o~.o^0Y
sm.executeUpdate(); F<ocY0=9p
sm.close(); cxP9n8CuT
sm = cn.createStatement("insert into corp...); w1"gl0ga$
sm.executeUpdate(); ),y!<\oQ
sm.close(); XC/]u%n8](
3、提交 JX\T
{\m#
cn.commit(); il>x!)?o
4、如果发生异常,那么回滚 n2y/zP>TC
cn.rollback();