java 数据库基本操作 :v>Nz7SB
1、java数据库操作基本流程 pZg}7F{$
2、几个常用的重要技巧: -@EAL:kY
可滚动、更新的记录集 $'obj
批量更新 T,D(Xh
事务处理 ^$I8ga
96FS-`
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 z nxAP|
1、取得数据库连接 c_#+xGS!7
1)用DriverManager取数据库连接 jA}b=c
例子 U2D2?#
String className,url,uid,pwd; V"`t*m$
className = "oracle.jdbc.driver.OracleDriver"; vz-O2B_u
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; byTTLs,}d
uid = "system"; (7Q
Fy
pwd = "manager"; ?|;q=p`t-
Class.forName(className); vRQ7=N{3
Connection cn = DriverManager.getConnection(url,uid,pwd); ',Q|g^rF]
2)用jndi(java的命名和目录服务)方式 y:R!E *.L'
例子 86AZ)UP2D
String jndi = "jdbc/db"; 7}2Aq
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ;mAlF>6]\
DataSource ds = (DataSource) ctx.lookup(jndi); {5,
]7 =]
Connection cn = ds.getConnection(); _^5OoE"}!
多用于jsp中 X5gI'u
2、执行sql语句 p2/Pj)2
1)用Statement来执行sql语句 y]e[fZ`L
String sql; R]! [h
Statement sm = cn.createStatement(); :7P/ZC%
sm.executeQuery(sql); // 执行数据查询语句(select) hmQ;!9
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); 9_
2)用PreparedStatement来执行sql语句 +xc1cki_{
String sql; 0<";9qN)6
sql = "insert into user (id,name) values (?,?)"; (q]_&%yW
PreparedStatement ps = cn.prepareStatement(sql); iUua!uC
ps.setInt(1,xxx); (Iz$_(
ps.setString(2,xxx); G (o9*m1
... /eO:1c
ResultSet rs = ps.executeQuery(); // 查询 r$
8^K\oF
int c = ps.executeUpdate(); // 更新 4fyds< f
8*iIJ
3、处理执行结果 C3"5XR_Ov
查询语句,返回记录集ResultSet &x YO6_.
更新语句,返回数字,表示该更新影响的记录数 tvlrUp
ResultSet的方法 (rfR:[JkC2
1、next(),将游标往后移动一行,如果成功返回true;否则返回false p?v. 42R:z
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 O;dtz\
'fIoN%
4、释放连接 'C2X9/!,
cn.close(); s9)U",
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection #@3&1}J/
n,_q6/!
可滚动、更新的记录集 <Cbi5DtR
1、创建可滚动、更新的Statement NrK.DY4
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); &{uj3s&C
该Statement取得的ResultSet就是可滚动的 nign"r
2、创建PreparedStatement时指定参数 hRwj-N%C
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); MoX~ZewWR
ResultSet.absolute(9000); 9{KL^O?g
批量更新 \~!!h.xR
1、Statement N7
FndB5%
Statement sm = cn.createStatement(); ]~K&b96(
sm.addBatch(sql1); "-T[D9(A
sm.addBatch(sql2); G=ly .
... (E{}iq@2
sm.executeBatch() k:QeZn(
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有
<9bfX 91
2、PreparedStatement l{o,"P"
PreparedStatement ps = cn.preparedStatement(sql); LpYG!K l
{ R9z:K_d,
ps.setXXX(1,xxx); 6Lb(oY}\3
... ?XIB\7}
ps.addBatch(); ~9 [O'
} Ht9QINo
ps.executeBatch(); K8bKTG \
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 =f/CBYNw@V
<%iRa$i5
事务的处理 xk*&zAt
1、关闭Connection的自动提交 JuKG#F#,
cn.setAutoCommit(false); |W#(+m
2、执行一系列sql语句 90[6PSXk
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close [2$mo;E?
Statement sm ; ?` lD|~
sm = cn.createStatement(insert into user...); \5iMr[s
sm.executeUpdate(); n muzTFs=
sm.close(); K'_qi8Z
sm = cn.createStatement("insert into corp...); Fc6o6GyL|o
sm.executeUpdate(); S 6CI+W
sm.close(); MO>9A,&f
3、提交 d@XXqCR<
cn.commit(); JyO2P
4、如果发生异常,那么回滚 )UCc!
cn.rollback();