java 数据库基本操作 1,(uRS#bk
1、java数据库操作基本流程 DgRA\[c
2、几个常用的重要技巧: ,]8$QFf
可滚动、更新的记录集 Q(7M_2e7
批量更新 )ZQML0}P;
事务处理 rulw6vTB(
b8TwV_&|X
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 23JuuV.
1、取得数据库连接 mZb[Fi
1)用DriverManager取数据库连接 z\r|5Z
例子 *u?N{LkqS
String className,url,uid,pwd; [I4&E >
className = "oracle.jdbc.driver.OracleDriver"; c&u~M=EW
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; J<=k
[Q
uid = "system"; iJem9XXb
pwd = "manager"; oar`xH$C
Class.forName(className); X/-u$c
Connection cn = DriverManager.getConnection(url,uid,pwd); Q2HULz{
2)用jndi(java的命名和目录服务)方式 U8s&5~IPn
例子 bsgr g
String jndi = "jdbc/db"; p@bcf5'
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); i0e aBG]I
DataSource ds = (DataSource) ctx.lookup(jndi); 0F|DD8tHR
Connection cn = ds.getConnection(); Q2 @Ugt$
多用于jsp中 Nw|m"VLb
2、执行sql语句 u @eKh3!
1)用Statement来执行sql语句 {5N!udLDr5
String sql; SM@RELA'Lb
Statement sm = cn.createStatement(); L!V6Rfy
sm.executeQuery(sql); // 执行数据查询语句(select) `1qM Sq
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); -|&5aH]
2)用PreparedStatement来执行sql语句 ~lB:xVzn
String sql; R6/vhze4L2
sql = "insert into user (id,name) values (?,?)"; 'q9='TOk
PreparedStatement ps = cn.prepareStatement(sql); 990sE
t?
ps.setInt(1,xxx); X'KkIo
:
ps.setString(2,xxx); 9;k!dM
... ^lCQHz
ResultSet rs = ps.executeQuery(); // 查询 F^)SQ%xx
int c = ps.executeUpdate(); // 更新 t ]yD95|
T{Rhn V1
3、处理执行结果 o6~9.~_e
查询语句,返回记录集ResultSet gBCO>nJws
更新语句,返回数字,表示该更新影响的记录数 ~76qFZe-
ResultSet的方法 *g;4?_f
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 0'O*Y
]h+
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 .P>-Fh,_p
K%/:V
4、释放连接 6fr@y=s2:
cn.close(); 'AjDB:Mt$
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection UM QsYD)
56Gc[<nR
可滚动、更新的记录集 ("$ ,FRTQ:
1、创建可滚动、更新的Statement mFu0$N6]H
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); iQnIk|8
该Statement取得的ResultSet就是可滚动的 M4m90C;dq
2、创建PreparedStatement时指定参数 1=.+!Tg
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); b3RCsIz
ResultSet.absolute(9000); Z UCz-53
批量更新 +~L26T\8
1、Statement 69>N xr~k
Statement sm = cn.createStatement(); KsMC+:`F
sm.addBatch(sql1); 8wQ|Ep\
sm.addBatch(sql2); ,@]rvI6x
... E8QY6 gKF
sm.executeBatch() k yI -nE
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 _Bhm\|t
2、PreparedStatement QY]G+3W
PreparedStatement ps = cn.preparedStatement(sql); 3vK,vu q
{ @p}"B9h*^
ps.setXXX(1,xxx); (iw)C)t*u
... ;`P}\Q{
ps.addBatch(); pg;y\}
} 2|C(|fD4
ps.executeBatch(); "/MA.zEl0,
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 v1Wz#oP
16N+
事务的处理 WMw]W&
1、关闭Connection的自动提交 4`Z8EV
cn.setAutoCommit(false); |-SImxV
2、执行一系列sql语句 -B l!s^-'
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close *U69rbYI
Statement sm ; vQiKpO*
sm = cn.createStatement(insert into user...); k_}aiHdG
sm.executeUpdate(); Im* ~6[
sm.close(); %]15=7#'y
sm = cn.createStatement("insert into corp...); 5/>W(,5}
sm.executeUpdate(); PF4"J^V
sm.close(); F:o<E 42
3、提交 Qso"jYl<
cn.commit(); hn@T ]k
4、如果发生异常,那么回滚 D^~G(m;-
cn.rollback();