java 数据库基本操作 Hy_}e"
1、java数据库操作基本流程 V*|#j0}b
2、几个常用的重要技巧: %"1*,g{
可滚动、更新的记录集 4raKhN"
批量更新 1l~(J:DT
事务处理 Za&.sg3RG
mHnHB.OL
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 4Y=sTXbFt
1、取得数据库连接 :Hn*|+'
1)用DriverManager取数据库连接 R>3a?.X
例子 9qqzCMrI0e
String className,url,uid,pwd; "(U%Vg|)
className = "oracle.jdbc.driver.OracleDriver"; /{j")
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; +yh-HYo`
uid = "system"; s[ CnJZ\q
pwd = "manager"; c<(LXf+61
Class.forName(className); 5T,In+~Kd
Connection cn = DriverManager.getConnection(url,uid,pwd); Dn}Wsd=
2)用jndi(java的命名和目录服务)方式 /j{`hi
例子 W/U_:^[-
String jndi = "jdbc/db"; $?dAO}f3O)
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ^J([w~&
DataSource ds = (DataSource) ctx.lookup(jndi); x+L
G4++
Connection cn = ds.getConnection(); R
m{\ R
多用于jsp中 8ol R#>
2、执行sql语句 icX$<lD
1)用Statement来执行sql语句 !A 6l\_
String sql; nt"8kv
Statement sm = cn.createStatement(); #*g .hL<
sm.executeQuery(sql); // 执行数据查询语句(select) y[}O(
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); `$X|VAS2
2)用PreparedStatement来执行sql语句 _>/T<Db
String sql; q0}?F
sql = "insert into user (id,name) values (?,?)"; Xgy)Z:R
PreparedStatement ps = cn.prepareStatement(sql); Cw=wU/)
ps.setInt(1,xxx); ic"n*SZa
ps.setString(2,xxx); Vs)%*1><
... 'm;M+:l
6
ResultSet rs = ps.executeQuery(); // 查询 4-?'gN_
int c = ps.executeUpdate(); // 更新 a-`OE"
f[@M
3、处理执行结果 ]Tje6iF
查询语句,返回记录集ResultSet `%2e?"OOJ
更新语句,返回数字,表示该更新影响的记录数 h-XMr_F
ResultSet的方法 pvz*(u
1、next(),将游标往后移动一行,如果成功返回true;否则返回false a=55bEn
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 yqg&dq
n&. bs7N2
4、释放连接 I82?sQ7
cn.close(); doCWJ
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection &wZ ggp
iw Hy!Vi-5
可滚动、更新的记录集 brQkVt_)EE
1、创建可滚动、更新的Statement 3X+uJb2
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); bb6
~H
该Statement取得的ResultSet就是可滚动的 @~!1wPvF`I
2、创建PreparedStatement时指定参数 dBV^Khf J
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ~YIGOL"?
ResultSet.absolute(9000); gyW*-:C
批量更新 ?kICYtY:_b
1、Statement )P^5L<q>|
Statement sm = cn.createStatement(); u}QB-oU
sm.addBatch(sql1); e JMD8#
sm.addBatch(sql2); Y$^x.^dT,
... 26fm}QV
sm.executeBatch() _v=@MOI/J
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 tQ7DdVdix
2、PreparedStatement :x*8*@kC
PreparedStatement ps = cn.preparedStatement(sql); (D'Z4Y
{ E"Z9 NDgl#
ps.setXXX(1,xxx); i^{.Q-
... PmtBu`OkV
ps.addBatch(); (89NK]2x
} @<]xbWhuw
ps.executeBatch(); #vy:aq<bjE
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 [aF?1KxNMt
]fXMp*LvY
事务的处理 =&*:)
1、关闭Connection的自动提交 #e.2m5T
cn.setAutoCommit(false); yQ4]LyS
2、执行一系列sql语句 W{Cc wq
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close r}i<cyL
Statement sm ; gmfux
b/
sm = cn.createStatement(insert into user...); "(}xIsy
sm.executeUpdate(); s-eC' )w~E
sm.close(); Y&xmy|O#
sm = cn.createStatement("insert into corp...); Xj^6ZJc
sm.executeUpdate(); 7z
\I\8
sm.close(); ?)#dP8n
3、提交 2}u hPW+
cn.commit(); SGW2'
4、如果发生异常,那么回滚 oK h#th
cn.rollback();