java 数据库基本操作 pd& HC
1、java数据库操作基本流程 2JcP4!RD
2、几个常用的重要技巧: 3 `mtc@*
可滚动、更新的记录集 WwWCNN~}
批量更新 D*?LcxX
事务处理 G;/l[mvh,
g+c%J#F=
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 <P6d-+
1、取得数据库连接 H*+7{;$
1)用DriverManager取数据库连接 VZ y$0*
例子 {^^LeUd#V
String className,url,uid,pwd; !(viXV5
className = "oracle.jdbc.driver.OracleDriver"; zMBGpqdP
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; x25zk4-
uid = "system"; 6l &!4r@}
pwd = "manager"; 98 ]pkqp4
Class.forName(className); Yx,7e(AI`
Connection cn = DriverManager.getConnection(url,uid,pwd); G007[|
2)用jndi(java的命名和目录服务)方式 <h}x7y?
例子 xU}J6 Tv
String jndi = "jdbc/db"; R*XZPzg%
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); yF%e)6
DataSource ds = (DataSource) ctx.lookup(jndi); Q<ia
Connection cn = ds.getConnection(); E*fa&G~s )
多用于jsp中 Kp1 F"!
2、执行sql语句 q^n
LC6q
1)用Statement来执行sql语句 ;Ru[^p.{
String sql; Q&_#R(3j;
Statement sm = cn.createStatement(); >l/pwb@
sm.executeQuery(sql); // 执行数据查询语句(select) 6A}tA$*s7
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); t)g%9 k^
2)用PreparedStatement来执行sql语句 `PvS+>q
String sql; XW@C_@*J
sql = "insert into user (id,name) values (?,?)"; q(L.i)w$
PreparedStatement ps = cn.prepareStatement(sql); z"QXPIXPk
ps.setInt(1,xxx); yLK %lP
ps.setString(2,xxx); &0 "*.:J9
... &^uaoB0
ResultSet rs = ps.executeQuery(); // 查询 G ;ZN>8NB
int c = ps.executeUpdate(); // 更新 RAws{<6T-
}[MkJ21!
3、处理执行结果 csxn"Dz\
查询语句,返回记录集ResultSet -S&9"=v
更新语句,返回数字,表示该更新影响的记录数 a1u4v/Qu9
ResultSet的方法 mH5>50H;
1、next(),将游标往后移动一行,如果成功返回true;否则返回false Ggsts
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 Wg,@S*x(
d6-q"
4、释放连接 Q2* 8c$
cn.close(); pSIXv%1J
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection Wa.!eAe}
E|SmvIV-
可滚动、更新的记录集 %g3QE:(2@q
1、创建可滚动、更新的Statement ,:MUf]Ky
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); NYs<`6P:Y
该Statement取得的ResultSet就是可滚动的 D/%v/mpj$
2、创建PreparedStatement时指定参数 ~ _tK.m3
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); jO|`aUYTf
ResultSet.absolute(9000); {4f%UnSz(
批量更新 Qu7ML]e?z
1、Statement es\
qnq
Statement sm = cn.createStatement(); |TkicgeS
sm.addBatch(sql1); pY&dw4V
sm.addBatch(sql2); ?hR0
MnP
... -vk/z+-^!
sm.executeBatch() )1R[X!KQ7
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 N2k{@DY
2、PreparedStatement A )CsF
PreparedStatement ps = cn.preparedStatement(sql); ,1lW`Krx
{ '&K' 0qG
ps.setXXX(1,xxx); !W0JT#0
... 7.g,&s%q
ps.addBatch(); \u[5O@v#
} .*>C[^
ps.executeBatch(); X.,R%>O}`P
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 m(kv:5<>
R\#5;W^
事务的处理 3pL4Zhf
1、关闭Connection的自动提交 px+]/P<dX
cn.setAutoCommit(false); c'Z)uquvP
2、执行一系列sql语句 TL7qOA7^X
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close h^`@%g9 S
Statement sm ; EM+! ph
sm = cn.createStatement(insert into user...); kApD D[ N
sm.executeUpdate(); 8oRq3 "
sm.close(); ui|6ih$+
sm = cn.createStatement("insert into corp...); T?=]&9Y'
sm.executeUpdate(); d7zZ~n
sm.close(); b E40^e
3、提交 In!^+j
cn.commit(); GkU$Z @
4、如果发生异常,那么回滚 Zp6VH
cn.rollback();