java 数据库基本操作 N=tyaS(YJ
1、java数据库操作基本流程 3<m"z9$
2、几个常用的重要技巧: jTSw 0\}
可滚动、更新的记录集 9g^@dfBV
批量更新 #`y7L4V*o
事务处理 6dC!&leNi
9p2"5x
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ,8+SQo#3
1、取得数据库连接 p8Lb*7W
1)用DriverManager取数据库连接 )"t=sFxaB
例子 bC?t4-W
String className,url,uid,pwd; Wj.)wr!
className = "oracle.jdbc.driver.OracleDriver"; =]-!
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; c!{.BgGN
uid = "system"; pR`.8MMc8
pwd = "manager"; F~W*"i+EZ
Class.forName(className); Lkqu"V
Connection cn = DriverManager.getConnection(url,uid,pwd); 2#T|+mKxZM
2)用jndi(java的命名和目录服务)方式 r'{pTgm#
例子 kRSu6r9
String jndi = "jdbc/db"; 'PV,c|f>
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); JS({au
DataSource ds = (DataSource) ctx.lookup(jndi); WQiEQ>6(t(
Connection cn = ds.getConnection(); .LnXKRd{
多用于jsp中 *% Vd2jW/
2、执行sql语句 s)
V7$D
1)用Statement来执行sql语句 KM< M^l_Q
String sql; si3i#l&.b_
Statement sm = cn.createStatement(); qi7dcn@d
sm.executeQuery(sql); // 执行数据查询语句(select) ?#pL\1"E
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); u"X8(\pOn
2)用PreparedStatement来执行sql语句 >@h0@N
String sql; (;~[}"
sql = "insert into user (id,name) values (?,?)"; s8@f Z4
PreparedStatement ps = cn.prepareStatement(sql); Be8Gx
ps.setInt(1,xxx); t8]u#bx"?
ps.setString(2,xxx); oo-^BG
... cO)GiWE
ResultSet rs = ps.executeQuery(); // 查询
?o9l{4~g
int c = ps.executeUpdate(); // 更新 _f^q!tP&d
=Q3Go8b4HJ
3、处理执行结果 <mrLld#_:C
查询语句,返回记录集ResultSet o=;.RYi
更新语句,返回数字,表示该更新影响的记录数 $AG.<
ResultSet的方法 gq Z7Pro.
1、next(),将游标往后移动一行,如果成功返回true;否则返回false uZd)o
AB
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ;)"r^M)):
MSRIG-
4、释放连接 -Ah \a0z
cn.close(); {\C$Bz
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection /YUf('b
)z7.S"U
可滚动、更新的记录集 P63z8^y
1、创建可滚动、更新的Statement if#$wm%
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); -7m;rD4J
该Statement取得的ResultSet就是可滚动的 KGP2,U6
2、创建PreparedStatement时指定参数 ScZ$&n
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); N;r,B
ResultSet.absolute(9000); rd%3eR?V
批量更新 d 'x;]#S
1、Statement X=${`n%LG
Statement sm = cn.createStatement(); c7wza/r>
sm.addBatch(sql1); `1M_rG1/+
sm.addBatch(sql2); PM%./
... P4R.~J ;8
sm.executeBatch() /xrt,M@
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 nfRo:@
2、PreparedStatement D!qtb6<.
PreparedStatement ps = cn.preparedStatement(sql); n$#^gzU4
{ % fA0XRM
ps.setXXX(1,xxx); HAGWA2wQ
... 5'+g'9
ps.addBatch(); Og30&a!~F
} xv4nYm9
ps.executeBatch(); z)QyQ
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 )TRDM[u
E%H,Hk^
事务的处理 g6
7* Bs
1、关闭Connection的自动提交 'Nfg%)-N
cn.setAutoCommit(false); 1D=My1B
2、执行一系列sql语句 I0Wn?Qq=@
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Haq23K
Statement sm ; eUF PzioW
sm = cn.createStatement(insert into user...); ,,fLK1
sm.executeUpdate(); Rg0\Ng4|G
sm.close(); JK,#dA#
sm = cn.createStatement("insert into corp...); RR`?o\
sm.executeUpdate(); HV>|f'45
sm.close(); K{q(/>:
3、提交 a`/[\K6
cn.commit(); "UVV/&`o
4、如果发生异常,那么回滚 V+Cb.$@
cn.rollback();