java 数据库基本操作 yK7>^p}V
1、java数据库操作基本流程 4F4u1r+
2、几个常用的重要技巧: `U3
可滚动、更新的记录集 Fi/G, [q
批量更新 |O9=C`G_
事务处理 Mqtp}<*@-
+r!h* 4
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ?W|IC8~d')
1、取得数据库连接 MH Yf8HN
1)用DriverManager取数据库连接 =GVhAzD3
例子 $B?7u@>,
String className,url,uid,pwd; D5m\u$~V
className = "oracle.jdbc.driver.OracleDriver"; RZtL<2.@
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; uY~A0I5Z
uid = "system"; Bw=[g&+o1@
pwd = "manager"; g&vEc1LNo
Class.forName(className); ~&/Gx_KU
Connection cn = DriverManager.getConnection(url,uid,pwd); _z 5CplO
2)用jndi(java的命名和目录服务)方式 C|zH {.H
例子 ?BZ][~n-Q
String jndi = "jdbc/db"; %Nn'p"
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); !m|%4/
M@
DataSource ds = (DataSource) ctx.lookup(jndi); 7 f*_
Connection cn = ds.getConnection(); e`Yns$x
多用于jsp中 RM+E
2、执行sql语句 KRZV9AJ
1)用Statement来执行sql语句 U.F65KaKF
String sql; /nP=E
Statement sm = cn.createStatement(); 6;pREM+
sm.executeQuery(sql); // 执行数据查询语句(select) v+sbRuo8
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); T!a[@,)_
2)用PreparedStatement来执行sql语句 RGLA}|
String sql; `x VA]GR4c
sql = "insert into user (id,name) values (?,?)"; Wd5t,8*8
PreparedStatement ps = cn.prepareStatement(sql); y#DQOY+@^#
ps.setInt(1,xxx); dZgfls
ps.setString(2,xxx); NLGr=*dq
... x+e
_pb
ResultSet rs = ps.executeQuery(); // 查询 yMkd|1
int c = ps.executeUpdate(); // 更新 s-V$N
,AM-cwwT:u
3、处理执行结果 lpUtNy
查询语句,返回记录集ResultSet P.B'Gh#^
更新语句,返回数字,表示该更新影响的记录数 %p60pn[(
ResultSet的方法 1F,_L}=o1s
1、next(),将游标往后移动一行,如果成功返回true;否则返回false k#) .E X
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 kwR@oVR^
SXz([Z{)
4、释放连接 }aM`Jp-O
cn.close(); |]cDz
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection LeyDs>!0
8Q -F
可滚动、更新的记录集 U9 *2< c
1、创建可滚动、更新的Statement Ohag%<1#
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); #Vigu,zY
该Statement取得的ResultSet就是可滚动的 hFfaaB
2、创建PreparedStatement时指定参数 !VZj!\I
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); >pvg0Fh
ResultSet.absolute(9000); >NA7,Z2.
批量更新 NF!1)
1、Statement +:%FJCOT
Statement sm = cn.createStatement(); K>6k@okO
sm.addBatch(sql1); -(}1o9e\7
sm.addBatch(sql2); tlgvBRH>
... "'B%.a#k
sm.executeBatch() Sg>0P*K@
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 J6ShIPc
2、PreparedStatement A_~5|
PreparedStatement ps = cn.preparedStatement(sql); MjC%6%HI
{ "\r~,S{:
ps.setXXX(1,xxx); <SZO-
-+lB
... XSjelA?
ps.addBatch(); CZRo{2!?U
} \Egc5{
ps.executeBatch(); f {Z%:H
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ja- ~`
b_Jq=Gk`
事务的处理 -z$2pXT ^
1、关闭Connection的自动提交 HbfB[%
cn.setAutoCommit(false); a
BH1J]_
2、执行一系列sql语句 B!ibE<7,
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close g+)\/n|
Statement sm ; yKEFne8^
sm = cn.createStatement(insert into user...); ~!9Px j*
sm.executeUpdate(); PZRn6Tc
sm.close(); vcO`j<`
sm = cn.createStatement("insert into corp...); \N , ' +
sm.executeUpdate(); 8Vhck-wF
sm.close(); }k0-?_Z=1
3、提交 +JS/Z5dl+}
cn.commit(); >TnQ4^;v.
4、如果发生异常,那么回滚 kseJm+Hc
cn.rollback();