java 数据库基本操作 Hon2;-:]{]
1、java数据库操作基本流程 Nx}nOm
2、几个常用的重要技巧: _`$Q6!Z)l
可滚动、更新的记录集 uLhGp@Dx
批量更新 ^y+k6bE
事务处理 qmS9*me
{
,jU>V]YC
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 yD\q4G
1、取得数据库连接 VB |?S|<
1)用DriverManager取数据库连接 S%SYvA
例子 W .a>K$
String className,url,uid,pwd; !)s(Lv%]
className = "oracle.jdbc.driver.OracleDriver"; Z8v\>@?5R
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ]OAU&t{
uid = "system"; Y}~sTuWU
pwd = "manager"; |t,sK aL
Class.forName(className); 5100fX}
Connection cn = DriverManager.getConnection(url,uid,pwd); Wu>]R'C
2)用jndi(java的命名和目录服务)方式 .N(R~_
例子 xfk
-Ezv
String jndi = "jdbc/db"; l*CulVX
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); QiCia#_
DataSource ds = (DataSource) ctx.lookup(jndi); U/>I! 7oe
Connection cn = ds.getConnection(); 2&6D`{"P
多用于jsp中 RdCGK?s
2、执行sql语句 $^x=i;>aK.
1)用Statement来执行sql语句 >a;a8EA<O
String sql; xP8/1wd.
Statement sm = cn.createStatement(); `bP`.Wm
sm.executeQuery(sql); // 执行数据查询语句(select) %bcf% 7
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); oj 8r*
2)用PreparedStatement来执行sql语句 X5WA-s(?0
String sql; [P2>KQ\
sql = "insert into user (id,name) values (?,?)"; SKG
U)Rn;
PreparedStatement ps = cn.prepareStatement(sql); Np\NStx2
ps.setInt(1,xxx); <spG]Xa<
ps.setString(2,xxx); x[A|@\Z
... 757&bH|a
ResultSet rs = ps.executeQuery(); // 查询 l)r\SE1
int c = ps.executeUpdate(); // 更新 y-pdAkDh
:zW? O#aL-
3、处理执行结果 Z$z-Hx@%
查询语句,返回记录集ResultSet {_7hX`p
更新语句,返回数字,表示该更新影响的记录数 @ &jR^`Y.
ResultSet的方法 \kE0h\
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ys=2!P-[#
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 175e:\Tw
%1&X+s3
4、释放连接 G^'We6<
cn.close(); g;l K34{
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection kNuvJ/St
^-%'ItVO
可滚动、更新的记录集 8vx
ca]DcV
1、创建可滚动、更新的Statement "6,fIsU
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); \8(Je"S
该Statement取得的ResultSet就是可滚动的
1^_W[+<S/
2、创建PreparedStatement时指定参数 >~g-
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); %!` %21
ResultSet.absolute(9000); ,[n9DPZ
批量更新 }B%9cc
1、Statement *r.%/^@
Statement sm = cn.createStatement(); >s<Bu' r
sm.addBatch(sql1); N8]DzE0%
sm.addBatch(sql2); [I;C6p
... U|wST&rU|
sm.executeBatch() 2j
f!o
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 ;CO qu#(
2、PreparedStatement F=\
REq
PreparedStatement ps = cn.preparedStatement(sql); r1~W(r.x
{ `.@udfog^0
ps.setXXX(1,xxx); &Wy>t8DIK
... B9(w^l$kZ|
ps.addBatch(); #(
.G;e;w
} 4m~y%>
&
ps.executeBatch(); x(?Rm,
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 E8C8kH]
(XK,g;RoEn
事务的处理 w,hm_aDq
1、关闭Connection的自动提交 GwO`@-}E
cn.setAutoCommit(false); .1(_7!m@
2、执行一系列sql语句 kTjn%Sn,
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ;X}2S!7Ko
Statement sm ; 1_7p`Gxt[/
sm = cn.createStatement(insert into user...); 2K4Xu9-i:b
sm.executeUpdate(); q,K|1+jn
sm.close(); Boj R"
sm = cn.createStatement("insert into corp...); &n*ga$Q
sm.executeUpdate(); SY9 5s
sm.close(); "]3o933D
3、提交 7a[6@
cn.commit(); iKq_s5|sW
4、如果发生异常,那么回滚 (ot,CpI(I
cn.rollback();