java 数据库基本操作 "P0o)g+{
1、java数据库操作基本流程 8> O'_6Joj
2、几个常用的重要技巧: ?55('+{l
可滚动、更新的记录集 c.jnPVf:
批量更新 F fl`;M
事务处理 bYG}CO
1mA)=hu
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 \U~ggg0h
1、取得数据库连接 5Ko"-
1)用DriverManager取数据库连接 ?86h:9
例子 gU+BRTZ&x
String className,url,uid,pwd; R Af+%h*
className = "oracle.jdbc.driver.OracleDriver"; `b9oH^}n j
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; 9x{T"'
uid = "system"; :gQc@)jZ(*
pwd = "manager"; &+%CC
Class.forName(className); 0r+-}5aSl5
Connection cn = DriverManager.getConnection(url,uid,pwd); z[OW%(vrm
2)用jndi(java的命名和目录服务)方式 :~6%nFo
例子 hRc\&+#/
String jndi = "jdbc/db"; :(I)+;M}P
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); )
e;F@o3
DataSource ds = (DataSource) ctx.lookup(jndi); jzzVZ%t
Connection cn = ds.getConnection(); YMqL,&Q{1
多用于jsp中 UPJgTN*
2、执行sql语句 ,wZ[Y
3
1)用Statement来执行sql语句 j|+B|
String sql; Z< uwqA
Statement sm = cn.createStatement(); G-,PsXSwe
sm.executeQuery(sql); // 执行数据查询语句(select) t7)Y@gRy
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); a.w,@!7
2)用PreparedStatement来执行sql语句 T
0^U
]C
String sql; x-%nnC6e
sql = "insert into user (id,name) values (?,?)"; RZ?>>Ll6
PreparedStatement ps = cn.prepareStatement(sql); Vvv
-f
ps.setInt(1,xxx); E 8,53$
ps.setString(2,xxx); rZ0@GA
... NK"y@)%0
ResultSet rs = ps.executeQuery(); // 查询 (S9"(\A
int c = ps.executeUpdate(); // 更新 UDp"+nS
'OF)`5sj
3、处理执行结果 n,xK7icYNQ
查询语句,返回记录集ResultSet \a|gzC1G
更新语句,返回数字,表示该更新影响的记录数 Q^0K8>G^
ResultSet的方法 C5XCy%h
1、next(),将游标往后移动一行,如果成功返回true;否则返回false I-;JDC?
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 )[qY|yu
dcXtT3,kpX
4、释放连接 #2u-L~n
cn.close(); ym ,S/Uz
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection
pRt )B`#
>1joCG~
可滚动、更新的记录集 %/S BJ
1、创建可滚动、更新的Statement 1X#`NUJ?2
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); lkw[Z}\
该Statement取得的ResultSet就是可滚动的 cl)MI,/>
2、创建PreparedStatement时指定参数 g:f0K2)\r:
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); k Mwt&6wS
ResultSet.absolute(9000); ;39{iU.m
批量更新 EE%OD~u&9#
1、Statement )FU4i N)ei
Statement sm = cn.createStatement(); *NXwllrci
sm.addBatch(sql1); }Pw5*duq
sm.addBatch(sql2); IXzad
... EaP#~x
sm.executeBatch() B /Dj2
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 av`b8cGg
2、PreparedStatement 8mCr6$|%
PreparedStatement ps = cn.preparedStatement(sql); Tri.>@-u
{ %lV>Nc|iz=
ps.setXXX(1,xxx); Odbjl[>k
... ^g~-$ t<!
ps.addBatch(); poXkH@[O
} 75^-93
ps.executeBatch(); ?*4]LuK6
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 T-<^mX[}
}n:-nB4
事务的处理 0Fi7|
1、关闭Connection的自动提交 w#JF7;
cn.setAutoCommit(false); yn%w'
2、执行一系列sql语句 Gg-<3z
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close mTs[3opg
Statement sm ; y()#FRp7
sm = cn.createStatement(insert into user...); @aj"12
sm.executeUpdate(); "bw4{pa+
sm.close(); Z2
t0l%
sm = cn.createStatement("insert into corp...); &/7GhZRt
sm.executeUpdate(); C?E;sRr0
sm.close(); *b7v)d#
3、提交 [n< U>up
cn.commit(); j" YJ1R-5
4、如果发生异常,那么回滚 ~xHr/:
cn.rollback();