java 数据库基本操作 6e3s
|
1、java数据库操作基本流程 wN\%b}pp
2、几个常用的重要技巧: tT'*Uu5
可滚动、更新的记录集 T$5u+4>"
批量更新 yQ-&+16^
事务处理 \ce (/I
`[p*qsp_
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 Fq>=0 )
1、取得数据库连接 ;,![Lar5L
1)用DriverManager取数据库连接 "Lk-R5iFd
例子 @.;] $N&J
String className,url,uid,pwd; #;sUAR?]
className = "oracle.jdbc.driver.OracleDriver"; (lq7 ct
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ^AkVmsv;;
uid = "system"; 0)`{]&
pwd = "manager";
DvCs 5
Class.forName(className); -B-?z?+(O
Connection cn = DriverManager.getConnection(url,uid,pwd); YjN2 ,Xi
2)用jndi(java的命名和目录服务)方式
]fvU}4!
例子 4nQk*:p(X
String jndi = "jdbc/db"; i_Dv+^&zV
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); /. GHR
DataSource ds = (DataSource) ctx.lookup(jndi); FtXd6)_S
Connection cn = ds.getConnection(); wegu1Ny
多用于jsp中 ~N2){0j4
2、执行sql语句 SN+B8*!
1)用Statement来执行sql语句 qP{S!Z(
String sql; _xT=AF9~o
Statement sm = cn.createStatement(); S*-n%D0q5
sm.executeQuery(sql); // 执行数据查询语句(select) ,e{( r0
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 83~
Gu[
2)用PreparedStatement来执行sql语句 .VG$`g"
String sql; V #["Z}
sql = "insert into user (id,name) values (?,?)"; _PD RUJ
PreparedStatement ps = cn.prepareStatement(sql); X]ow5{e
ps.setInt(1,xxx); ~V&4<=r`
ps.setString(2,xxx); gpW3zDJ
... Kk#g(YgNz
ResultSet rs = ps.executeQuery(); // 查询 Pw
i6Ly`
int c = ps.executeUpdate(); // 更新 ]L#6'|W
7?a@i;E<
3、处理执行结果 T\ZWKx*#
查询语句,返回记录集ResultSet 35I y\
更新语句,返回数字,表示该更新影响的记录数 ^j&'2n@9a
ResultSet的方法 /nEt%YYh;x
1、next(),将游标往后移动一行,如果成功返回true;否则返回false 8 #fzL7
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 l*_%K}%?V
y^7;I-
4、释放连接 SQ!wq
cn.close(); Q;{[U!\:
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection gZ%wmY
GWo^hIfJ
可滚动、更新的记录集 iJ.P&T9
1、创建可滚动、更新的Statement eAKK uML
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); R|aA6} /I
该Statement取得的ResultSet就是可滚动的 n!=%MgF'*p
2、创建PreparedStatement时指定参数 H }w"4s
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ReE-I/n8f
ResultSet.absolute(9000); '{=dEEi
批量更新 5N
"fD{v{
1、Statement gM_z`H5[!
Statement sm = cn.createStatement(); mi9B C9W(
sm.addBatch(sql1); $ZX^JWq
sm.addBatch(sql2); F F<xsoZJ
... c@9jc^CJ
sm.executeBatch() "^E/N},%u5
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 9l).L L
2、PreparedStatement }%(e`[?1
PreparedStatement ps = cn.preparedStatement(sql); 7L~LpB
{ E +\?|q !T
ps.setXXX(1,xxx); > w:+nG/r
... lg` Qi&
ps.addBatch(); >;V ?s]
} #U45H.Rz
ps.executeBatch(); y,&.<Yc
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 b<,Z^Z_
]"bkB+I
事务的处理 N2:};a[ui5
1、关闭Connection的自动提交 `L p3snS
cn.setAutoCommit(false); XQL"D)fw
2、执行一系列sql语句 Zwy8SD'L
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Sh'>5z2
Statement sm ; JTbg8b
sm = cn.createStatement(insert into user...); k8fvg4
sm.executeUpdate(); lU]/nKyd
sm.close(); %gj's-!!
sm = cn.createStatement("insert into corp...); '@enl]J
sm.executeUpdate(); BDoL)}bRE
sm.close(); <SM{yMz
3、提交 6J. [9#
cn.commit(); AQkH3p/W
4、如果发生异常,那么回滚 SN2X{Q|*
cn.rollback();