java 数据库基本操作 y#hga5
1、java数据库操作基本流程 AyQS4A.s[
2、几个常用的重要技巧: <'PR;g^#
可滚动、更新的记录集 bYwI==3
批量更新 A[sM{i~Z
事务处理 b&\3ps
'5|Q<5!o
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 LydbP17K}
1、取得数据库连接 R`0foSq \M
1)用DriverManager取数据库连接 $nUd\B$.=
例子 RB S[*D
String className,url,uid,pwd; (z8]FT
className = "oracle.jdbc.driver.OracleDriver"; _n-VgPRn
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; c!'A)JD@
uid = "system"; {:};(oz)f
pwd = "manager"; ikEWY_1Y
Class.forName(className); _&k'j)rg
Connection cn = DriverManager.getConnection(url,uid,pwd); 5}.,"Fbr
2)用jndi(java的命名和目录服务)方式 47)+'`
例子 t,--V|7-
String jndi = "jdbc/db"; e67c:Z
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); -XS+Uv
DataSource ds = (DataSource) ctx.lookup(jndi); R-r+=x&
Connection cn = ds.getConnection(); 9%p7B ~}E
多用于jsp中 baUEsg[~V
2、执行sql语句 SQO>}#qm
1)用Statement来执行sql语句 4_6W s$x
String sql; }aHB$}"!
Statement sm = cn.createStatement(); aGq_hP
sm.executeQuery(sql); // 执行数据查询语句(select) ;,F-6RNj
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); dXA{+<!!
2)用PreparedStatement来执行sql语句 EmtDrx4!(f
String sql; w>NZRP_3
sql = "insert into user (id,name) values (?,?)";
D\45l
PreparedStatement ps = cn.prepareStatement(sql); f"5lOzj`C
ps.setInt(1,xxx); _1w.B8Lyz@
ps.setString(2,xxx); p\\P50(-
... B|]t\(~$[
ResultSet rs = ps.executeQuery(); // 查询 B#qL$M,|
int c = ps.executeUpdate(); // 更新 %KJ"rvi4K
M-&^
3、处理执行结果 c t2_N
查询语句,返回记录集ResultSet p"hm.=,
更新语句,返回数字,表示该更新影响的记录数 Y0P}KPD
ResultSet的方法 ;X*K*q
1、next(),将游标往后移动一行,如果成功返回true;否则返回false ])Q9=?Sd}
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 dUsJv
N27K
4、释放连接 2-"Lxe65f
cn.close(); >j(I[_g
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection |? ;"B:0
:)A.E}G
可滚动、更新的记录集 Y5h)l<P>B
1、创建可滚动、更新的Statement r
48;_4d)D
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); *7xQp!w^
该Statement取得的ResultSet就是可滚动的 >+A1 V[
2、创建PreparedStatement时指定参数 MYDf`0{$_a
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); YobC'c\~9
ResultSet.absolute(9000); 4AJu2Hp
批量更新 n3HCd-z
1、Statement J]=aI>Ow
Statement sm = cn.createStatement(); ;9!yh\\
sm.addBatch(sql1); ?j&~vy= T
sm.addBatch(sql2); wa(Wit"-
... 9AVK_
sm.executeBatch() yO$r'9?,*
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 q^jqLT&w
2、PreparedStatement .swgXiRvs
PreparedStatement ps = cn.preparedStatement(sql); m5'__<
{ }OX>(
ps.setXXX(1,xxx); %4r!7X|O<
... U'sVs2sk6
ps.addBatch(); (<>Sz(
} r0Y?X\l*
ps.executeBatch(); \DcC1W
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 st'?3A
35@Ibe~
事务的处理 `3>)BV<P
1、关闭Connection的自动提交 YV ZSKU
cn.setAutoCommit(false); &t.>^7ELF
2、执行一系列sql语句 qN`]*baS
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close gk_X u
Statement sm ; x
w?9W4<
sm = cn.createStatement(insert into user...); X/;"CM
sm.executeUpdate(); S{"6PXzb
sm.close(); {6=H/g=:i
sm = cn.createStatement("insert into corp...); VtPoc(o4]
sm.executeUpdate(); 9TXm Z
sm.close(); PE;0
jgsiI
3、提交 @h7GTA \
cn.commit(); EbwZZSds1
4、如果发生异常,那么回滚 d=+Lv<
cn.rollback();