java 数据库基本操作 4
Y=0>FlY0
1、java数据库操作基本流程 qeM DC#N
2、几个常用的重要技巧: $*eYiz3Ue
可滚动、更新的记录集 !BVCuuM>w
批量更新 'TYO-'aC
事务处理 N&G'i.w/
D zD5n
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 .iV=ybMT
1、取得数据库连接 -o~zb-E
1)用DriverManager取数据库连接 o1#3A
例子 #)}BY"C%
String className,url,uid,pwd; C] Fw*t
className = "oracle.jdbc.driver.OracleDriver"; V(Pw|u"
e
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; +7%?p"gEY\
uid = "system"; o<A-ETx<
pwd = "manager"; @{b5x>KX
Class.forName(className); 29grb P
Connection cn = DriverManager.getConnection(url,uid,pwd); HKbV@NW
2)用jndi(java的命名和目录服务)方式 R'Ue>k
例子 KAZ<w~55c
String jndi = "jdbc/db"; :uAL(3pQ
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); (LsVd2AbR
DataSource ds = (DataSource) ctx.lookup(jndi); S$SCW<LuN
Connection cn = ds.getConnection(); /\Nc6Z/ L
多用于jsp中 FV9{u[3m
2、执行sql语句 X[Iy6qt
1)用Statement来执行sql语句 zx<t{e7
String sql; gH7 +#/
Statement sm = cn.createStatement(); u)h
{"pP
sm.executeQuery(sql); // 执行数据查询语句(select) @MibKj>o
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); _v#puFy
2)用PreparedStatement来执行sql语句 egs P\ '
String sql; &PXT$x[i
sql = "insert into user (id,name) values (?,?)"; {*bx8*y1
PreparedStatement ps = cn.prepareStatement(sql); T[OI/WuK
ps.setInt(1,xxx); S8qg"YR
ps.setString(2,xxx); }Nn+Ny
... ,]\cf
ResultSet rs = ps.executeQuery(); // 查询 P8=|#yCi
int c = ps.executeUpdate(); // 更新 `ZL^+h<b>M
+E9G"Z65iP
3、处理执行结果 &M5v EPR
查询语句,返回记录集ResultSet GTB\95j]
更新语句,返回数字,表示该更新影响的记录数 ,l AZ4
ResultSet的方法
gwIR3u
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ,62~u'hR5
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 e,#w*|
T7i>aM$+
4、释放连接 \
o2oQ3
cn.close(); KPy)%i
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection (@NILK
,>#\aO1n
可滚动、更新的记录集 rbOJ;CK
1、创建可滚动、更新的Statement RUr ~u
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); zU[o_[+7^
该Statement取得的ResultSet就是可滚动的 dlyGgaV*X
2、创建PreparedStatement时指定参数 kT
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); *b~8`Opa`
ResultSet.absolute(9000); .]exY
i
批量更新 kj|Oj+&
1、Statement v1i-O'
Statement sm = cn.createStatement(); F
]X<q uuL
sm.addBatch(sql1); ;4-$C =&
sm.addBatch(sql2); >#n"r1
... $-^&AKc
sm.executeBatch() q;R&valn
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 cL .z{
2、PreparedStatement i'CK/l.H
PreparedStatement ps = cn.preparedStatement(sql); YL`ML t4MC
{ D|U bh ]
ps.setXXX(1,xxx); 'O 7:=l
... v2rzHzFU
ps.addBatch(); 5f_x.~ymA
} c^"4l
9w
ps.executeBatch(); nv0D4 t
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 gjD|f2*x
Gfx!.[Y
事务的处理 \$Ky AWrZi
1、关闭Connection的自动提交 #5y+gdN
cn.setAutoCommit(false); ^W}|1.uZ
2、执行一系列sql语句 IA}vN3
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close k2loGvBJ
Statement sm ; F+VNrt-
sm = cn.createStatement(insert into user...); Lm!]m\LRZD
sm.executeUpdate(); ox<6qW
sm.close(); $C=XSuPNK
sm = cn.createStatement("insert into corp...); c{`!$Z'k<
sm.executeUpdate(); ((AK7hb
sm.close(); PC"=B[OlJ
3、提交 4D5Wse
cn.commit(); D$KP>G
4、如果发生异常,那么回滚 | J'k9W"
cn.rollback();