java 数据库基本操作 =Zq6iMD
1、java数据库操作基本流程 $D^\[^S
2、几个常用的重要技巧: )7>GXZG>=
可滚动、更新的记录集 AByl1)r|
批量更新 @t9HRL?T~
事务处理 ^PZ[;F40
S<i$0p8J;
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 {@InOo!4w]
1、取得数据库连接 KZppQ0
1)用DriverManager取数据库连接 p;+O/'/j
例子 N[I@}j
String className,url,uid,pwd; XN df
className = "oracle.jdbc.driver.OracleDriver"; 7rjl-FUA~
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; GE/!$3
uid = "system"; ${ {4L?7
pwd = "manager"; {[H_Vl@
Class.forName(className); C*Vm}|)
Connection cn = DriverManager.getConnection(url,uid,pwd); {D4FYr
J
2)用jndi(java的命名和目录服务)方式 {*yvvb
例子 0JlNUO5Nt
String jndi = "jdbc/db"; 3( BL
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); X0.H(p#s
DataSource ds = (DataSource) ctx.lookup(jndi); / Q1*Vh4
Connection cn = ds.getConnection(); '}Fe&%
多用于jsp中 yfG;OnkZ
2、执行sql语句 46:<[0Psl/
1)用Statement来执行sql语句 uH[WlZ4
String sql; ppAbG,7
Statement sm = cn.createStatement(); 0?7yM:!l
sm.executeQuery(sql); // 执行数据查询语句(select) PIri|ZS
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); V\L;EHtc$
2)用PreparedStatement来执行sql语句 is<:}z
String sql; .vu7$~7
sql = "insert into user (id,name) values (?,?)"; .WF"vUp
PreparedStatement ps = cn.prepareStatement(sql); kKyU?/aj
ps.setInt(1,xxx); b"I#\;Ym
ps.setString(2,xxx); 2 2v"?*
... cgb>Naa<
ResultSet rs = ps.executeQuery(); // 查询 h.\I
tK{)
int c = ps.executeUpdate(); // 更新 Tv ``\<
l9.`2d]o
3、处理执行结果 k~tEUsv
查询语句,返回记录集ResultSet ._}}@V_/
更新语句,返回数字,表示该更新影响的记录数 WcN4ff-
ResultSet的方法 :aNjh
1、next(),将游标往后移动一行,如果成功返回true;否则返回false -"[4E0g0
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 v
vErzUxN
cIU2 qFn[
4、释放连接 Z<vz%7w
cn.close(); A0{xt*g
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection t!?`2Z5
!l'nX
可滚动、更新的记录集 |;gx;qp4cN
1、创建可滚动、更新的Statement EG{+Sz
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); n`5Nf
该Statement取得的ResultSet就是可滚动的 v$}^$8`
2、创建PreparedStatement时指定参数 ' @!&{N
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); G@7^M}
ResultSet.absolute(9000); 4:V
+>Jt
批量更新 Jq_\r'YE
1、Statement S@,/$L
Statement sm = cn.createStatement(); )PN8HJAArh
sm.addBatch(sql1); K?l|1jez(#
sm.addBatch(sql2); gfL :SP8
... ('z=/"(l
sm.executeBatch() o-<i+ To%
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 $[T~<I
2、PreparedStatement $JFjR@j
PreparedStatement ps = cn.preparedStatement(sql); 2Io|?
{ rc=E%Qv%?
ps.setXXX(1,xxx); 392V\qtS
... 7?fgcb3
ps.addBatch(); ?'V78N sA
} st w@@GQ
ps.executeBatch(); 01n!T2;yW}
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 D^r g-E[L
+Nn >*sz
事务的处理 >@N.jw>#T
1、关闭Connection的自动提交 1]}\h]*
cn.setAutoCommit(false); !&U75FpN}:
2、执行一系列sql语句 <$nPGz)}
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Q=Q+*oog
Statement sm ; d!I%AlV
sm = cn.createStatement(insert into user...); ?O25k!7
sm.executeUpdate(); i@/% E~ W
sm.close(); =9&2udV1
sm = cn.createStatement("insert into corp...); JQ+Mg&&Q
sm.executeUpdate(); 2^XmtT
sm.close(); u$w.'lK
3、提交 @5Z|e
cn.commit(); }wf8y
4、如果发生异常,那么回滚 sX?arI=_U
cn.rollback();