java 数据库基本操作 a>`\^>G4
1、java数据库操作基本流程 AY:3o3M
2、几个常用的重要技巧: La?q>
可滚动、更新的记录集 c;e-[F 7
批量更新 Ld? tVi
事务处理 |x["fWK
=<(:5ive
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 8):I< }s#
1、取得数据库连接 vJ>A
>RCB
1)用DriverManager取数据库连接 "^gZh3
例子 !zL1XW)q
String className,url,uid,pwd; bv0B
className = "oracle.jdbc.driver.OracleDriver"; -@i)2J_WP
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 6BVV2j)zl:
uid = "system"; .%`|vGF
pwd = "manager"; )7=B]{B_
Class.forName(className); P]T(I/\g
Connection cn = DriverManager.getConnection(url,uid,pwd); X`]-)(UX
2)用jndi(java的命名和目录服务)方式 &KgR;.R^J
例子 nul? 5{z@
String jndi = "jdbc/db"; _~_04p
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); NKLGbH
DataSource ds = (DataSource) ctx.lookup(jndi); 8-cG[/|0
Connection cn = ds.getConnection(); sl|s#+Z
多用于jsp中 0t5>'GYX
2、执行sql语句 I*@\pc}
1)用Statement来执行sql语句 HKq 2X4J$
String sql; @8Drhx
Statement sm = cn.createStatement(); (p`'Okw
sm.executeQuery(sql); // 执行数据查询语句(select) C=@BkneQ
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); zy4AFW
2)用PreparedStatement来执行sql语句 &d`Umm]
String sql; rMSB|*_
sql = "insert into user (id,name) values (?,?)"; xPb;_~
PreparedStatement ps = cn.prepareStatement(sql); j2lo~J)
ps.setInt(1,xxx); F}0QocD
ps.setString(2,xxx); gB&]kHLO
... 2 *n2!7jZ*
ResultSet rs = ps.executeQuery(); // 查询 - t4"BD
int c = ps.executeUpdate(); // 更新 :q~qRRmjBe
"$+naY{w
3、处理执行结果 \^;Gv%E
查询语句,返回记录集ResultSet w>; :mf
更新语句,返回数字,表示该更新影响的记录数 +@]1!|@(
ResultSet的方法 n<8$_?-
1、next(),将游标往后移动一行,如果成功返回true;否则返回false mLk@&WxG
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 H#k"[eZ
9 f-T>}
4、释放连接 swG^L$r`
cn.close(); xj{X#[q):
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection J[YA1
v6oPAqj,r
可滚动、更新的记录集 riZFcVsB
1、创建可滚动、更新的Statement G6JyAC9j
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Q'JE DH\
该Statement取得的ResultSet就是可滚动的 Q6,rY(b6
2、创建PreparedStatement时指定参数 ]?-56c,
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); T =3te|fv
ResultSet.absolute(9000); 5h1!E
批量更新 C-qsyJgZy
1、Statement >tr?5iKxc
Statement sm = cn.createStatement(); kR^7Z7+#*
sm.addBatch(sql1); oF.Fg<p(
sm.addBatch(sql2); #i ?@S$
... (&PamsV*8
sm.executeBatch() :m5&
i&
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 rRcfZZ~` M
2、PreparedStatement tt[P{mMQ
PreparedStatement ps = cn.preparedStatement(sql); l4U& CA y
{ HCHP15otfe
ps.setXXX(1,xxx); $DA0lY\
... c/;t.+g
ps.addBatch(); ?MKf=!w
} kSU5
}
ps.executeBatch(); J}jK_
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 z$7YC49^
)@eBe^
事务的处理 oge^2
1、关闭Connection的自动提交 0#K@^a
cn.setAutoCommit(false); :N8D1e-a
2、执行一系列sql语句 [7<X&Q
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close vR,HCI
Statement sm ; m6 hA,li
sm = cn.createStatement(insert into user...); :U)e
8
sm.executeUpdate(); G8u8&|
sm.close(); WcH^bAY 6
sm = cn.createStatement("insert into corp...); KG>.7xVWV7
sm.executeUpdate(); f@LUp^Z/v
sm.close(); #cdLg-v
3、提交 0p2 0Rt
cn.commit(); `}zv17wp
4、如果发生异常,那么回滚 > 7;JZuVo
cn.rollback();