java 数据库基本操作 U-tTW*[1]
1、java数据库操作基本流程 4zFW-yy
2、几个常用的重要技巧: N6i Q8P-
可滚动、更新的记录集 R%[ c;i
批量更新 dhK~O.~m
事务处理 #5o(h+w)
]Gq !`O1
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ml
}{|Yz
1、取得数据库连接 A_q3KB!$=+
1)用DriverManager取数据库连接 U9MxI%tb
例子 ((M>s&\y*Y
String className,url,uid,pwd; AFE~
v\Gz
className = "oracle.jdbc.driver.OracleDriver"; d<P\&!R(
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; hv>\gBe i
uid = "system"; Qj3EXb
pwd = "manager"; 8&b,qQ~
Class.forName(className); O)r4?<Q
Connection cn = DriverManager.getConnection(url,uid,pwd); WOL:IZX%
2)用jndi(java的命名和目录服务)方式 L$M9w
例子 OYn}5RN
String jndi = "jdbc/db"; FXkM#}RgNm
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); > /caXvS
DataSource ds = (DataSource) ctx.lookup(jndi); "oO%`:pb
Connection cn = ds.getConnection(); /jJw0 5;L
多用于jsp中 FJ)$f?=Qd
2、执行sql语句 s|r3Gv|G
1)用Statement来执行sql语句 h>m"GpF
x
String sql; k~1?VQ+?M
Statement sm = cn.createStatement(); >}6%#CAf
sm.executeQuery(sql); // 执行数据查询语句(select) draN0vf
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); wNd isI
2)用PreparedStatement来执行sql语句 V)N%WXG
String sql; kc&U'&RgY
sql = "insert into user (id,name) values (?,?)"; \(2sW^fY
PreparedStatement ps = cn.prepareStatement(sql); sD#.Oq4&]y
ps.setInt(1,xxx); .U]-j\
ps.setString(2,xxx); 40m -ch6Q
... "S?z@i(K^
ResultSet rs = ps.executeQuery(); // 查询 WNrk}LFof
int c = ps.executeUpdate(); // 更新 C!bUI8x
z
E+;7>ja
3、处理执行结果 </*6wpN
查询语句,返回记录集ResultSet ]N F[>uiW
更新语句,返回数字,表示该更新影响的记录数 7WZ+T"O{I
ResultSet的方法 ePo}y])2
1、next(),将游标往后移动一行,如果成功返回true;否则返回false {9q4)R}G
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 ##" HF
Oxd]y1
4、释放连接 2g! +<YZ~
cn.close(); j|#Bo:2km
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 9p(.A$
,Ko!$29[
可滚动、更新的记录集 H"WprHe
1、创建可滚动、更新的Statement +ksVtG,
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); $yNS
pNmT0
该Statement取得的ResultSet就是可滚动的 tK\~A,=
2、创建PreparedStatement时指定参数 Ta\tYZj$
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); '/s)%bc
ResultSet.absolute(9000); A2Gevj?F$
批量更新 s!$7(Q86R
1、Statement XZd,&YiaG
Statement sm = cn.createStatement(); f._ua>v,f
sm.addBatch(sql1); ^k9I(f^c-_
sm.addBatch(sql2); 5$C-9
... \bw2u!
sm.executeBatch() <7jW_R@
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 8bld3p"^
2、PreparedStatement ~b8]H|<'Y
PreparedStatement ps = cn.preparedStatement(sql); ?$4 PVI}
{ 9 djk[ttA)
ps.setXXX(1,xxx); -(H0>Ap
... %1+4_g9
ps.addBatch(); TOQP'/
} c{w2Gt!
ps.executeBatch(); qlPT Ll
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 0LJv'
FU4L6n
事务的处理 '^UI,"Ti
1、关闭Connection的自动提交 Mb*?5R6;
cn.setAutoCommit(false); aQ@oH#
2、执行一系列sql语句
92oFlEJ
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close M9%$lCl
Statement sm ; e+fN6v5pU
sm = cn.createStatement(insert into user...); =@~Y12o?%
sm.executeUpdate(); '}Z<h?9
sm.close(); ' S/gmn
sm = cn.createStatement("insert into corp...); fe_5LC"
sm.executeUpdate(); X#^[<5
sm.close(); Slc\&Eb
3、提交 om:VFs\U
cn.commit(); }Jj}%XxKs
4、如果发生异常,那么回滚 nAlQ7'
cn.rollback();