java 数据库基本操作 %j&vV>2
1、java数据库操作基本流程 :BxO6@>Xc
2、几个常用的重要技巧: 8-G )lyfj
可滚动、更新的记录集 2O kID
WcM
批量更新 IOFXkpKR
事务处理 gvc@q`_]
w[z=x
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 XIIq0I
1、取得数据库连接 )>ff"| X
1)用DriverManager取数据库连接 6[t<g=
例子 nFni1cCD
String className,url,uid,pwd; phDIUhL$z
className = "oracle.jdbc.driver.OracleDriver"; Pim
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 5]i#l3")
uid = "system"; 8>x5|
pwd = "manager"; 'ON/WKJr|W
Class.forName(className); le5@WG/x
Connection cn = DriverManager.getConnection(url,uid,pwd); URVW5c
2)用jndi(java的命名和目录服务)方式 >)K3
例子 !/}4_s`,
String jndi = "jdbc/db"; /o4_rzR?
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); >"/TiQt
DataSource ds = (DataSource) ctx.lookup(jndi); v J0v6\
Connection cn = ds.getConnection(); s$(%]~P
多用于jsp中 G4i%/_JU
2、执行sql语句 S[L@8z.Sj
1)用Statement来执行sql语句 4<s;xSCL
String sql; i7dDklj4
Statement sm = cn.createStatement(); ,.Ofv):=
sm.executeQuery(sql); // 执行数据查询语句(select) 4b}p[9k
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); xiW}P% bf
2)用PreparedStatement来执行sql语句 wQ(DX!
String sql; Cx;it/8+
sql = "insert into user (id,name) values (?,?)"; A6szTX#0
PreparedStatement ps = cn.prepareStatement(sql); TY]0aw2]|7
ps.setInt(1,xxx); <x`yoVPiZg
ps.setString(2,xxx); E:rJi]
... S[y'{;
ResultSet rs = ps.executeQuery(); // 查询 m !:F/?B
int c = ps.executeUpdate(); // 更新 Ps0Cc _
`pbCPa{Y
3、处理执行结果 D0#U*tq;
查询语句,返回记录集ResultSet (B` NnL$
更新语句,返回数字,表示该更新影响的记录数 $U,]c
ResultSet的方法 jpi,BVTI-X
1、next(),将游标往后移动一行,如果成功返回true;否则返回false .x$V~t
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 %#%YU|4R
,8*A#cT
B
4、释放连接 <w&'E6mU
cn.close(); A#$l;M.3R
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection '0f!o&?g
J|xXo
可滚动、更新的记录集 -AnJLFY
1、创建可滚动、更新的Statement ~%\vX
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ;R
>>,&g
该Statement取得的ResultSet就是可滚动的 tLJ 7tnB
2、创建PreparedStatement时指定参数 M]V
j
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); @{V`g8P>
ResultSet.absolute(9000); 4=q4_ \_T
批量更新 ->|eMV'd
1、Statement ^Ip\`2^u
Statement sm = cn.createStatement(); >$}Mr%49
sm.addBatch(sql1); #p"F$@N
sm.addBatch(sql2); '5$: #|-
... Il/`#b@h
sm.executeBatch() fCa
lR7!
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 wOUCe#P|r
2、PreparedStatement '!X`X=
PreparedStatement ps = cn.preparedStatement(sql); pz2E+o
{ }Bh\N5G%
ps.setXXX(1,xxx); =YYqgNz+\w
... 2s2KI=6
ps.addBatch(); :SFf}
} x^3K=l;N
ps.executeBatch(); bIt{kzuQC
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 qUe2(/TQu
<mLU-'c@
事务的处理 v-$X1s
1、关闭Connection的自动提交 !6.LSY,E
cn.setAutoCommit(false); bjUe+#BL
2、执行一系列sql语句 "7alpjwb
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close 2aivc,m{r
Statement sm ; pC4uar
sm = cn.createStatement(insert into user...); fk^DkV^<
sm.executeUpdate(); -{3^~vW|<
sm.close(); $LR~c)}1I
sm = cn.createStatement("insert into corp...); #\~m}O,
sm.executeUpdate(); {w>ofyqfp&
sm.close(); CNiJuj`
3、提交
fNr*\=$
cn.commit(); bAY>o
4、如果发生异常,那么回滚 Mn\L55?E(
cn.rollback();