java 数据库基本操作 5 5>^H1M
1、java数据库操作基本流程 |tC!`.^\
2、几个常用的重要技巧: a]|P rjPI
可滚动、更新的记录集 `So*\#\T
批量更新 &uI`Xq.
事务处理 _V^^%$
3N|,c]|
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 T.HS.
1、取得数据库连接 x>m_ v
1)用DriverManager取数据库连接 ?ntyF-n&
例子 yeqZPzn
String className,url,uid,pwd; W6_/FkO
className = "oracle.jdbc.driver.OracleDriver"; (0g@Z`r
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; YQxVeS(
uid = "system"; \74+ cN
pwd = "manager"; ";AM3
Class.forName(className); PXz,[<ET?#
Connection cn = DriverManager.getConnection(url,uid,pwd); hJ 4]GA'
2)用jndi(java的命名和目录服务)方式 6":=p:PT.
例子 Z.Z+cFi
String jndi = "jdbc/db"; R_eKKi@VH
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); V4ml& D
DataSource ds = (DataSource) ctx.lookup(jndi); rwGY )9|
Connection cn = ds.getConnection(); ,d'x]&a
多用于jsp中 7Rqjf6kX`O
2、执行sql语句 3yn>9qt
1)用Statement来执行sql语句 N1`/~Gi
String sql; HWG5Ghu8,)
Statement sm = cn.createStatement(); )<-\ F%&b
sm.executeQuery(sql); // 执行数据查询语句(select) Eqj&SA
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); /DA'p [,
2)用PreparedStatement来执行sql语句 _@wXh-nc
String sql; ^noKk6Aaa
sql = "insert into user (id,name) values (?,?)"; #Y`GWT1==
PreparedStatement ps = cn.prepareStatement(sql); avrf]raM|
ps.setInt(1,xxx); */fmy|#
ps.setString(2,xxx); g+|1khS)
... ~ \z7$9Q
ResultSet rs = ps.executeQuery(); // 查询 CKeT%3
int c = ps.executeUpdate(); // 更新 '+LC.l M
Xn^gxOPM
3、处理执行结果 |fkz=*rn
查询语句,返回记录集ResultSet eS{lr4-]
更新语句,返回数字,表示该更新影响的记录数 . S4Xw2MS
ResultSet的方法 ohklLZoZ
1、next(),将游标往后移动一行,如果成功返回true;否则返回false MX2Zm
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 q '9u8b
.I_Mmaq;i
4、释放连接 *P]FX-D3
cn.close(); ('QfB<4H1
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection `2Rd=M]?
J@ZIW%5
可滚动、更新的记录集 60(j[d-$p
1、创建可滚动、更新的Statement LK5,GWF;
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); 'M+iw:R__
该Statement取得的ResultSet就是可滚动的 2&7:JM~#
2、创建PreparedStatement时指定参数 H`|8x4
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); kBg,U 8|S
ResultSet.absolute(9000); i_8v >F
批量更新 97;`R[^J
1、Statement ~{lSc/SP|
Statement sm = cn.createStatement(); D#R5G
sm.addBatch(sql1); KvW{M
sm.addBatch(sql2); X<{kf-GP
... P Llad\
sm.executeBatch() Y3^UJe7E
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 p(o"K@I
2、PreparedStatement LldZ"%P
PreparedStatement ps = cn.preparedStatement(sql); _3v6c
{ *\><MXx
ps.setXXX(1,xxx); 8i"v7}
...
g93-2k,
ps.addBatch(); L,6v!9@
} |Xz-rgkQ
ps.executeBatch(); y}Ji( q~
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 1h_TG.YL9>
IJ >qs8
事务的处理 nKpXRuFn\
1、关闭Connection的自动提交 NH+?7rf8
cn.setAutoCommit(false); L|O[u^
2、执行一系列sql语句 W
u?A} fH
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close &f48MtE
Statement sm ; [H ^ktF
sm = cn.createStatement(insert into user...); /Ilve
U`E
sm.executeUpdate(); 6Q\0v
sm.close(); =Ts2a"n
sm = cn.createStatement("insert into corp...); 8[@aX;I
sm.executeUpdate(); mAO$gHQ
sm.close(); 5DB4 vh
3、提交 SStaS<q'
cn.commit(); 2:b3+{\f
4、如果发生异常,那么回滚 {yFCGCs
cn.rollback();