java 数据库基本操作 z{o'
G3
1、java数据库操作基本流程 :gep:4&u
2、几个常用的重要技巧: T Kg aV;92
可滚动、更新的记录集 rV T{90,
批量更新 i}B2R$Z3
事务处理 >kW@~WDMu
oz}+T(@O
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 U
G~b a
1、取得数据库连接 +,#$:fs u
1)用DriverManager取数据库连接 v%iof1 T'
例子 k\NMy#]Zt
String className,url,uid,pwd; f)^_|8
className = "oracle.jdbc.driver.OracleDriver"; ~wkj&yVT
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; Ljp%CI[i
uid = "system"; K|:@Z
pwd = "manager"; j,"@?Wt7
Class.forName(className); !'cl"\h
Connection cn = DriverManager.getConnection(url,uid,pwd); 5'X ]k@m_
2)用jndi(java的命名和目录服务)方式 V0P>YQq9s
例子 kNobl
String jndi = "jdbc/db"; _s .G
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); v5QqS8u_C
DataSource ds = (DataSource) ctx.lookup(jndi); 2AO~HxF
Connection cn = ds.getConnection(); JYW)uJ
多用于jsp中 .K p
2、执行sql语句 >8qQK r\"
1)用Statement来执行sql语句 @CZT
String sql; E: $P=%b
Statement sm = cn.createStatement(); ,#L=v]
sm.executeQuery(sql); // 执行数据查询语句(select) 6er-{.L=
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); J
/f
2)用PreparedStatement来执行sql语句 JNJ=e,O,
String sql; e-"nB]n^/
sql = "insert into user (id,name) values (?,?)"; H?)w!QX
PreparedStatement ps = cn.prepareStatement(sql); Na?!;1]_
ps.setInt(1,xxx); RM!<8fXYD
ps.setString(2,xxx); 9*{[buZX
... )~HUo9K9
ResultSet rs = ps.executeQuery(); // 查询 k{Me[B
int c = ps.executeUpdate(); // 更新 >o7n+Rb:
29?,<bB)
3、处理执行结果 3tZ]4ms}
查询语句,返回记录集ResultSet 98uV6b~g
更新语句,返回数字,表示该更新影响的记录数 2gCX}4^3b
ResultSet的方法 er!DYv
1、next(),将游标往后移动一行,如果成功返回true;否则返回false :[hgxJu+
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 |~X ;1j!
L;'"A#Pa
4、释放连接
]y1OFKYv
cn.close(); Vp3ZwS
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection h3z{(-~y
?6fnpGX@a
可滚动、更新的记录集 @AIaC-,~]
1、创建可滚动、更新的Statement M>i9 i-dU
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); >76\nGO
该Statement取得的ResultSet就是可滚动的 VBcy9|lD
2、创建PreparedStatement时指定参数 %\H|B0
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Cif>7]M
ResultSet.absolute(9000); CkdP #}f
批量更新 ^7 &5
z&o
1、Statement Ipq"E
Statement sm = cn.createStatement(); ~s]iy9i
sm.addBatch(sql1); 8p@Piy{p
sm.addBatch(sql2); [g:$K5\64
... /M3Y~l$
sm.executeBatch() jO1r)hw N>
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 (tZrw5@
2、PreparedStatement /.o^R6
PreparedStatement ps = cn.preparedStatement(sql); .2v_H5<
{ .MJofE;Jn
ps.setXXX(1,xxx); ^w c"&;=c|
... EuyXgK>g
ps.addBatch(); /q5v"iX]T
} 37|&?||
ps.executeBatch(); ak |WW]R
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 z2QP)150
g'V>_u#(
事务的处理 -1UD0(
1、关闭Connection的自动提交 .tzG_
cn.setAutoCommit(false); :]^P1sH[
2、执行一系列sql语句 NT+?#0I
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close QUQu^p
Statement sm ; ~XWQhIAM4
sm = cn.createStatement(insert into user...); lJis~JLd`
sm.executeUpdate(); ;[u%_
sm.close(); obNqsyc77R
sm = cn.createStatement("insert into corp...); p|&Yku=
sm.executeUpdate(); 2L} SJUk*
sm.close(); g#t[LI9(F[
3、提交 2|}+T6_q
cn.commit(); Q^e}?v%=%3
4、如果发生异常,那么回滚 Y<Fz)dQo
cn.rollback();