java 数据库基本操作 =[`B -?
1、java数据库操作基本流程 vjmNS=l
2、几个常用的重要技巧: ch!/k
可滚动、更新的记录集 "`s{fy~mV
批量更新 e+Vn@-L;
事务处理 s$s~p
+U
,'Zs")Ydp
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 V\vt!wBcB
1、取得数据库连接 IZn|1X?}\s
1)用DriverManager取数据库连接 IN~Q(A]Z%
例子 E:(DidSE@
String className,url,uid,pwd; \W4|.[
className = "oracle.jdbc.driver.OracleDriver"; @vs+)aRa
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; tFn_{fCc>
uid = "system"; 5LM Ay"
pwd = "manager"; t}w<xe
Class.forName(className); b9X"p*'p
Connection cn = DriverManager.getConnection(url,uid,pwd); b8@?fC+tm
2)用jndi(java的命名和目录服务)方式 gwO]U=Y
例子 n|q$=jE
String jndi = "jdbc/db"; clyZD`*
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); _<}oBh
DataSource ds = (DataSource) ctx.lookup(jndi); n.F^9j+V
Connection cn = ds.getConnection(); fAYp\k
多用于jsp中 crTRfqF
2、执行sql语句 Nz1u:D]
1)用Statement来执行sql语句
)&Af[mS
String sql; zO)Bf(
Statement sm = cn.createStatement(); 4sMA'fG
sm.executeQuery(sql); // 执行数据查询语句(select) N.(wR
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); -Ph"#R&
2)用PreparedStatement来执行sql语句 bS7%%8C
String sql; @?e+;Sx
sql = "insert into user (id,name) values (?,?)"; QN)EPS:y
PreparedStatement ps = cn.prepareStatement(sql); Q!.JV.(
ps.setInt(1,xxx); ^Q,-4\ec
ps.setString(2,xxx); 5d|hP4fEc
... fkk&pu
ResultSet rs = ps.executeQuery(); // 查询 1K\zamBg
int c = ps.executeUpdate(); // 更新 upi\pXv
As"%
u
3、处理执行结果 VYG o;
查询语句,返回记录集ResultSet DsX+/)d
更新语句,返回数字,表示该更新影响的记录数 o@2Y98~Q}
ResultSet的方法 \8Y62
1、next(),将游标往后移动一行,如果成功返回true;否则返回false &uP,w#
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 eU(cn8/}
7G':h0i8
4、释放连接 %/.yGAPkx
cn.close();
|pgrR7G'
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection vX30Ijm
l\tg.O~
可滚动、更新的记录集 *E.uqu>I
1、创建可滚动、更新的Statement b@X+vW{S
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); b=+3/-d
该Statement取得的ResultSet就是可滚动的 T$!Pkdh
2、创建PreparedStatement时指定参数 BMi5F?Q'G
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); 5LaF'>1yY
ResultSet.absolute(9000); OJ?U."Lxm$
批量更新 dj-/%MU
1、Statement T\v~"pMu*0
Statement sm = cn.createStatement(); &a8%j+j
sm.addBatch(sql1); zt!)7HBo
sm.addBatch(sql2); =W[M=_0u
... JIatRc?g
sm.executeBatch() !(A<
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 5D+rR<pD}"
2、PreparedStatement Fe L !%z
PreparedStatement ps = cn.preparedStatement(sql); ?uh%WN6nU]
{ =[do([A
ps.setXXX(1,xxx); adY ,Nz
... %_(X n
ps.addBatch(); {&TP&_|H
} 9s4>hw@u
ps.executeBatch(); {iXQUj
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 .C|dGE?,
__%){j6
事务的处理 fL(_V/p^
1、关闭Connection的自动提交 Q3<ctd\]Y
cn.setAutoCommit(false); l3N '@GO
2、执行一系列sql语句 dt5`UBvUg
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close UX24*0`\~
Statement sm ; d~qZ;uw
sm = cn.createStatement(insert into user...); \)M
EM=U
sm.executeUpdate(); 7<0oK|~c#
sm.close();
y?'Z'
sm = cn.createStatement("insert into corp...); blx"WVqo
sm.executeUpdate(); s{uSU1lQn
sm.close(); Lky T4HC8n
3、提交 JuDadIrd{
cn.commit(); X"!tx
4、如果发生异常,那么回滚 EG!Nsb^,
cn.rollback();