java 数据库基本操作 w ~"%&SNN
1、java数据库操作基本流程 \3]O?'
2、几个常用的重要技巧: ji\&?%(B
可滚动、更新的记录集 HO_(it \
批量更新 }I MV@z B
事务处理 sxS%1hp3
k
]T
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 R^=v&c{@
1、取得数据库连接 =y(*?TZH
1)用DriverManager取数据库连接 *>`6{0,9
例子 FA\U4l-
String className,url,uid,pwd; ir>S\VT4
className = "oracle.jdbc.driver.OracleDriver"; -E3cS
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; ?Ok&,\F@E
uid = "system"; I}f7|hYX
pwd = "manager"; y<wd~!>Ubu
Class.forName(className); )Z|G6H`c3
Connection cn = DriverManager.getConnection(url,uid,pwd); +S+=lu _
2)用jndi(java的命名和目录服务)方式 4.uaWM)2
例子 fYzP4
String jndi = "jdbc/db"; FA;-D5=
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ?Z4%u8Krvz
DataSource ds = (DataSource) ctx.lookup(jndi); #_`qbIOAj
Connection cn = ds.getConnection(); -j2y#aP
多用于jsp中 Jf0i$
2、执行sql语句 sekei6#fi
1)用Statement来执行sql语句 w (z=xO
String sql; (+cZP&o
Statement sm = cn.createStatement(); NZ0 ?0*
sm.executeQuery(sql); // 执行数据查询语句(select) \t/0Yh-'
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); e*}GQ
2)用PreparedStatement来执行sql语句 W'f"kM
String sql; 4e;$+!dlV
sql = "insert into user (id,name) values (?,?)"; %3|/t-US
PreparedStatement ps = cn.prepareStatement(sql); Ww\ WuaY
ps.setInt(1,xxx); }N ).$
ps.setString(2,xxx); TI<3>R
... n)Cr<^j
ResultSet rs = ps.executeQuery(); // 查询 7-Oa34ba+
int c = ps.executeUpdate(); // 更新 ^E Rdf2
KZ%us 6
3、处理执行结果 lN8l71N^
查询语句,返回记录集ResultSet O:a=94
更新语句,返回数字,表示该更新影响的记录数 >dJ~
ResultSet的方法 $+ N~Fa
1、next(),将游标往后移动一行,如果成功返回true;否则返回false `W" ;4A
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 O9o ]4;
UBj&T^j
4、释放连接 #d*gWwnx"
cn.close(); vceD/ N8
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection D`mr>-Y
-meY[!"X
可滚动、更新的记录集 lKQevoy'
1、创建可滚动、更新的Statement c#`IF6qj
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); dFhyT.Y?
该Statement取得的ResultSet就是可滚动的 m[iQ7/
2、创建PreparedStatement时指定参数 VCiq'LOR,<
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); U<q`f-
ResultSet.absolute(9000); Rg\4#9S JF
批量更新 )G?\{n-
1、Statement (=fLWK{8
Statement sm = cn.createStatement(); W[qy4\.B
sm.addBatch(sql1); O6 s3#iu
sm.addBatch(sql2); '
Q(kx*;
... _x3=i\O,
sm.executeBatch() Eu"8IM!%-
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 XEagN:
2、PreparedStatement /{jt]8/;7
PreparedStatement ps = cn.preparedStatement(sql); >;Vfs{Z(q
{ o|y_j49
ps.setXXX(1,xxx); ]jn1T^D'
... )"hd"
ps.addBatch(); 2
'D,1F
} )!cucY
ps.executeBatch(); YcclO
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 >3B{sn}
iWC}\&i
事务的处理 Hm!"%
1、关闭Connection的自动提交 p8@8b "
cn.setAutoCommit(false); nTD%i~t~o
2、执行一系列sql语句 r79P|)\
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close G3+e5/0
Statement sm ; M*D_pn&
sm = cn.createStatement(insert into user...); <nG}]Smd7
sm.executeUpdate(); OHj>ufwVq
sm.close(); mAGD qz>f
sm = cn.createStatement("insert into corp...); <Opw"yY&q]
sm.executeUpdate(); 0zT-]0
sm.close(); pc@mQI
3、提交 He5y;5
cn.commit(); &a e!lB
4、如果发生异常,那么回滚 +/eJ#Xw3u8
cn.rollback();