java 数据库基本操作 q[]!V0Ek10
1、java数据库操作基本流程 )_T[thf]
2、几个常用的重要技巧: ^(8 i``V
可滚动、更新的记录集 &86kmFA
批量更新 1){1 HK
事务处理 +asJV1a
t8s1d
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 l)z15e5X
1、取得数据库连接 Q8M&nf
1)用DriverManager取数据库连接 nJ4h9`[>V
例子 ) BTJs)E
String className,url,uid,pwd; ]}9y>+>
className = "oracle.jdbc.driver.OracleDriver"; #;H,`r
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; QB@qzgEJ!,
uid = "system"; f?F
i{m
pwd = "manager"; 8'*z>1ZS5
Class.forName(className); Z`"UT#^SI
Connection cn = DriverManager.getConnection(url,uid,pwd); ,ewg3mYHC&
2)用jndi(java的命名和目录服务)方式 #hd<5+$U}l
例子 ~GfcI:Zz&
String jndi = "jdbc/db"; <uL?7P
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); 'oTcx Jx
DataSource ds = (DataSource) ctx.lookup(jndi); NV;5T3
Connection cn = ds.getConnection(); z$-/yT"M
多用于jsp中 $'X*L e@k
2、执行sql语句 tZa)sbz
1)用Statement来执行sql语句 B>o\;) l3O
String sql; xn@?CP`-y
Statement sm = cn.createStatement(); scqG$~O)
sm.executeQuery(sql); // 执行数据查询语句(select) 1q~U3'l:$
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); pP?J(0Q~
2)用PreparedStatement来执行sql语句 T]EXm/
String sql; Sct-,K%i
sql = "insert into user (id,name) values (?,?)"; Vw9^otJu
PreparedStatement ps = cn.prepareStatement(sql); *@G4i
ps.setInt(1,xxx); 5G){7]P+r"
ps.setString(2,xxx); *^c4q|G.-
... v! @/
ResultSet rs = ps.executeQuery(); // 查询 ItKwB+my
int c = ps.executeUpdate(); // 更新 1elcP`N1
]qXHalHY
3、处理执行结果 FTCp3g
查询语句,返回记录集ResultSet -ihF)^"a
更新语句,返回数字,表示该更新影响的记录数 }#<Sq57n
ResultSet的方法 ;y6Jo
1、next(),将游标往后移动一行,如果成功返回true;否则返回false A>>@&c:(
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ]02 l!"
1y0.tdI(
4、释放连接 2I ?HBz1v
cn.close(); j#&sZ$HQ4
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 4>Uo0NfL
l(=#c/f
可滚动、更新的记录集 e^&YQl
1、创建可滚动、更新的Statement um#;S;
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 92Ar0j]
该Statement取得的ResultSet就是可滚动的 M|d[iaM,
2、创建PreparedStatement时指定参数 8)"KPr63M
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); S;ulJ*qv
ResultSet.absolute(9000); #A]7cMZ'W
批量更新 bdaZ{5^{
1、Statement (^a;2j9
Statement sm = cn.createStatement(); L{^DZg|E
sm.addBatch(sql1); pJa FPO..|
sm.addBatch(sql2); &%qD Som3
... )r?i^D&4
sm.executeBatch() \U !<-
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 4N$svA
2、PreparedStatement .[2MPjg
PreparedStatement ps = cn.preparedStatement(sql); f[.hN
{ -&,NM
ps.setXXX(1,xxx); x0lX6
|D
... fwsq:
ps.addBatch(); h%=b"x
} xA!o"VZPq7
ps.executeBatch(); Z(as@gjH
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 `t!iknOQ$
aGpRdF1;!
事务的处理 zo} SS[
1、关闭Connection的自动提交 Vg
\-^$
cn.setAutoCommit(false); a
_
2、执行一系列sql语句 i+&="Z@
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close ~d5"<`<^o
Statement sm ; _\]D<\St
sm = cn.createStatement(insert into user...); z(\H.P#
sm.executeUpdate(); oSa FmP
sm.close(); 34;c00
sm = cn.createStatement("insert into corp...); Ac7`nvI=
sm.executeUpdate(); "E''ZBLO~
sm.close(); &2xYG{Z
3、提交 Jh466;
E
cn.commit(); [0 &Lvx
4、如果发生异常,那么回滚 &/JnAfmYqt
cn.rollback();