java 数据库基本操作 kP,7Li\
1、java数据库操作基本流程 r#~K[qb
2、几个常用的重要技巧: dm^H5D/A
可滚动、更新的记录集 U'3Fou}
批量更新 +0#JnqH"
事务处理 Hql5oA
`facFt[\
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 {fG|_+tl3o
1、取得数据库连接 -Z?Ck!00
1)用DriverManager取数据库连接 F RH&B5w
例子 lYQtv=q
String className,url,uid,pwd; R#6H'TVE
className = "oracle.jdbc.driver.OracleDriver"; Y-&|VE2
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 2lz
{_9
uid = "system"; G\/IM
pwd = "manager"; Hhf72IX
Class.forName(className); Wu{&;$
Connection cn = DriverManager.getConnection(url,uid,pwd); =WRO\lgv.
2)用jndi(java的命名和目录服务)方式 3h JH(ToO
例子 Dt {')
String jndi = "jdbc/db"; Y.
TYc;
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); _bQL[eXd
DataSource ds = (DataSource) ctx.lookup(jndi); tBl#o ^
Connection cn = ds.getConnection(); /VtlG+dLl
多用于jsp中 HU[oR4E
2、执行sql语句 i=da,W=0
1)用Statement来执行sql语句 5^|"_Q#:
String sql; ]GS~i+ =M
Statement sm = cn.createStatement(); RSH/l;ii
sm.executeQuery(sql); // 执行数据查询语句(select) z_(eQP])
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); !"(u_dFw
2)用PreparedStatement来执行sql语句 8?Wgawx
String sql; v!!;js^
sql = "insert into user (id,name) values (?,?)"; T 'i~_R6
PreparedStatement ps = cn.prepareStatement(sql); o4'v> b
ps.setInt(1,xxx); $n*%v85
ps.setString(2,xxx); &l!$Sw-u;
... o_:Qk;t
ResultSet rs = ps.executeQuery(); // 查询 6<76O~hNZ
int c = ps.executeUpdate(); // 更新 0o;~~\fq.
9%TT>2#
3、处理执行结果 =5_y<0`4
查询语句,返回记录集ResultSet #O6
EP#B
更新语句,返回数字,表示该更新影响的记录数 fIEw(k<*
ResultSet的方法 C
>kmIw'
1、next(),将游标往后移动一行,如果成功返回true;否则返回false o>K &D$J;O
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 DrFu r(=T
T:n<db,Px
4、释放连接 WJcVQMs
cn.close(); 4@~a<P#
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection afy/K'~
SEU\}Ni{
可滚动、更新的记录集 }MjQP R
1、创建可滚动、更新的Statement O"QHb|j
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); CSH`pU
该Statement取得的ResultSet就是可滚动的 u7(];
2、创建PreparedStatement时指定参数 =f4<({9
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); h+xA?[c=
ResultSet.absolute(9000); ,7I},sZj
批量更新 /b+;:
z
1、Statement Z*h ;e;
Statement sm = cn.createStatement(); -Qg,99M
sm.addBatch(sql1); wzxdVn
'S
sm.addBatch(sql2); E4i@|jE~)
... rV U:VL`2
sm.executeBatch() 9C?cm:
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 FRS28D
2、PreparedStatement DOT=U
_
PreparedStatement ps = cn.preparedStatement(sql); 6ZTaQPtm
{ Zr9 d&|$
ps.setXXX(1,xxx); vh{9'vd3el
... %2zas(b9j
ps.addBatch(); (qj,GmcS
} 9[,s4sxH
ps.executeBatch(); - &NQ\W
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 86#-q7aX
${@q?iol
事务的处理 km}MqBQl
1、关闭Connection的自动提交 fK);!Hh
cn.setAutoCommit(false); dWjx"7^
2、执行一系列sql语句 e|~C?Ow'J
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close QK'`=MU
Statement sm ; ennR@pg
sm = cn.createStatement(insert into user...); V 1*Ad
sm.executeUpdate(); 44Q9 *."
sm.close(); U~CdU
sm = cn.createStatement("insert into corp...); Y.(v{l
sm.executeUpdate(); >6k}HrS1V
sm.close(); "'~|}x1Uv
3、提交 quY "
cn.commit(); n{L:MT9TD
4、如果发生异常,那么回滚 lD-V9
cn.rollback();