java 数据库基本操作 c ~M'O26bW
1、java数据库操作基本流程 cgcU2N6y;
2、几个常用的重要技巧: Ye^#]%m
可滚动、更新的记录集 Yh,,(V6
批量更新 aEUEy:.
事务处理 heES
[
=J-&usX
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 % T$!I (L&
1、取得数据库连接 fuf'r>1n
1)用DriverManager取数据库连接 Cs]\3R|D`
例子 J{;\TNkJ
String className,url,uid,pwd; "2!5g )iO
className = "oracle.jdbc.driver.OracleDriver"; q.hpnE~#lh
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; W)2k>cS
uid = "system"; c]ll89`||
pwd = "manager"; }!kvoV)]1
Class.forName(className); 7Or?$
Connection cn = DriverManager.getConnection(url,uid,pwd); 3cqc<
2)用jndi(java的命名和目录服务)方式 M%13b$i~f
例子 J"eE9FLM
String jndi = "jdbc/db"; RXO}mu]Iu
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); M&(0n?R"R
DataSource ds = (DataSource) ctx.lookup(jndi); !{r@ H+Kf
Connection cn = ds.getConnection(); 'cN3Vv k
多用于jsp中 9$sx+=(
2、执行sql语句 [2!?pVI
1)用Statement来执行sql语句 *[3tGiU J
String sql; fn//j7 j
Statement sm = cn.createStatement(); uMFV^&ZF
sm.executeQuery(sql); // 执行数据查询语句(select) BC%V<6JBu(
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 2Zq_zvKUt
2)用PreparedStatement来执行sql语句 ;k1VY
Ie}
String sql; #%CB`l
sql = "insert into user (id,name) values (?,?)"; <7%#RJw e
PreparedStatement ps = cn.prepareStatement(sql); Zh:@AFz:R
ps.setInt(1,xxx); W1}d6Sbg
ps.setString(2,xxx); =b3<}]
... -!j5j:RR
ResultSet rs = ps.executeQuery(); // 查询 [r1\FF@v,
int c = ps.executeUpdate(); // 更新 > W^"*B
)P W Zc?M
3、处理执行结果 |'k7 ;UW
查询语句,返回记录集ResultSet jjoyMg95
更新语句,返回数字,表示该更新影响的记录数 =,U~
ResultSet的方法 Cj)*JZVG
1、next(),将游标往后移动一行,如果成功返回true;否则返回false +o6"Z)
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 I&&[ ':
|3EKK:RE
4、释放连接 uw&p)
cn.close(); gr>>]C$
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Coe%R(x5
)k 6z
可滚动、更新的记录集 r [n vgzv@
1、创建可滚动、更新的Statement O3L:v{Kn
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); ];{CNDAL2
该Statement取得的ResultSet就是可滚动的 l\bgp3.+
2、创建PreparedStatement时指定参数 CDFX>>N
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ;3O=lo:$~
ResultSet.absolute(9000); ^hwTnW9Z1:
批量更新 ;`Wh^Qgi
1、Statement }@A{'q5y
Statement sm = cn.createStatement(); V*+Z=Y'
sm.addBatch(sql1); IDt7KJ@hc
sm.addBatch(sql2); @ojV8
... u$V@akk
sm.executeBatch() mk`#\=GE
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 UTxqqcqEny
2、PreparedStatement y=e|W=<D&
PreparedStatement ps = cn.preparedStatement(sql); Tml>>O
{ hLSas#B>
ps.setXXX(1,xxx); G8CM
... JN<u4\e{-&
ps.addBatch(); X./7b{Pax
} u`Zj~t
ps.executeBatch(); Z2{G{]EV(
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 G4K3qD#+H
WaDdZIz4
事务的处理 V53iWWaFe
1、关闭Connection的自动提交 D"s
]dQ$r
cn.setAutoCommit(false); 68a
2、执行一系列sql语句 `yua?n
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close RATW[(ZA
Statement sm ; 8(GJz ~y
sm = cn.createStatement(insert into user...); }woNI
sm.executeUpdate(); .5YW>P V
sm.close(); {#TZFB
sm = cn.createStatement("insert into corp...); X2C&q$8
sm.executeUpdate(); } |? W
sm.close(); a.G;s2>
3、提交 s#C~HK
cn.commit(); 05[k@f$n
4、如果发生异常,那么回滚 ,=t}|!jx
cn.rollback();