java 数据库基本操作 #`GY}-hL!
1、java数据库操作基本流程 <<D$+@wxm
2、几个常用的重要技巧: hYQ_45Z*?
可滚动、更新的记录集 *A}cL
批量更新 g}laG8
事务处理 st"{M\.p
Oz|K8p
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 79\JxiSB
1、取得数据库连接 >0{S
1)用DriverManager取数据库连接 U yw-2]!n
例子 Ngb(F84H?
String className,url,uid,pwd; v+jsC`m
className = "oracle.jdbc.driver.OracleDriver"; KXV[OF&J
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; AtR?J"3E
uid = "system"; <I}2k
pwd = "manager"; t}v2$<!I
Class.forName(className); b{fQ|QD{^E
Connection cn = DriverManager.getConnection(url,uid,pwd); @fuM)B1"
2)用jndi(java的命名和目录服务)方式
)>D+x5o]
例子 g}p;\o
String jndi = "jdbc/db"; V\V)<BARe
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); \4"S7.% |
DataSource ds = (DataSource) ctx.lookup(jndi); `@i5i((
Connection cn = ds.getConnection(); Z%GTnG|rG
多用于jsp中 -XRn~=5
2、执行sql语句 MNH1D!}
1)用Statement来执行sql语句 Y(\T-
bI
String sql; )BfT7{WN
Statement sm = cn.createStatement();
^ kST
sm.executeQuery(sql); // 执行数据查询语句(select) Soie^$
Y
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); {0! ~C=P
2)用PreparedStatement来执行sql语句 bYz&P`o}
String sql; =AVgIv
sql = "insert into user (id,name) values (?,?)"; :V2bS
PreparedStatement ps = cn.prepareStatement(sql); 6t/`:OZC:
ps.setInt(1,xxx); R<i38/ ~G
ps.setString(2,xxx); 8Ld:"Y#
... D>Gt]s
ResultSet rs = ps.executeQuery(); // 查询 !v]b(z`Y
int c = ps.executeUpdate(); // 更新 %{6LUn
/ywD{*
3、处理执行结果 bCZ gcN
查询语句,返回记录集ResultSet fYE(n8W3
更新语句,返回数字,表示该更新影响的记录数 /6O??6g
ResultSet的方法 +GsWTEz
1、next(),将游标往后移动一行,如果成功返回true;否则返回false jGrN\D?h
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 RzhWD^b B
v(OBXa9
4、释放连接 \c[IbL07
cn.close(); Mg#j3W}]
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection 2MA]j T
9w9jpe#
可滚动、更新的记录集 DF6c|
1、创建可滚动、更新的Statement qS&%!
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); r_EcMIuk
该Statement取得的ResultSet就是可滚动的 fw oQ'&
2、创建PreparedStatement时指定参数 fQLt=Lrp
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); ,@m@S^
ResultSet.absolute(9000); A`{y9@h(
批量更新 s:00yQ
1、Statement c*d9'}E
Statement sm = cn.createStatement(); 3:%QB9qc]'
sm.addBatch(sql1); j@Qg0F
sm.addBatch(sql2); &R~n>>c
... qo)?8kx>l
sm.executeBatch() 3D9!M-
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 Pmi#TW3X
2、PreparedStatement = 07Gy, =i
PreparedStatement ps = cn.preparedStatement(sql); (;VVCAoy
{ `Q+moX
ps.setXXX(1,xxx); kj+#TnF-
... -T6(hT\
ps.addBatch(); CIjZG ?A
} 'WHHc 9rG,
ps.executeBatch(); `>DP,D)w(
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 g+-;J+X8
I ];M7
事务的处理 ylKmj]A
1、关闭Connection的自动提交 9+,R`v
cn.setAutoCommit(false); t6c<kIQ:-O
2、执行一系列sql语句 v){ .Z^_C
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close jkiTj~WE-
Statement sm ; I8OD$`~*U6
sm = cn.createStatement(insert into user...); C0=9K@FCb
sm.executeUpdate(); H"2uxhdLK3
sm.close(); F_xbwa*=
sm = cn.createStatement("insert into corp...); #S%Q*k<hw
sm.executeUpdate(); y]%w )4PS
sm.close(); ;X ,1I
3、提交 m8623DB"
cn.commit(); QZ
`tNq :/
4、如果发生异常,那么回滚 |}){}or
cn.rollback();