java 数据库基本操作 PmR~c,
1、java数据库操作基本流程 2{Chu85
2、几个常用的重要技巧: ynB _"mg
可滚动、更新的记录集 z)xSN;x
批量更新 =e}H'5?!
事务处理 "n: %E
RKa}$
7
java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 ZWm8*}3]7_
1、取得数据库连接 C:uz6i1
1)用DriverManager取数据库连接 J8"[6vI d~
例子 LS5vW|]w
String className,url,uid,pwd; Qq@G\eRo
className = "oracle.jdbc.driver.OracleDriver"; `AkIK*
url = "jdbc:oracle:thin:@127.0.0.1:1521:orasvr; NO0"* c ;
uid = "system"; 9XHz-+bQ
pwd = "manager"; W?We6.%
Class.forName(className); sz9G3artK&
Connection cn = DriverManager.getConnection(url,uid,pwd); <97d[/7i
2)用jndi(java的命名和目录服务)方式 Sje wuIi1
例子 JIFU;*PR1
String jndi = "jdbc/db"; |hO~X~P
Context ctx = (Context) new InitialContext().lookup("java:comp/env"); c(/VYMJZ&
DataSource ds = (DataSource) ctx.lookup(jndi); shH~4<15
Connection cn = ds.getConnection(); T /mI[*1xI
多用于jsp中 \(Pohw WWo
2、执行sql语句 _kdL'x
1)用Statement来执行sql语句 78Aa|AJU
String sql; UDc$"a}ds{
Statement sm = cn.createStatement(); {\z({Wlb]
sm.executeQuery(sql); // 执行数据查询语句(select) &%2*Wu;
sm.executeUpdate(sql); // 执行数据更新语句(delete、update、insert、drop等)statement.close(); qA:#iJ8w
2)用PreparedStatement来执行sql语句 "ywh9cp
String sql; iz~
pGkt
sql = "insert into user (id,name) values (?,?)"; Yyfq
PreparedStatement ps = cn.prepareStatement(sql); g!`3{
/4
ps.setInt(1,xxx); AWjm~D-?
ps.setString(2,xxx); oM)h#8bq
... w]_zp?\^
}
ResultSet rs = ps.executeQuery(); // 查询 [<,~3oRu
int c = ps.executeUpdate(); // 更新 t'~/$=9}
Lqp8yVO
3、处理执行结果 S#b-awk
查询语句,返回记录集ResultSet QnI.zq
V
更新语句,返回数字,表示该更新影响的记录数 >?]_<:
ResultSet的方法 y?)}8T^
1、next(),将游标往后移动一行,如果成功返回true;否则返回false enTW0U}
2、getInt("id")或getSting("name"),返回当前游标下某个字段的值 5PIZh<
]u-02g
4、释放连接 z**hD2R!
cn.close(); oR~e#<$;
一般,先关闭ResultSet,然后关闭Statement(或者PreparedStatement);最后关闭Connection $x#FgD(iI
D&ve15wL
可滚动、更新的记录集 /oL;YIoQX
1、创建可滚动、更新的Statement x-'~Bu
Statement sm = cn.createStatement(ResultSet.TYPE_SCROLL_ENSITIVE,ResultSet.CONCUR_READ_ONLY); XG@`ZJhU6
该Statement取得的ResultSet就是可滚动的 J@L9p46,
2、创建PreparedStatement时指定参数 S|zW^|YU
PreparedStatemet ps = cn.prepareStatement(sql,ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY); Z Dhx5SL&
ResultSet.absolute(9000); ;+I/ I9~
批量更新 m,R Dr
1、Statement jDRe)bo4
Statement sm = cn.createStatement(); n q19Q)
sm.addBatch(sql1); %Td )0Lqp
sm.addBatch(sql2); vNW jH!'
... ZL<
MC~
sm.executeBatch() \#rO!z
d
一个Statement对象,可以执行多个sql语句以后,批量更新。这多个语句可以是delete、update、insert等或兼有 CN2_bz
2、PreparedStatement P0i V<T4^
PreparedStatement ps = cn.preparedStatement(sql); phYDs9-K
{ /U$8TT8+-
ps.setXXX(1,xxx); 45@]:2j
... 5y}
v{Ijt
ps.addBatch(); !$g+F(:(c
} 0fs$#j
ps.executeBatch(); >qo~d?+
一个PreparedStatement,可以把一个sql语句,变换参数多次执行,一次更新。 7yt=]1
hKlZi!4J
事务的处理 ` r']^
,
1、关闭Connection的自动提交 Ao7 `G':
cn.setAutoCommit(false); aVe/
gE
2、执行一系列sql语句 GOSI3RRn
要点:执行每一个新的sql语句前,上一次执行sql语句的Statement(或者PreparedStatemet)必须先close _0pO8o-x
Statement sm ; q+a.G2S
sm = cn.createStatement(insert into user...); =6=_/q2
sm.executeUpdate(); %5
sm.close(); _J]2~b
sm = cn.createStatement("insert into corp...); r,N[ )@
sm.executeUpdate(); nW+YOX|+
sm.close(); a45ss7
3、提交 ^# A.@
cn.commit(); ~/IexQB&
4、如果发生异常,那么回滚 m~],nl
cn.rollback();