java 数据库基本操作 .[>UkM0
1、java数据库操作基本流程 $BWA=2$
2、几个常用的重要技巧: ;0]s:0WD0P
可滚动、更新的记录集 l. 0|>gj`0
批量更新 K{[N.dX(
事务处理 d}(b!q9
1\ab3n
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 WTQd}f
1、取得数据库连接 /H<tv5mXJ
1)用DriverManager取数据库连接 G.sf>.[
例子 -<M'h
String className,url,uid,pwd; #wP$LKk
className = "oracle.jdbc.driver.OracleDriver"; gaxxB]8
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; P~ 7p~ke
uid = "system"; Jqgo\r%`
pwd = "manager"; 2RC@Fu~zaU
Class.forName(className); vFgX]&bE
Connection cn = DriverManager.getConnection(url,uid,pwd); Q"b62+03
2)用jndi(java的命名和目录服务)方式 hxx`f-#=
例子 vN3uLz'<
String jndi = "jdbc/db"; $qy ST
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); mM)d`br
DataSource ds = (DataSource) ctx.lookup(jndi); Sx}61 ?
Connection cn = ds.getConnection(); 5Int,SX
多用于jsp中 ipn0WQG
2、执行sql语句 >*S ;z+!&
1)用Statement来执行sql语句 f4r)g2Zb[
String sql; rv;is=#1
Statement sm = cn.createStatement(); >XK |jPK
sm.executeQuery(sql); // 执行数据查询语句(select) R1NwtnS
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); p| o?nI
2)用PreparedStatement来执行sql语句 9Jj:d)E>o
String sql; d0 qc%.s
sql = "insert into user (id,name) values (?,?)"; {2MS,Ua{
PreparedStatement ps = cn.prepareStatement(sql); RLr^6+v)U
ps.setInt(1,xxx); a5@XD_b
ps.setString(2,xxx); U((mOm6
... I2^Eo5'
ResultSet rs = ps.executeQuery(); // 查询 @bO/5"X,
int c = ps.executeUpdate(); // 更新 d td}P~
fi;00>y
3、处理执行结果 Tg\wBhJr|
查询语句,返回记录集ResultSet dId&tTMmC
更新语句,返回数字,表示该更新影响的记录数 `sPH7^R
ResultSet的方法 Rg6/6/ IN
1、next(),将游标往后移动一行,如果成功返回true;否则返回false _1kcz]]F
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 jRYW3a_7
Lm"zW>v
4、释放连接 (YKkJ
cn.close(); '
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection z]bcg$m
]q CCCI`
可滚动、更新的记录集 m.2=,,r<Fq
1、创建可滚动、更新的Statement RI#o9d"x}
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); t'im\_$F
该Statement取得的ResultSet就是可滚动的 d+Au`'{>
2、创建PreparedStatement时指定参数 c&;Xjy
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); BNpc-O~
ResultSet.absolute(9000); :Wl`8p4]
批量更新 \+Pk"M
1、Statement ;/=6~%
Statement sm = cn.createStatement(); HlC[Nu^6U
sm.addBatch(sql1); 6UnWtLE
sm.addBatch(sql2); O(CmdSk,
... a?P$8NLr
sm.executeBatch() j=5hW.fI
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 r"\g6<RP
2、PreparedStatement XVWVY}
PreparedStatement ps = cn.preparedStatement(sql); jz"-E
{ YMD&U
ps.setXXX(1,xxx); atmTI`i
... [|{m/`8C
ps.addBatch(); *>8Y/3Y\B
} =%ZR0cWPoI
ps.executeBatch(); [2Ot=t6]
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 D;QV`Z%I
#8;#)q_[u
事务的处理 WpPI6bd
1、关闭Connection的自动提交 sTChbks
cn.setAutoCommit(false); +#MQ8d
2、执行一系列sql语句 fZF.eRP'
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close Kb,#Ot
Statement sm ; (Q~(t
sm = cn.createStatement(insert into user...); >a$b4
pvh
sm.executeUpdate(); ,J ZM%f
sm.close(); i$W
E1-
sm = cn.createStatement("insert into corp...); KmE<+/x~?
sm.executeUpdate(); o]O
sm.close(); sm96Ye{O{
3、提交 jhkNi`E7
cn.commit(); 4oywP^I
4、如果发生异常,那么回滚 t o2y#4'.
cn.rollback();