java 数据库基本操作 pL1s@KR
1、java数据库操作基本流程 VY 1vXM3y
2、几个常用的重要技巧: %1McD{
可滚动、更新的记录集 24\gbv<
批量更新 )wzV
$(~
事务处理 1D([@)^
JbQZ!+
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 x4a:PuqmGG
1、取得数据库连接 cm>E[SHr
1)用DriverManager取数据库连接 ZX`J8lZP
例子 N1--~e
String className,url,uid,pwd; w5~i^x
className = "oracle.jdbc.driver.OracleDriver"; Xwu.AVsr
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Ln#a<Rx.E7
uid = "system"; =)<3pG O
pwd = "manager"; MXAEX2xmme
Class.forName(className); 9 |:^k.
Connection cn = DriverManager.getConnection(url,uid,pwd); ;\)=f6N
2)用jndi(java的命名和目录服务)方式 1|y$~R.H
例子 h%#_~IA:|
String jndi = "jdbc/db"; W 5DbFSgB
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); (
76{2
DataSource ds = (DataSource) ctx.lookup(jndi); 4B O %{
Connection cn = ds.getConnection(); (RF>s.B<
多用于jsp中 !r&Bn6*
2、执行sql语句 -]"T^wib
1)用Statement来执行sql语句 H"YL
k
String sql; s^|\9%WD
Statement sm = cn.createStatement(); =d20Xa
sm.executeQuery(sql); // 执行数据查询语句(select) }N3`gCy9eN
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); jq oPLbxT
2)用PreparedStatement来执行sql语句 nX
x=1*X
String sql; CUhV$A#oo
sql = "insert into user (id,name) values (?,?)"; [QEwK|!L
PreparedStatement ps = cn.prepareStatement(sql); Z$2L~j"=!
ps.setInt(1,xxx); V2`;4d X*2
ps.setString(2,xxx); V,4.$<e
... U}P,EP%p
ResultSet rs = ps.executeQuery(); // 查询 1MQ/r*(
int c = ps.executeUpdate(); // 更新 X=_Z(;<&
L{PH0Jf
3、处理执行结果 lCFU1 GHH
查询语句,返回记录集ResultSet ^8742.
更新语句,返回数字,表示该更新影响的记录数 IRB& j%LA
ResultSet的方法 i,OKfXp
1、next(),将游标往后移动一行,如果成功返回true;否则返回false XJFnih
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 3q~Fl=|.o
bXl8v
4、释放连接 O)5#Fcp(
cn.close(); i:k-"
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection *)%dXVf
9.8,q
可滚动、更新的记录集 X%J%A-k]
1、创建可滚动、更新的Statement 8eww7k^R
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); nVTM3Cz
该Statement取得的ResultSet就是可滚动的 i<:p.ug-O
2、创建PreparedStatement时指定参数 6UB6;-
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); + U5U.f%
ResultSet.absolute(9000); Y(z}[`2
批量更新 %c0z)R~
1、Statement W?PWJkIw
Statement sm = cn.createStatement(); (HSw%e
sm.addBatch(sql1); >ZDC . ~
sm.addBatch(sql2); $'u\B
... z@`@I
sm.executeBatch() Z!)f*
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 >nNl^ yqW
2、PreparedStatement 7kM4Ei
PreparedStatement ps = cn.preparedStatement(sql); >W~=]&7{s4
{ }z{wQ\
ps.setXXX(1,xxx); )8]3kQffJ=
... y {;u@o?T
ps.addBatch(); u2,H ]-
} <|Iyt[s
ps.executeBatch(); ~._ko
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 r$?Vx_f`Q
rBD2Si=
事务的处理 Wa}"SqYr h
1、关闭Connection的自动提交 S]b
xQa+
cn.setAutoCommit(false); g`.{K"N>!
2、执行一系列sql语句 0w+5'lOg
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close @|]G0&gn&?
Statement sm ; .SBc5KX
sm = cn.createStatement(insert into user...); F%y{%
C7l
sm.executeUpdate(); tKX}Ok:V%
sm.close();
BUV/twU)
sm = cn.createStatement("insert into corp...); J2=*-O:
sm.executeUpdate(); #\0TxG5'QA
sm.close(); ;6zPiaDQ
3、提交 ^Bn1;
cn.commit(); P_mi)@
4、如果发生异常,那么回滚 Bf+^O)Ns^
cn.rollback();