java 数据库基本操作 8%^W<.Y
1、java数据库操作基本流程 -p f9Wk
2、几个常用的重要技巧: \`8?=_ST
可滚动、更新的记录集 iG=XRctgj)
批量更新 }dG>_/3
事务处理 3y*dBw
?# )\SQ
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 v\Zq=,+
1、取得数据库连接 i/F].Sag
1)用DriverManager取数据库连接 (2r808^2
例子 \7 }{\hY-
String className,url,uid,pwd; &(~"OD
className = "oracle.jdbc.driver.OracleDriver"; 3 /LW6W|
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 6?= ^8
uid = "system"; tflUy\H>
pwd = "manager"; 4_o+gG%HaM
Class.forName(className); "mAMfV0
Connection cn = DriverManager.getConnection(url,uid,pwd); VPOp#;"%
2)用jndi(java的命名和目录服务)方式 VBe&of+
例子 BXLw
String jndi = "jdbc/db"; kj'
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); iayxN5,
DataSource ds = (DataSource) ctx.lookup(jndi); }K9Ji]tOK:
Connection cn = ds.getConnection(); ybpU?n
多用于jsp中 q ?m<9`
2、执行sql语句 zA@w[.
1)用Statement来执行sql语句 dt(Lp_&v
String sql; {0Ej*%
Statement sm = cn.createStatement(); >RKepV(X7
sm.executeQuery(sql); // 执行数据查询语句(select) ux>LciNq
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); TJkWL2r0c
2)用PreparedStatement来执行sql语句 [P%'p-Hg_
String sql; Z/b,aZhB
sql = "insert into user (id,name) values (?,?)"; B-tLRLWn
PreparedStatement ps = cn.prepareStatement(sql); ?,FL"ye
ps.setInt(1,xxx); }Z% j=c"d
ps.setString(2,xxx); LgA>,.
... AI3\eH+
ResultSet rs = ps.executeQuery(); // 查询 nLBi}T
int c = ps.executeUpdate(); // 更新 avxI%% |
QykHB
k
3、处理执行结果 pcPRkYT[M
查询语句,返回记录集ResultSet g
(V_&Y
更新语句,返回数字,表示该更新影响的记录数 0ZtH
ResultSet的方法 QHe:
1、next(),将游标往后移动一行,如果成功返回true;否则返回false }xytV5a^
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 61`tQFx,
"S3U]zw0_
4、释放连接 LH>h]OTQF
cn.close(); !24g_R[3"
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection WFMQ;
/P/::$
可滚动、更新的记录集 v#$}3+KVC
1、创建可滚动、更新的Statement &%@>S.
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 8iN@n8O
该Statement取得的ResultSet就是可滚动的 ,pVq/1
2、创建PreparedStatement时指定参数 +fG~m:E
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ufS0UD8%H
ResultSet.absolute(9000); hPrE
批量更新 n16TQe"8
1、Statement r8[Ywn<u
Statement sm = cn.createStatement(); eHH9#Vrhc$
sm.addBatch(sql1); gOm%?sg
sm.addBatch(sql2); \`WAG>'l5
... *AA78G|
sm.executeBatch() fDZnC Fa
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 fh@/fd
2、PreparedStatement u&$1XZ!es
PreparedStatement ps = cn.preparedStatement(sql); u9%AK g}~
{ |~YhN'OJ
ps.setXXX(1,xxx); 30L/-+r1
... |sV@j_TX
ps.addBatch(); 8'Q1'yc
} -/J2;AkGH
ps.executeBatch(); LQ4F/[1}
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 rOXh?r
$ 7uxReFZR
事务的处理 sys;Rz2
1、关闭Connection的自动提交 mNr<=Z%b
cn.setAutoCommit(false); t[x[X4
2、执行一系列sql语句 8Nxyc>8K~
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close *G;D u`;
Statement sm ; <^B!.zQ
sm = cn.createStatement(insert into user...); W^dRA xVX
sm.executeUpdate(); T( sEk
sm.close(); _ +A$6l
sm = cn.createStatement("insert into corp...); K@;ls
sm.executeUpdate(); iuWw(dJk
sm.close();
<