java 数据库基本操作 "^Vnnb:Z*o
1、java数据库操作基本流程 J4%"38l
2、几个常用的重要技巧: *b7evU *1
可滚动、更新的记录集 % oJH 6F
批量更新 ]TVc 'G;
事务处理 {X5G
`y>BbJqy
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ~6=aoF5"3?
1、取得数据库连接 a$K6b5`>Rs
1)用DriverManager取数据库连接 ?{L5=X@$$
例子 s2`} ~
String className,url,uid,pwd; -e O>d}
className = "oracle.jdbc.driver.OracleDriver"; U1Y0G[i)
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; k%R(Qga
uid = "system"; qnFg7X>C,
pwd = "manager"; M1=eS@
Class.forName(className); {>UT'fa-
Connection cn = DriverManager.getConnection(url,uid,pwd); 3/y"kl:<-
2)用jndi(java的命名和目录服务)方式 :28[k~.bo
例子 f}EsS
String jndi = "jdbc/db";
RK/>5
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); WCY5F
DataSource ds = (DataSource) ctx.lookup(jndi); T9FGuit9
Connection cn = ds.getConnection(); !5
?<QKOe
多用于jsp中 3N?"s1U
2、执行sql语句 iUbcvF3aP
1)用Statement来执行sql语句 iD.p KG
String sql; cx[[K.
Statement sm = cn.createStatement(); i0u`J
sm.executeQuery(sql); // 执行数据查询语句(select) ):\+%v^
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 5?A<('2
2)用PreparedStatement来执行sql语句 `(r0+Qx
String sql; yU>ucuF
sql = "insert into user (id,name) values (?,?)"; d*x&Uh[K
PreparedStatement ps = cn.prepareStatement(sql); .qLXjU
ps.setInt(1,xxx); Bk]
`n'W
ps.setString(2,xxx); ^HU>fkSk
... u"Mf xW`
ResultSet rs = ps.executeQuery(); // 查询 h.\p+Qw.
int c = ps.executeUpdate(); // 更新 MoXai0d%
cv;2zq=T
3、处理执行结果 P6")OWd
查询语句,返回记录集ResultSet liBFx6\"S
更新语句,返回数字,表示该更新影响的记录数 Wr@q+Whq
ResultSet的方法 zSjZTA/Z
1、next(),将游标往后移动一行,如果成功返回true;否则返回false j$<g8Bg=o
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 \E6 0
5&.I9}[)j
4、释放连接 I+QM":2
cn.close(); #r,!-;^'p
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection cd`P'GDF
g 'Wr+(A_
可滚动、更新的记录集 Z5g*'
1、创建可滚动、更新的Statement U] P{~
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); )Fw#]~Z
该Statement取得的ResultSet就是可滚动的 y Ni3@f
2、创建PreparedStatement时指定参数 hY/qMK5
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Kpkpr`:)]
ResultSet.absolute(9000); 9VMk?
批量更新 &;RBG$t
1、Statement @YVla!5O@
Statement sm = cn.createStatement(); (G~M E>
sm.addBatch(sql1); _C=01 %/
sm.addBatch(sql2); _88X-~.
... zDBm^ s
sm.executeBatch() 21my9Ui]
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 wb%4f6i
2、PreparedStatement Ce~Pms]
PreparedStatement ps = cn.preparedStatement(sql); V+zn`
\a
{ +Ht(_+To1
ps.setXXX(1,xxx); _;R#B`9Iu
... TrNh,5+b
ps.addBatch(); a]J>2A@-I
} l
GJ N;G7
ps.executeBatch(); -v:3#9uX)
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 qoZe<jW (
KpIY>k
事务的处理 fm$Qd^E|e
1、关闭Connection的自动提交 !^EA}N.u
cn.setAutoCommit(false); N'PK4:
2、执行一系列sql语句 ~Lq`a@]A
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close YV'B*arIA
Statement sm ; )LNKJe+
sm = cn.createStatement(insert into user...); %0({MU
sm.executeUpdate(); q,OCA\
sm.close(); P~V ^Efz{
sm = cn.createStatement("insert into corp...); J\N&u#
sm.executeUpdate(); &XW~l>!+
sm.close(); 5=fS^]- F
3、提交 )(rr1^Xer
cn.commit(); D&=+PAX
4、如果发生异常,那么回滚 X5(oL
cn.rollback();