java 数据库基本操作 g(9* !g
1、java数据库操作基本流程 bj}Lxc ],
2、几个常用的重要技巧: RrvC}9ar
可滚动、更新的记录集 IH dA2d?.]
批量更新 ,|s*g'u
事务处理 bsDA&~)s
((+XzV>
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 r'jUB^E
1、取得数据库连接 n"T ^
1)用DriverManager取数据库连接 tp}/>gU!
例子 cI'n[G
String className,url,uid,pwd; 9Y'pT.Gyb
className = "oracle.jdbc.driver.OracleDriver"; EW(bM^dk}
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; RSh_~qMX
uid = "system"; vRe X7
pwd = "manager"; N-?5[T"
Class.forName(className); c0'ryS_Z9
Connection cn = DriverManager.getConnection(url,uid,pwd); D<d,9 S,)
2)用jndi(java的命名和目录服务)方式 8 5X}CCQ
例子 4r7F8*z
String jndi = "jdbc/db"; rAfz?
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); y;Cs#eo
DataSource ds = (DataSource) ctx.lookup(jndi); F`m}RL]g
Connection cn = ds.getConnection(); o=_7KWOA
多用于jsp中 -yBKA]"<I
2、执行sql语句 &H%/.4la
1)用Statement来执行sql语句 ! e$ZOYe
String sql; {%G9iOV.
Statement sm = cn.createStatement(); PXYLLX\3
sm.executeQuery(sql); // 执行数据查询语句(select) sWte&
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); k:Y\i]#yP
2)用PreparedStatement来执行sql语句 O&BvWik
String sql; A~PR
sql = "insert into user (id,name) values (?,?)"; TT/H"Ri}Jp
PreparedStatement ps = cn.prepareStatement(sql); zUL,~u
ps.setInt(1,xxx); QF/_?Tm4
ps.setString(2,xxx); M%`CzCL
u
... /HLI9
ResultSet rs = ps.executeQuery(); // 查询 2I [zV7 @t
int c = ps.executeUpdate(); // 更新 `
= O
`6)Qi*Z
3、处理执行结果 %S;AM\o4
查询语句,返回记录集ResultSet 6!"wiM"]
更新语句,返回数字,表示该更新影响的记录数 %rG4X
ResultSet的方法 8#yu.\N.xt
1、next(),将游标往后移动一行,如果成功返回true;否则返回false dT*Yv`h
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 H5x7)1Ir|
Kh\ 7%>K#
4、释放连接 d,Aa8I
cn.close(); L? DlR hu
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 9=ygkP Y
{73V?#P4
可滚动、更新的记录集 F1stRZ1ZI
1、创建可滚动、更新的Statement {\D&*
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); KJ'ID
该Statement取得的ResultSet就是可滚动的 qx5`lm~L
2、创建PreparedStatement时指定参数 'G l~P><e
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); z1Bi#/i
ResultSet.absolute(9000); \L(cFjLIl
批量更新 P-Y_$Nv0g
1、Statement C7ivAh
Statement sm = cn.createStatement(); ]5"k%v|
sm.addBatch(sql1); ?d-w#<AiV
sm.addBatch(sql2); BA:x*(%~
... 'c7nh{F
sm.executeBatch() &~P4yI;,
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 1OMXg=Y
2、PreparedStatement }8x+F2i
PreparedStatement ps = cn.preparedStatement(sql); "a)6g0gw
{ " _2k3
ps.setXXX(1,xxx); T<pG$4_
... w-pgtO|Us
ps.addBatch(); \t7yH]:>@
} !6'N-b1
ps.executeBatch(); 6XWNJb
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 4-.K<-T%D
b!@PS$BTxq
事务的处理 }4Yz P 4
1、关闭Connection的自动提交 HXa[0VOx
cn.setAutoCommit(false); .g*N+T6O
2、执行一系列sql语句 X>[i<ei
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close (0NffM1
Statement sm ; gUru=p
sm = cn.createStatement(insert into user...); 88osWo6rG
sm.executeUpdate(); 60!%^O =
sm.close(); _eiqs
sm = cn.createStatement("insert into corp...); 6/8K2_UeoW
sm.executeUpdate(); (NvjX})eh
sm.close(); T"z<D+pN
3、提交 6h>#;M
cn.commit(); ;bB#Pg
4、如果发生异常,那么回滚 hi[nUG(OI
cn.rollback();