java 数据库基本操作 ?AY596
1、java数据库操作基本流程 y)U8\
2、几个常用的重要技巧: BU:s&+LYUv
可滚动、更新的记录集 451C2 %y
批量更新 qd3B>f
事务处理 2!dIW5I
UR-e'Z&]
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 7 pg8kq@
1、取得数据库连接 Uy ;oJY
1)用DriverManager取数据库连接 I}Q3B3Byg
例子 Fg4eIE-/M
String className,url,uid,pwd; Mz]LFM
className = "oracle.jdbc.driver.OracleDriver"; >C_! }~
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; pM[UC{
uid = "system"; oB3>0Pm*a.
pwd = "manager"; 0y'34}
Class.forName(className); y>8!qVX
Connection cn = DriverManager.getConnection(url,uid,pwd); Iu0K#.s_
2)用jndi(java的命名和目录服务)方式 LEVNywk[
例子 %8
cFzyE*
String jndi = "jdbc/db"; _a*Wk
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); hUGIy(
DataSource ds = (DataSource) ctx.lookup(jndi); G`|mP:T:o
Connection cn = ds.getConnection(); KUH&_yCRB
多用于jsp中 +cy(}Vp
2、执行sql语句 h.'h L
1)用Statement来执行sql语句 xKsn);].`
String sql; X?rJO~5
Statement sm = cn.createStatement(); XrSqUD
sm.executeQuery(sql); // 执行数据查询语句(select) oB9Fas!N
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); !9iVe7V
2)用PreparedStatement来执行sql语句 ,`+y4Z6`W2
String sql; *JO"8iLw
sql = "insert into user (id,name) values (?,?)"; XA9$n_|bw
PreparedStatement ps = cn.prepareStatement(sql); +}4vdi"
ps.setInt(1,xxx); ,O
a)
ps.setString(2,xxx); @uY%;%Pa8
... M~N'z/
ResultSet rs = ps.executeQuery(); // 查询 x+yt|
&B
int c = ps.executeUpdate(); // 更新 Q'~;RE%T
"@`mPe/
3、处理执行结果 ,\}V.:THF
查询语句,返回记录集ResultSet Ev0V\tl>0
更新语句,返回数字,表示该更新影响的记录数 =NJb9S&8A
ResultSet的方法 3CQpe
1、next(),将游标往后移动一行,如果成功返回true;否则返回false @292;qi
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Y/Y746I
lt0(Kf g
4、释放连接 b'9G`Y s^
cn.close(); G=Ka{J
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection D zDt:.JZ
8Qu].nKe
可滚动、更新的记录集 [zf9UUc~
1、创建可滚动、更新的Statement f.+e
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); l`$f@'k
该Statement取得的ResultSet就是可滚动的 {!oO>t
2、创建PreparedStatement时指定参数 qLYv=h$,
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Vg[U4,
ResultSet.absolute(9000);
]g?G0m
批量更新 P!bm$h*3?
1、Statement e4CG=K3s
Statement sm = cn.createStatement(); FLy|+4D_%4
sm.addBatch(sql1); , PN?_N
sm.addBatch(sql2); 103^\Av8
... ,st4K;-
sm.executeBatch() $#Ji=JX
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 u> >t"w
2、PreparedStatement 0HxF#SlKM
PreparedStatement ps = cn.preparedStatement(sql); -JwH^*Ad
{ fngZ0k!
ps.setXXX(1,xxx); Fd'Ang6"
... 8a?V h^
ps.addBatch(); Uk*s`Y
} ol`]6"Sc
ps.executeBatch(); ^Gs!" Y
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 kf5921(P
;ejC:3yO
事务的处理 ZTS*E,U%
1、关闭Connection的自动提交 7^Onq0ym T
cn.setAutoCommit(false); |Q:`:ODy`5
2、执行一系列sql语句 ]Dx?HBM"DC
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close nh9K(
Statement sm ; kt;X|`V{5z
sm = cn.createStatement(insert into user...); wRie{Vk
sm.executeUpdate(); /[EI0~P
sm.close(); `VBjH]$
sm = cn.createStatement("insert into corp...); .Uih|h
sm.executeUpdate(); >656if O
sm.close(); ,9+@\
3、提交 'w9tZO\2
cn.commit(); UhEJznfi
4、如果发生异常,那么回滚 &x=<>~Ag3
cn.rollback();