java 数据库基本操作 |^:qJ;dOP
1、java数据库操作基本流程 Sj(5xa[
2、几个常用的重要技巧: G>@KX
可滚动、更新的记录集 arWP]%E0W
批量更新 e #!YdXSx
事务处理 IoAG !cS
@y ImR+^.7
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 `AcUxnO
1、取得数据库连接 w ag^Sk
1)用DriverManager取数据库连接 _A/q bm
例子 =Ts5\1sc>
String className,url,uid,pwd; 7$zeRYD+
className = "oracle.jdbc.driver.OracleDriver"; ?zP/i(1y
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; [aS<u`/g|
uid = "system"; qdCcMcGt
pwd = "manager"; T%Nm
Class.forName(className); 3bN]2\
Connection cn = DriverManager.getConnection(url,uid,pwd); 1-=ZIHW
2)用jndi(java的命名和目录服务)方式 2j =i\ B
例子 F$6JzF$|F
String jndi = "jdbc/db"; gVscdg5
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 1OI/,y8}
DataSource ds = (DataSource) ctx.lookup(jndi); OaH1xZNOC`
Connection cn = ds.getConnection(); }mdk+IEt
多用于jsp中 qP k`e}D
2、执行sql语句 A||,|He~
1)用Statement来执行sql语句 Abc%VRsT
String sql;
YZdV0-S
Statement sm = cn.createStatement(); cF V[k'F
sm.executeQuery(sql); // 执行数据查询语句(select) ~W..P:wG5
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); pf8M0,AY
2)用PreparedStatement来执行sql语句 tv 7"4$T
String sql; pNnZ-R|u
sql = "insert into user (id,name) values (?,?)"; =pk5'hBAi
PreparedStatement ps = cn.prepareStatement(sql); 8\VP)<<
ps.setInt(1,xxx); e0:[,aF`
ps.setString(2,xxx); dTrz7ayH
... e2_p7
ResultSet rs = ps.executeQuery(); // 查询 xP7#`S6W
int c = ps.executeUpdate(); // 更新 \=&F\EV
UFzC8
3、处理执行结果 roM!%hb
查询语句,返回记录集ResultSet ?RPVd8PUhN
更新语句,返回数字,表示该更新影响的记录数 p#aB0H3
ResultSet的方法 'ju'O#A9
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 5q,ZH6\
{
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 xOt
{Vsv
d=C&b]
4、释放连接 NCa3")k
cn.close(); 34F;mr"yp
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 5ktFL<^5T
kyH0J[/n
可滚动、更新的记录集 )}$]~
f4R
1、创建可滚动、更新的Statement cH:9@> '$a
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); qYP;`L}o#
该Statement取得的ResultSet就是可滚动的 lj /IN[U/
2、创建PreparedStatement时指定参数 =Cc]ugl7-
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); eq(1'?7]`G
ResultSet.absolute(9000); ]4onY>
批量更新 {|B
2$1':
1、Statement 25Uw\rKeO
Statement sm = cn.createStatement(); #b9V&/ln
sm.addBatch(sql1); Oy_%U*
sm.addBatch(sql2); 9]%2Yb8SC
... ,L=lg,lH^
sm.executeBatch() `-w, 6
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 tGJJ|mle>
2、PreparedStatement VA5f+c/ %
PreparedStatement ps = cn.preparedStatement(sql); 3Z}v%=5
"
{ 8?N![D\@
ps.setXXX(1,xxx); Z+Cjg#+
... @|:yK|6O
ps.addBatch(); &Jd_@F#J
} ~"VM_Lz]5
ps.executeBatch(); k=4C"
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ? sv[vR(
H`s[=Y,m
事务的处理 dpvEY(Ds
1、关闭Connection的自动提交 Qp9QSyMs}
cn.setAutoCommit(false); u7SC_3R
2、执行一系列sql语句 Q`!^EyRA:^
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 3 MCV?"0
Statement sm ; 3el/,v|qj
sm = cn.createStatement(insert into user...); qr (t_qR&
sm.executeUpdate(); :JU$6
sm.close(); D*/fY=gK
sm = cn.createStatement("insert into corp...); ;`h$xB(
sm.executeUpdate(); NiYT%K%
sm.close(); t?H
sfN
3、提交 i9|}-5ED
cn.commit(); 7 lSR
4、如果发生异常,那么回滚 0oe2X1.%
cn.rollback();