java 数据库基本操作 X<dQq`kZ
1、java数据库操作基本流程 VC5LxA0{
2、几个常用的重要技巧: De%WT:v
可滚动、更新的记录集 `[3Iz$K=
批量更新 _U( b
事务处理 -CtLL_ I
,l^; ZE
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 }R4%%)j(Vj
1、取得数据库连接 |=L~>G
1)用DriverManager取数据库连接 ^2%_AP0=
例子 F$QN>wPpM
String className,url,uid,pwd; B{$4s8XU
className = "oracle.jdbc.driver.OracleDriver"; j&,,~AZm
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; eQ`TW'[9_6
uid = "system"; 0O<g)%Vz>
pwd = "manager"; xpCzx=n3.m
Class.forName(className); W+36"?*k3
Connection cn = DriverManager.getConnection(url,uid,pwd); Q ]]}8l2
2)用jndi(java的命名和目录服务)方式 zs|R#?a=
例子 0$NcxbM
String jndi = "jdbc/db"; !`"@!
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); OFJ49X
DataSource ds = (DataSource) ctx.lookup(jndi); Kq#\P
Connection cn = ds.getConnection(); >a7OE=K
多用于jsp中 8dgI&t
2、执行sql语句 !2R~/Rg
1)用Statement来执行sql语句 Ss6mN;&D
String sql; QxZYy}2
Statement sm = cn.createStatement(); <9z2:^
sm.executeQuery(sql); // 执行数据查询语句(select) (8qD'(@
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); X`xmV!
2)用PreparedStatement来执行sql语句 C"}CD{<H]M
String sql; KU# w%
sql = "insert into user (id,name) values (?,?)"; DjY&)oce(
PreparedStatement ps = cn.prepareStatement(sql); z(b0U6)qQ
ps.setInt(1,xxx); z+,l"#Vv
ps.setString(2,xxx); 2Z K:S+c
... |YCGWJaci
ResultSet rs = ps.executeQuery(); // 查询 >]K:lJ]l
int c = ps.executeUpdate(); // 更新 n6D9f~8"
1><@$kVMm~
3、处理执行结果 y|X</3w
查询语句,返回记录集ResultSet l)tK/1 W
更新语句,返回数字,表示该更新影响的记录数 9eO!_a^
ResultSet的方法 v zgR3r
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Afa|6zZ>
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 2L"$p?
dz@L}b*
4、释放连接 jo-jPYH T
cn.close(); 0?OTa<c
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection $I*ye+a*{q
:cU6W2EV
可滚动、更新的记录集 aVkgE>
1、创建可滚动、更新的Statement NwPGH=V
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); l2H-E&'=
该Statement取得的ResultSet就是可滚动的 JrlDTNJj'
2、创建PreparedStatement时指定参数 hM$K?t
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); `/?XvF\
ResultSet.absolute(9000); %N+8K
批量更新 _RI`I}&9Z
1、Statement zURxXo/\V
Statement sm = cn.createStatement(); c1 aCN
sm.addBatch(sql1); "Kky|(EQ$$
sm.addBatch(sql2); Nfe
... WqQAt{W/<
sm.executeBatch() &j=FxF9o
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 n7-|\p!xP6
2、PreparedStatement YZ>L\
PreparedStatement ps = cn.preparedStatement(sql); XG_h\NIL
{ %]NaHf
ps.setXXX(1,xxx); 6{Y3-Pxg
... .}IxZM[}D
ps.addBatch(); Itq248+Ci
} @
3n;>oi
ps.executeBatch(); <[iw1>
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 *Iy5 V7`KU
5?6U@??]
事务的处理 w_zUA'n+
1、关闭Connection的自动提交 X*ZTn
7<
cn.setAutoCommit(false); '"u>;Bq
2、执行一系列sql语句 J)(KG dk
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 3"v
k$
Statement sm ; ;Q*=AW
sm = cn.createStatement(insert into user...); ]`@= ;w
sm.executeUpdate(); c%|K
x
sm.close(); i,#j@R@.C7
sm = cn.createStatement("insert into corp...); 2XoFmV),F
sm.executeUpdate(); `y"(\1
sm.close(); Dxp8^VL
3、提交 f};lH[B3y
cn.commit(); U~9Y9qzy,
4、如果发生异常,那么回滚 P`z#tDT^"
cn.rollback();