java 数据库基本操作 t;XS;b%
1、java数据库操作基本流程 *cy.*@d
2、几个常用的重要技巧: &U0WkW
可滚动、更新的记录集
/Ef4EX0
批量更新 ZE ^u .>5
事务处理 dAwS<5!
wL'C1Vr
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 q"p#H 8
1、取得数据库连接 !pV<n
1)用DriverManager取数据库连接 1G_xP^H!
例子 a}GAB@YI
String className,url,uid,pwd; Vd[2u
className = "oracle.jdbc.driver.OracleDriver"; |3|wdzV
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 7rPLnB]
uid = "system"; YrKFa%k
pwd = "manager"; 5EfY9}dl
Class.forName(className); S r[IoF)
Connection cn = DriverManager.getConnection(url,uid,pwd); 9 G((wiE
2)用jndi(java的命名和目录服务)方式 z.A4x#>-
例子 ty9rH=1
String jndi = "jdbc/db"; Z#@6#S`
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); :3 PG f
DataSource ds = (DataSource) ctx.lookup(jndi); 7ozYq_ $
Connection cn = ds.getConnection(); e
Ri!\Fx
多用于jsp中 _jk|}IB;X
2、执行sql语句 ]t7ClT)n!
1)用Statement来执行sql语句 o[2Y;kP3*P
String sql; 1y(iE C
Statement sm = cn.createStatement(); ] :GfOgo
sm.executeQuery(sql); // 执行数据查询语句(select) |/2LWc?
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); (S 3jZ
2)用PreparedStatement来执行sql语句 `-5cQ2>"
String sql; hX %s]"
sql = "insert into user (id,name) values (?,?)"; TR|;,A[%v#
PreparedStatement ps = cn.prepareStatement(sql); ZG!x$yi$
ps.setInt(1,xxx); >5df@_'
ps.setString(2,xxx); )e#fj+>x)
... `GP3D~
ResultSet rs = ps.executeQuery(); // 查询 7ia"u+Y
int c = ps.executeUpdate(); // 更新 ]P
JH'=
H.)fOctbO
3、处理执行结果 IS .g);Gj
查询语句,返回记录集ResultSet t0+t9w/fTP
更新语句,返回数字,表示该更新影响的记录数 2kC^7ZAwu
ResultSet的方法 [gTQ-
1、next(),将游标往后移动一行,如果成功返回true;否则返回false V~JBZ}`TG<
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 *(>Jd|C
'>"`)-
4、释放连接 }[
7Nb90v
cn.close(); dV$3u"9
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection "C?:T'dW
rkbl/py
可滚动、更新的记录集 G)jG!`I
1、创建可滚动、更新的Statement [6oq##
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); xqU^I5Z
该Statement取得的ResultSet就是可滚动的 -fhAtxkg
2、创建PreparedStatement时指定参数 jDFp31_X
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); QZqpF9Eu
ResultSet.absolute(9000); ZyZl\\8U
批量更新 KhLg*EL
1、Statement D1"1MUSod
Statement sm = cn.createStatement(); S|s3}]g9
sm.addBatch(sql1); jw%fN!?
sm.addBatch(sql2); %+/f'6kR
... xAFek;GY?
sm.executeBatch() OE5 X8DqQe
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 _QD/!~O
2、PreparedStatement p.qrf7N$
PreparedStatement ps = cn.preparedStatement(sql); 9 J$Y,Z
{ &f$a1#O}dx
ps.setXXX(1,xxx); lF)0aDk'h
... $0ym_6n
ps.addBatch(); BYTXAZLb
} :t_}_!~
ps.executeBatch(); x|&[hFXD
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 ux)< &p.
f|;HS!$
事务的处理 p!. /
1、关闭Connection的自动提交 F%w\D9+P
cn.setAutoCommit(false); E
`?S!*jm
2、执行一系列sql语句 &;'w8_K"^
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close JkRGt Yq
Statement sm ; 9)8*FahW
sm = cn.createStatement(insert into user...); R:SIs\%o
sm.executeUpdate(); Vj?*=UL
sm.close(); DX]z=d)tc
sm = cn.createStatement("insert into corp...); 4da^d9ZOy
sm.executeUpdate(); cYBrRTrI#
sm.close(); bkJwP s
3、提交 hhN(;.
cn.commit(); ?*B;514
4、如果发生异常,那么回滚 tsCz+MP
cn.rollback();