java 数据库基本操作 '#lEUlB
1、java数据库操作基本流程 S,+|A)\#
2、几个常用的重要技巧: 9~f
RYA*
可滚动、更新的记录集 "$%&C%t
批量更新 **9[e[(X
事务处理 \"K:<+RH
"wV7PSbM
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 +Sv2'& B
1、取得数据库连接 Jn0L_@
1)用DriverManager取数据库连接 &s.-p_4w^D
例子 ~ebm,3?
String className,url,uid,pwd; J(,gLl
className = "oracle.jdbc.driver.OracleDriver"; ^?0WE
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; bq5?fPBrq
uid = "system"; BXl
Y V"
pwd = "manager"; GV)DLHiyxX
Class.forName(className); ap|V}jC
Connection cn = DriverManager.getConnection(url,uid,pwd); +{e2TY
2)用jndi(java的命名和目录服务)方式 FO|Eg9l
例子 ` NvJ
String jndi = "jdbc/db"; '! ;Xxe5
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); ;2eZa|M*q
DataSource ds = (DataSource) ctx.lookup(jndi); R/c-sV
Connection cn = ds.getConnection(); QN~9O^
多用于jsp中 ^''3}<Ep
2、执行sql语句 8g_GXtn(z
1)用Statement来执行sql语句 l(tMo7iPa
String sql; Bd13p_V"6
Statement sm = cn.createStatement(); h4M>k{
sm.executeQuery(sql); // 执行数据查询语句(select) ?B4X&xf.D
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); +JFE\>O
2)用PreparedStatement来执行sql语句 %Zu+=IZ
String sql; \" =@uqar2
sql = "insert into user (id,name) values (?,?)"; xb(y15R\I
PreparedStatement ps = cn.prepareStatement(sql); Ria*+.k@"B
ps.setInt(1,xxx); a*@4W3;7
ps.setString(2,xxx); f'M7x6W
... pXxpEv
ResultSet rs = ps.executeQuery(); // 查询 1FEY&rpR
int c = ps.executeUpdate(); // 更新 N^tH&\G\m
RZKczZGZg
3、处理执行结果 G?{uR6s>#
查询语句,返回记录集ResultSet &uTK@ G+
更新语句,返回数字,表示该更新影响的记录数 |S VL%agZ
ResultSet的方法 Q(YQ$i"S
1、next(),将游标往后移动一行,如果成功返回true;否则返回false cLnvb!g'#
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 _Nq7_iT0
4^BHJOvs
4、释放连接 !Ry4w|w
cn.close(); yB^_dE
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection J{5&L &4
K~>ESMZ5
可滚动、更新的记录集 y 4jelg
1、创建可滚动、更新的Statement ob.=QQQs
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); Jq?"?d|:
该Statement取得的ResultSet就是可滚动的 iYxpIqWw
2、创建PreparedStatement时指定参数 l+8G6?@]>
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); tqe8:\1yK
ResultSet.absolute(9000); 8klu*
批量更新 !
.|\}= [e
1、Statement o]*#|4-
Statement sm = cn.createStatement(); h wfKgsm
sm.addBatch(sql1); 5S?+03h~
sm.addBatch(sql2); |\~!oN
... w[wrZ:[
sm.executeBatch() g>O
O '}lF
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 VlQaT7Q
2、PreparedStatement eyGY8fF8$
PreparedStatement ps = cn.preparedStatement(sql); <jvSV5%
{ (>\w8]
ps.setXXX(1,xxx); =m?x|Zc_v
... 6> Szxkz
ps.addBatch(); \.<V~d?
} Ui`Z>,0sFi
ps.executeBatch(); 5 J9,/M0
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 KoNJ;YiKtN
Pb^Mc <j
事务的处理 u`vOKajpH$
1、关闭Connection的自动提交 u;qBW
uO
cn.setAutoCommit(false); dLMKfh/4Q
2、执行一系列sql语句 jQ s"8[=s
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close <X_I`
Statement sm ; m:7$"oq|
sm = cn.createStatement(insert into user...); >~sAa+Oxi
sm.executeUpdate(); ,!s;o6|*y
sm.close(); eD4o8[s
sm = cn.createStatement("insert into corp...); M1/Rba Q
sm.executeUpdate(); P+~{q.|._c
sm.close(); C"P40VQoo
3、提交 M6P`~emX2
cn.commit(); Je#vl4<L
4、如果发生异常,那么回滚 [l2ds:
cn.rollback();