java 数据库基本操作 Bl*}*S PU
1、java数据库操作基本流程 8 ECX[fw
2、几个常用的重要技巧: eD?&D_l~6
可滚动、更新的记录集 ly-(F2
批量更新 cf88Fd6l/
事务处理 Oj;*Gi9E
{YgU23;q
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 iCPm7AU
1、取得数据库连接 U\p`YZ
1)用DriverManager取数据库连接 MzD1sWmK
例子 w.-x2Zg},
String className,url,uid,pwd; _"ciHYHBQ
className = "oracle.jdbc.driver.OracleDriver"; cvaG[NF
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ;NR|Hi]
uid = "system"; A<ds+0
pwd = "manager"; uYMn VE"
Class.forName(className); Xj
1Oxm42
Connection cn = DriverManager.getConnection(url,uid,pwd); >!t3~q1Cn
2)用jndi(java的命名和目录服务)方式 _6nAxm&x`%
例子 d 2d-Mk
String jndi = "jdbc/db"; 393c |8M
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 4AS%^&ah
DataSource ds = (DataSource) ctx.lookup(jndi); >UvP/rp
Connection cn = ds.getConnection(); Jv8:GgSg
多用于jsp中 Z0fa;%:
2、执行sql语句 B;r_[^
1)用Statement来执行sql语句 3'Y-~^ml|
String sql; ^Hv&{r77
Statement sm = cn.createStatement(); W;Y^(f
sm.executeQuery(sql); // 执行数据查询语句(select) M
bWby'
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); =I`S7oF
2)用PreparedStatement来执行sql语句 }6@E3z]AMO
String sql; hBjU(}\3
sql = "insert into user (id,name) values (?,?)"; 6u0>3-[6OD
PreparedStatement ps = cn.prepareStatement(sql); #NW+t|E
ps.setInt(1,xxx); Jt=->
ps.setString(2,xxx); !+%gJiu:
... [UA*We 1
ResultSet rs = ps.executeQuery(); // 查询 ,*J@ic7"
int c = ps.executeUpdate(); // 更新 s/tLY/U/
>$JE!.p%o
3、处理执行结果 C< c6Ub
查询语句,返回记录集ResultSet Z 2N6r6
更新语句,返回数字,表示该更新影响的记录数 Vr
EGR$
ResultSet的方法 w$:\!FImx
1、next(),将游标往后移动一行,如果成功返回true;否则返回false gx.\H3y
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 In1W/?
;OlnIxH(W
4、释放连接 c!ZZMCs
cn.close(); k( :Bl
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection rLsY_7!
E`o_R=%
可滚动、更新的记录集 A|\A|8=b
1、创建可滚动、更新的Statement ,`}yJ*7
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); pUHgjwT'U
该Statement取得的ResultSet就是可滚动的 ! :&SfPv
2、创建PreparedStatement时指定参数 ,VS\ mG/}s
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); %JM$]
ResultSet.absolute(9000); i1cd9
批量更新 0vqVE]C
1、Statement J\y^T3Z
Statement sm = cn.createStatement(); I=kqkuW
sm.addBatch(sql1); O>' }q/
sm.addBatch(sql2); g8Ex$,\,
... .;4N:*hY
sm.executeBatch() !T,<p
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 x4I!f)8Q
2、PreparedStatement tnJ7m8JmC
PreparedStatement ps = cn.preparedStatement(sql); F9
r5 Z
{ h9QM
nH'
ps.setXXX(1,xxx); SaXt"Ju,AH
... Zi~.
ps.addBatch(); 1eD#-tzV
} pTCD1)
ps.executeBatch();
;j26(dH
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 s9ix&m
nK;d\DO
事务的处理 y||
n9
1、关闭Connection的自动提交 t`8Jz~G`
cn.setAutoCommit(false); R4'.QZ-x
2、执行一系列sql语句 3+Lwtb}XPF
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close a51(ySC}<s
Statement sm ; ;\7`G!q
sm = cn.createStatement(insert into user...); sE?%;uBb
sm.executeUpdate(); |HycBTN#E
sm.close(); OkciL]
sm = cn.createStatement("insert into corp...); %unn{92)
sm.executeUpdate(); @} r*KF-
sm.close(); PaaMh[OmG
3、提交 B~I ]3f
cn.commit(); ,7B7X)m{3
4、如果发生异常,那么回滚 P8YnKyI,.
cn.rollback();