﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Blue Dream-随笔分类-爪哇学习</title><link>http://www.blogjava.net/mac521/category/8818.html</link><description>Love OpenSource</description><language>zh-cn</language><lastBuildDate>Thu, 10 Apr 2008 05:12:09 GMT</lastBuildDate><pubDate>Thu, 10 Apr 2008 05:12:09 GMT</pubDate><ttl>60</ttl><item><title>SerialVersionID问题</title><link>http://www.blogjava.net/mac521/archive/2008/04/10/191763.html</link><dc:creator>风中起航</dc:creator><author>风中起航</author><pubDate>Thu, 10 Apr 2008 02:08:00 GMT</pubDate><guid>http://www.blogjava.net/mac521/archive/2008/04/10/191763.html</guid><wfw:comment>http://www.blogjava.net/mac521/comments/191763.html</wfw:comment><comments>http://www.blogjava.net/mac521/archive/2008/04/10/191763.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mac521/comments/commentRss/191763.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mac521/services/trackbacks/191763.html</trackback:ping><description><![CDATA[(一些对象的状态需要保存到磁盘或数据库中时，需要实现Serializable接口)<br />
结论：在实现Serializable接口时，IDE一般会提醒你设置一个SerialVersionID，这样做的好处是方便在不同编译器之间代码的移植。编译器在读取Serial对象时，会比较source与target的SerialVersionID是否一致，如果一致会产生InvalidClassException。<br />
在Eclipse中忽略该情况操作方法：Window--&gt;Preferences--&gt;Java--&gt;Compiler--&gt;Errors/Warnings--&gt;Potential programming problems<br />
问题：SerialVersionID是否在不同的类中有不同的值？<br />
回答：不需要。因为SerialVersionID本身是static final，是全局的，而且一般都是针对当前类，所以一般都是private。编译器在DeSerializable的时候，对象都是当前类，不需要不同类设置不同值。<br />
问题：不显示声明SerialVersionID是错的吗？<br />
回答：不是。编译器有自己的生成SerialVersionID的规则，但是不同编译器的规则又是不一致的，这样就会造成已Serial对象SerialVersionID与当前编译器DeSerial出来的SerialVersionID不一致，产生Exception。尽可能将所有可以序列化类都显示声明SerialVersionID。
<img src ="http://www.blogjava.net/mac521/aggbug/191763.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mac521/" target="_blank">风中起航</a> 2008-04-10 10:08 <a href="http://www.blogjava.net/mac521/archive/2008/04/10/191763.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]SQL Server和Oracle的常用函数对比</title><link>http://www.blogjava.net/mac521/archive/2008/01/02/172094.html</link><dc:creator>风中起航</dc:creator><author>风中起航</author><pubDate>Wed, 02 Jan 2008 02:26:00 GMT</pubDate><guid>http://www.blogjava.net/mac521/archive/2008/01/02/172094.html</guid><wfw:comment>http://www.blogjava.net/mac521/comments/172094.html</wfw:comment><comments>http://www.blogjava.net/mac521/archive/2008/01/02/172094.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mac521/comments/commentRss/172094.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mac521/services/trackbacks/172094.html</trackback:ping><description><![CDATA[<p>---------数学函数</p>
<p>1.绝对值<br />
S:select abs(-1) value<br />
O:select abs(-1) value from dual</p>
<p>2.取整(大)<br />
S:select ceiling(-1.001) value<br />
O:select ceil(-1.001) value from dual</p>
<p>3.取整（小）<br />
S:select floor(-1.001) value<br />
O:select floor(-1.001) value from dual</p>
<p>4.取整（截取）<br />
S:select cast(-1.002 as int) value<br />
O:select trunc(-1.002) value from dual</p>
<p>5.四舍五入<br />
S:select round(1.23456,4) value 1.23460<br />
O:select round(1.23456,4) value from dual 1.2346</p>
<p>6.e为底的幂<br />
S:select Exp(1) value 2.7182818284590451<br />
O:select Exp(1) value from dual 2.71828182</p>
<p>7.取e为底的对数<br />
S:select log(2.7182818284590451) value 1<br />
O:select ln(2.7182818284590451) value from dual; 1</p>
<p>8.取10为底对数<br />
S:select log10(10) value 1<br />
O:select log(10,10) value from dual; 1</p>
<p>9.取平方<br />
S:select SQUARE(4) value 16<br />
O:select power(4,2) value from dual 16</p>
<p>10.取平方根<br />
S:select SQRT(4) value 2<br />
O:select SQRT(4) value from dual 2</p>
<p>11.求任意数为底的幂<br />
S:select power(3,4) value 81<br />
O:select power(3,4) value from dual 81</p>
<p>12.取随机数<br />
S:select rand() value<br />
O:select sys.dbms_random.value(0,1) value from dual;</p>
<p>13.取符号<br />
S:select sign(-8) value -1<br />
O:select sign(-8) value from dual -1</p>
<p>----------三角函数相关</p>
<p>14.圆周率<br />
S:SELECT PI() value 3.1415926535897931<br />
O:不知道</p>
<p>15.sin,cos,tan 参数都以弧度为单位<br />
例如：select sin(PI()/2) value 得到1（SQLServer）</p>
<p>16.Asin,Acos,Atan,Atan2 返回弧度</p>
<p>17.弧度角度互换(SQLServer，Oracle不知道)<br />
DEGREES：弧度-〉角度<br />
RADIANS：角度-〉弧度</p>
<p>---------数值间比较</p>
<p>18. 求集合最大值<br />
S:select max(value) value from<br />
(select 1 value<br />
union<br />
select -2 value<br />
union<br />
select 4 value<br />
union<br />
select 3 value)a</p>
<p>O:select greatest(1,-2,4,3) value from dual</p>
<p>19. 求集合最小值<br />
S:select min(value) value from<br />
(select 1 value<br />
union<br />
select -2 value<br />
union<br />
select 4 value<br />
union<br />
select 3 value)a</p>
<p>O:select least(1,-2,4,3) value from dual</p>
<p>20.如何处理null值(F2中的null以10代替)<br />
S:select F1,IsNull(F2,10) value from Tbl<br />
O:select F1,nvl(F2,10) value from Tbl</p>
<p>--------字符串函数</p>
<p>21.求字符序号<br />
S:select ascii('a') value<br />
O:select ascii('a') value from dual</p>
<p>22.从序号求字符<br />
S:select char(97) value<br />
O:select chr(97) value from dual</p>
<p>23.连接<br />
S:select '11'+'22'+'33' value<br />
O:select CONCAT('11','22')||33 value from dual</p>
<p>23.子串位置 --返回3<br />
S:select CHARINDEX('s','sdsq',2) value<br />
O:select INSTR('sdsq','s',2) value from dual</p>
<p>23.模糊子串的位置 --返回2,参数去掉中间%则返回7<br />
// 本文转自 C++Builder 研究 - <a href="http://www.ccrun.com/article.asp?i=996&amp;d=dwn1rn">http://www.ccrun.com/article.asp?i=996&amp;d=dwn1rn</a><br />
S:select patindex('%d%q%','sdsfasdqe') value<br />
O:oracle没发现，但是instr可以通过第四个参数控制出现次数<br />
select INSTR('sdsfasdqe','sd',1,2) value from dual 返回6</p>
<p>24.求子串<br />
S:select substring('abcd',2,2) value<br />
O:select substr('abcd',2,2) value from dual</p>
<p>25.子串代替 返回aijklmnef<br />
S:SELECT STUFF('abcdef', 2, 3, 'ijklmn') value<br />
O:SELECT Replace('abcdef', 'bcd', 'ijklmn') value from dual</p>
<p>26.子串全部替换<br />
S:Replace<br />
O:select Translate('fasdbfasegas','fa','我' ) value from dual</p>
<p>27.长度<br />
S:len,datalength<br />
O:length</p>
<p>28.大小写转换 lower,upper</p>
<p>29.单词首字母大写<br />
S:没发现<br />
O:select INITCAP('abcd dsaf df') value from dual</p>
<p>30.左补空格（LPAD的第一个参数为空格则同space函数）<br />
S:select space(10)+'abcd' value<br />
O:select LPAD('abcd',14) value from dual</p>
<p>31.右补空格（RPAD的第一个参数为空格则同space函数）<br />
S:select 'abcd'+space(10) value<br />
O:select RPAD('abcd',14) value from dual</p>
<p>32.删除空格<br />
S:ltrim,rtrim<br />
O:ltrim,rtrim,trim</p>
<p>33. 重复字符串<br />
S:select REPLICATE('abcd',2) value<br />
O:没发现</p>
<p>34.发音相似性比较(这两个单词返回值一样，发音相同)<br />
S:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe')<br />
O:SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe') from dual<br />
SQLServer中用SELECT DIFFERENCE('Smithers', 'Smythers') 比较soundex的差<br />
返回0-4，4为同音，1最高</p>
<p>--------------日期函数</p>
<p>35.系统时间<br />
S:select getdate() value<br />
O:select sysdate value from dual</p>
<p>36.前后几日<br />
直接与整数相加减</p>
<p>37.求日期<br />
S:select convert(char(10),getdate(),20) value<br />
O:select trunc(sysdate) value from dual<br />
select to_char(sysdate,'yyyy-mm-dd') value from dual</p>
<p>38.求时间<br />
S:select convert(char(8),getdate(),108) value<br />
O:select to_char(sysdate,'hh24:mm:ss') value from dual</p>
<p>39.取日期时间的其他部分<br />
S:DATEPART 和 DATENAME 函数 （第一个参数决定）<br />
O:to_char函数 第二个参数决定</p>
<p>参数---------------------------------下表需要补充<br />
year yy, yyyy<br />
quarter qq, q (季度)<br />
month mm, m (m O无效)<br />
dayofyear dy, y (O表星期)<br />
day dd, d (d O无效)<br />
week wk, ww (wk O无效)<br />
weekday dw (O不清楚)<br />
Hour hh,hh12,hh24 (hh12,hh24 S无效)<br />
minute mi, n (n O无效)<br />
second ss, s (s O无效)<br />
millisecond ms (O无效)<br />
----------------------------------------------</p>
<p>40.当月最后一天<br />
S:不知道<br />
O:select LAST_DAY(sysdate) value from dual</p>
<p>41.本星期的某一天（比如星期日）<br />
S:不知道<br />
O:SELECT Next_day(sysdate,7) vaule FROM DUAL;</p>
<p>42.字符串转时间<br />
S:可以直接转或者select cast('2004-09-08'as datetime) value<br />
O:SELECT To_date('2004-01-05 22:09:38','yyyy-mm-dd hh24-mi-ss') vaule FROM DUAL;</p>
<p>43.求两日期某一部分的差（比如秒）<br />
S:select datediff(ss,getdate(),getdate()+12.3) value<br />
O:直接用两个日期相减（比如d1-d2=12.3）<br />
SELECT (d1-d2)*24*60*60 vaule FROM DUAL;</p>
<p>44.根据差值求新的日期（比如分钟）<br />
S:select dateadd(mi,8,getdate()) value<br />
O:SELECT sysdate+8/60/24 vaule FROM DUAL;</p>
<p>45.求不同时区时间<br />
S:不知道<br />
O:SELECT New_time(sysdate,'ydt','gmt' ) vaule FROM DUAL;</p>
<p>-----时区参数,北京在东8区应该是Ydt-------<br />
AST ADT 大西洋标准时间<br />
BST BDT 白令海标准时间<br />
CST CDT 中部标准时间<br />
EST EDT 东部标准时间<br />
GMT 格林尼治标准时间<br />
HST HDT 阿拉斯加—夏威夷标准时间<br />
MST MDT 山区标准时间<br />
NST 纽芬兰标准时间<br />
PST PDT 太平洋标准时间<br />
YST YDT YUKON标准时间</p>
<p>Oracle支持的字符函数和它们的Microsoft SQL Server等价函数:</p>
<p>函数 Oracle Microsoft SQL　Server<br />
把字符转换为ASCII ASCII ASCII<br />
字串连接 CONCAT (expression + expression)<br />
把ASCII转换为字符 CHR CHAR<br />
返回字符串中的开始字符（左起） INSTR CHARINDEX<br />
把字符转换为小写 LOWER LOWER<br />
把字符转换为大写 UPPER UPPER<br />
填充字符串的左边 LPAD N/A<br />
清除开始的空白 LTRIM LTRIM<br />
清除尾部的空白 RTRIM RTRIM<br />
字符串中的起始模式（pattern） INSTR PATINDEX<br />
多次重复字符串 RPAD REPLICATE<br />
字符串的语音表示 SOUNDEX SOUNDEX<br />
重复空格的字串 RPAD SPACE<br />
从数字数据转换为字符数据 TO_CHAR STR<br />
子串 SUBSTR SUBSTRING<br />
替换字符 REPLACE STUFF<br />
将字串中的每个词首字母大写 INITCAP N/A<br />
翻译字符串 TRANSLATE N/A<br />
字符串长度 LENGTH DATELENGTH or LEN<br />
列表中最大的字符串 GREATEST N/A<br />
列表中最小的字符串 LEAST N/A<br />
如果为NULL则转换字串 NVL ISNULL</p>
<p>日期函数</p>
<p>函数 Oracle Microsoft SQL　Server<br />
日期相加 (date column +/- value) or<br />
ADD_MONTHS DATEADD<br />
两个日期的差 (date column +/- value) or<br />
MONTHS_BETWEEN DATEDIFF<br />
当前日期和时间 SYSDATE GETDATE()<br />
一个月的最后一天 LAST_DAY N/A<br />
时区转换 NEW_TIME N/A<br />
日期后的第一个周日 NEXT_DAY N/A<br />
代表日期的字符串 TO_CHAR DATENAME<br />
代表日期的整数 TO_NUMBER<br />
(TO_CHAR)) DATEPART<br />
日期舍入 ROUND CONVERT<br />
日期截断 TRUNC CONVERT<br />
字符串转换为日期 TO_DATE CONVERT<br />
如果为NULL则转换日期 NVL ISNULL</p>
<p>转换函数</p>
<p>函数 Oracle Microsoft SQL　Server<br />
数字转换为字符 TO_CHAR CONVERT<br />
字符转换为数字 TO_NUMBER CONVERT<br />
日期转换为字符 TO_CHAR CONVERT<br />
字符转换为日期 TO_DATE CONVERT<br />
16进制转换为2进制 HEX_TO_RAW CONVERT<br />
2进制转换为16进制 RAW_TO_HEX CONVERT</p>
<p>其它行级别的函数</p>
<p>函数 Oracle Microsoft SQL　Server<br />
返回第一个非空表达式 DECODE COALESCE<br />
当前序列值 CURRVAL N/A<br />
下一个序列值 NEXTVAL N/A<br />
如果exp1 = exp2, 返回null DECODE NULLIF<br />
用户登录账号ID数字 UID SUSER_ID<br />
用户登录名 USER SUSER_NAME<br />
用户数据库ID数字 UID USER_ID<br />
用户数据库名 USER USER_NAME<br />
当前用户 CURRENT_USER CURRENT_USER<br />
用户环境(audit trail) USERENV N/A<br />
在CONNECT BY子句中的级别 LEVEL N/A</p>
<p>合计函数</p>
<p>函数 Oracle Microsoft SQL　Server<br />
Average AVG AVG<br />
Count COUNT COUNT<br />
Maximum MAX MAX<br />
Minimum MIN MIN<br />
Standard deviation STDDEV STDEV or STDEVP<br />
Summation SUM SUM<br />
Variance VARIANCE VAR or VARP</p>
<p>Oracle还有一个有用的函数EXTRACT,提取并且返回日期时间或时间间隔表达式中特定的时间域:<br />
EXTRACT(YEAR FROM 日期)</p>
<img src ="http://www.blogjava.net/mac521/aggbug/172094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mac521/" target="_blank">风中起航</a> 2008-01-02 10:26 <a href="http://www.blogjava.net/mac521/archive/2008/01/02/172094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring配置文件中id的第二个字母不能大写问题</title><link>http://www.blogjava.net/mac521/archive/2007/12/05/165506.html</link><dc:creator>风中起航</dc:creator><author>风中起航</author><pubDate>Wed, 05 Dec 2007 06:27:00 GMT</pubDate><guid>http://www.blogjava.net/mac521/archive/2007/12/05/165506.html</guid><wfw:comment>http://www.blogjava.net/mac521/comments/165506.html</wfw:comment><comments>http://www.blogjava.net/mac521/archive/2007/12/05/165506.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mac521/comments/commentRss/165506.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mac521/services/trackbacks/165506.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 今天遇到一个问题，在spring配置文件中的id第二个字母不能大写，否则会产生异常：Bean property 'kManager' is not writable or has an invalid setter method. Did you mean 'KManager'?.&nbsp;&nbsp;<a href='http://www.blogjava.net/mac521/archive/2007/12/05/165506.html'>阅读全文</a><img src ="http://www.blogjava.net/mac521/aggbug/165506.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mac521/" target="_blank">风中起航</a> 2007-12-05 14:27 <a href="http://www.blogjava.net/mac521/archive/2007/12/05/165506.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[Original]解析xml的相对路径问题</title><link>http://www.blogjava.net/mac521/archive/2007/11/22/162390.html</link><dc:creator>风中起航</dc:creator><author>风中起航</author><pubDate>Thu, 22 Nov 2007 07:32:00 GMT</pubDate><guid>http://www.blogjava.net/mac521/archive/2007/11/22/162390.html</guid><wfw:comment>http://www.blogjava.net/mac521/comments/162390.html</wfw:comment><comments>http://www.blogjava.net/mac521/archive/2007/11/22/162390.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/mac521/comments/commentRss/162390.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mac521/services/trackbacks/162390.html</trackback:ping><description><![CDATA[<p style="font-size: 12pt; font-family: 微软雅黑">今天在做xml解析的时候，遇到一个问题<img alt="" src="/CuteSoft_Client/CuteEditor/images/emdgust.gif" align="absMiddle" border="0" />：怎么用相对路径替换绝对路径?花了我半天的时间(水平不行浪费太多时间<img alt="" src="/CuteSoft_Client/CuteEditor/images/emembarrassed.gif" align="absMiddle" border="0" />)，写出来共享给大家，希望能够给大家帮助。在web工程中，有三种途径可以实现xml相对路径：<br />
1&gt;将xml放在WEB-INF目录下，通过getServletContext().getResourceAsStream("/WEB-INF/gather.xml");<br />
2&gt;将xml方法在WEB-INF/classes目录下或classpath的jar包中，则可以使用ClassLoader的静态方法getSystemResourceAsStream(String)读取<br />
<span style="color: red">前两种方法是从网上找到的，还没有尝试，因为我采用的是得到xml的url，然后去解析的.</span><br />
3&gt;通过获得xml的url，然后根据url去解析的<br />
获得url代码:<br />
&nbsp;&nbsp;&nbsp;&nbsp;ClassLoader classLoader = Thread.currentThread.getContextClassLoader();<br />
&nbsp;&nbsp;&nbsp;&nbsp;java.net.URL xmlURL = classLoader.getResource("gather/config/gather.xml");<br />
&nbsp;&nbsp;&nbsp;&nbsp;SAXReader reader = new SAXReader();<br />
&nbsp;&nbsp;&nbsp;&nbsp;Document document = reader.read(xmlURL);<br />
如果不是在web工程中，可以用InputStream去解析xml，代码如下：<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff">//className是类名<br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;ClassLoader classLoader = className.class.getClassLoader();<br />
&nbsp;&nbsp;&nbsp;&nbsp;InputStream inputStream = classLoader.getResourceAsStream("gather/config/gather.xml");<br />
&nbsp;&nbsp;&nbsp;&nbsp;SAXReader reader = new SAXReader();<br />
&nbsp;&nbsp;&nbsp;&nbsp;Document document = reader.read(inputStream);</p>
<img src ="http://www.blogjava.net/mac521/aggbug/162390.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mac521/" target="_blank">风中起航</a> 2007-11-22 15:32 <a href="http://www.blogjava.net/mac521/archive/2007/11/22/162390.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jsp中的数据库编程</title><link>http://www.blogjava.net/mac521/archive/2006/06/15/52942.html</link><dc:creator>风中起航</dc:creator><author>风中起航</author><pubDate>Thu, 15 Jun 2006 02:59:00 GMT</pubDate><guid>http://www.blogjava.net/mac521/archive/2006/06/15/52942.html</guid><wfw:comment>http://www.blogjava.net/mac521/comments/52942.html</wfw:comment><comments>http://www.blogjava.net/mac521/archive/2006/06/15/52942.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mac521/comments/commentRss/52942.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mac521/services/trackbacks/52942.html</trackback:ping><description><![CDATA[最近好久没上过BLOG了，前段时间实在是很忙啊。以前两年半的时间都没这么忙过呢~~~<br />今天上网看到一篇文章就转过来，大家一起分享下。前些时间我在研究JSP中的数据库连接，费了好大的劲，做了好多天，终于连接上了，辛苦啊，先喝杯酒庆祝一下，CHEERS.................现在就转帖了<br />[转]<br />二，JDBC 主要接口：<br />java.sql.DriverManager类用于处理驱动程序的调入并且对新的数据库连接提供支持。<br />java.sql.Connection，指应用程序与特定数据库的连接。<br />java.sql.Statement，用于一般sql语句的执行（可以是查询、更新甚至可以创建数据库的执行过程）<br />java.sql.ResultSet,查询所返回的结果保存在此对象中，用它可以浏览和存取数据库内的记录。<br /><br />1，通过jdbc-odbc桥使用odbc数据库（并不需要jdbc Drivers）<br /><br />先在odbc DSN(Data Source Name)设置处设置pubs sysDSN,sa为username,密码为空<br />Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加载驱动程序<br />con=DriverManager.getConnection("jdbc:odbc:pubs","sa","");//jdbc:odbc:pubs<br />con.close();<br />//应当catch ClassNotFoundException和SQLException<br /><br />Connection的getWarning方法返回一个SQLWarning对象，在连接之前应当先检查。<br />使用jdbc-odbc的最大好处是：免费的。但是性能受odbc的限制，而且一般odbc驱动比较昂贵。<br />2，使用专门的jdbc驱动程序。//此处是mm jdbc Driver<br />先将jar文件放在ClassPath里面。<br />Class.forName("org.gjt.mm.mysql.Driver");<br />con=DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname","root","");<br />con.close();<br /><br />可见使用何种方式连接何种数据库与数据库的操作和连接数据库是无关的。<br />三，查询数据库<br />Statement stmt=con.createStatement();<br />stmt.setMaxRows()可以控制输出记录最大数量;<br />ResultSet rs=stmt.executeQuery("select .....");<br /><br />ResultSet指向当前记录:<br />int userId=rs.getInt("userid");<br />String userName=rs.getString("username");<br />...或者用序号（从1开始的）<br />int userId=rs.getInt(1);<br />Stirng userName=rs.getString(2);<br /><br />ClassNotFoundException是由于Class.forName()无法载入jdbc驱动程序触发的<br />SQLException是jdbc在执行过程中发生问题时产生。有一个额外的方法getNextException()<br />catch(SQLException e){<br />out.println(e.getMessage());<br />while(e=e.getNextException()){<br />out.println(e.getMessage());<br />}<br />}<br /><br />一般来说并不建议在jsp中编写数据库的访问程序，可以将数据库的访问封装在一个javabean中。<br />四，ResultSet深入<br />1，ResultSetMetaData<br />ResultSet rs=stmt.executeQuery("select....");<br />ResultSetMetaData rsmd=rs.getMetaData(); //获取ResultSetMateData对象<br />int numberOfColumns=rsmd.getColumnCount();//返回列数<br />boolean b=rsmd.isSearchable(int i);//返回第i列是否可以用于where子句<br />String c=rsmd.getColumnLabel(int i);//获取第i列的列标<br />Objcet obj=rs.getObject();<br />if(obj!=null)out.println(obj.toString());<br />else println("");<br />2，SQL类型与ResultSet的getObject返回类型及对应的XXX getXXX()方法<br />SQL类型 JSP类型 对应的getXXX()方法<br />————————————————————————————————————————————<br />CHAR String String getString()<br />VARCHAR String String getString()<br />LONGVARCHAR String InputStream getAsciiStream()/getUnicodeStream()<br />NUMERIC java.math.BigDecimal java.math.BigDecimal getBigDecimal()<br />DECIMAL 同上<br />BIT Boolean boolean getBoolean()<br />TINYINT Integer byte getByte()<br />SMALLINT Integer short getShort()<br />INTEGER Integer int getInt()<br />BIGINT Long long getLong()<br />REAL Float float getFloat()<br />FLOAT Double double getDouble()<br />DOUBLE Double double getDouble()<br />BINARY byte[] byte[] getBytes()<br />VARBINARY byte[] byte[] getBytes()<br />LONGVARBINARY byte[] InputStream getBinaryStream()<br />DATE java.sql.Date java.sql.Date getDate()<br />TIME java.sql.Time java.sql.Time getTime()<br />TIMESTAMP java.sql.Timestamp java.sql.Timestamp getTimestamp()<br /><br />3，null<br />int i=rs.getInt("age");<br />if(!rs.wasNull())....//RecordSet::wasNull()用来检查null<br />4,存取大字符串和二进制文本<br />对于数据库中longvarchar和langvarbinary进行流操作<br />ResultSet rs=stmt.executeQueryString("select ...");<br />BufferedReader br=new BufferedReader(new InputStream(rs.getAsciiStream("vol1")));//长文本串<br />BufferedReader br=new BufferedReader(new InputStream(rs.getUnicodeStream("vol1")));<br />BufferedReader br=new BufferedReader(new InputStream(rs.getBinaryStream("vol2")));//长二进制文本<br />//取数据必须在rs.getAsciiStream(), rs.getUnicodeStream(), rs.getBinaryStream()等之后马上进行<br /><br /><br />五，浏览ResultSet<br />1，JDBC2.0提供了更多浏览ResultSet的方法<br />首先，确定你的jdbc驱动程序支持jdbc2.0<br />其次，由Connection生成Statement时要指定参数<br />Statement stmt=con.getStatement("游标类型", "记录更新权限");<br />游标类型：<br />ResultSet.TYPE_FORWORD_ONLY:只可以向前移动<br />ResultSet.TYPE_SCROLL_INSENSITIVE:可卷动。但是不受其他用户对数据库更改的影响。<br />ResultSet.TYPE_SCROLL_SENSITIVE:可卷动。当其他用户更改数据库时这个记录也会改变。<br />记录更新权限：<br />ResultSet.CONCUR_READ_ONLY,只读<br />ResultSet.CONCUR_UPDATABLE,可更新<br /><br />getStatement()缺省参数：getStatement(ResultSet.TYPE_FORWORD_ONLY, ResultSet.CONCUR_READ_ONLY)<br />2,如果ResultSet是可卷动的，以下函数可以使用：<br />rs.absolute()//绝对位置，负数表示从后面数<br />rs.first()第一条<br />rs.last()最后一条<br />rs.previoust()前一条<br />rs.next()后一条<br />rs.beforeFirst()第一条之前<br />rs.afterLast()最后之后<br />rs.isFirst(),rs.isLast(),rs.isBeforeFirst(),rs.isAfterLast<br />注意，刚打开的时候是处于第一条记录之前的<br /><br />六，更新数据库<br />1，stmt.executeUpdate("strSql"),strSql是一条sql更新语句。update,insert,delete返回影响到的条数<br />2，stmt.execute()方法在不知道sql语句是查询还是更新的时候用。如果产生一条以上的对象时，返回true,此时可用 stmt.getResultSet()和stmt.getUpdateCount()来获取execute结果，如果不返回ResultSet对象则返回false.<br />3,除了Statement的executeUpdate之外还可以用ResultSet:<br />rs.updateInt(1,10);<br />rs.updateString(2,"sfafd");<br />rs.updateRow();<br /><br />七，使用预编译PreparedStatement<br />PreparedStatement对象和Statement对象类似，都可以用来执行SQL语句。不同在于，数据库会对PreparedStatement的SQL语句进行预编译，而且仍旧能输入参数并重复执行编译好的查询速度比未编译的要快。<br />PreparedStatement stmt=con.preparedStatement("Insert Into users(userid, username) values(?,?)");<br />stmt.clearParameters();<br />stmt.setInt(1,2);<br />stmt.setString(2,"Big");<br />stmt.executeUpdate();<br /><br />八，执行存储过程<br />1，JDBC调用存储过程，并使用存储过程的返回值。这样可以将处理工作分为服务端和客户端两部分，并大大加快系统的设计和开发的时间。比如可以重复使用服务器上的组件。使用存储过程之后大量诸计算工作可以交给数据库服务器来处理，这将降低Web服务器的负载，从而提高整个系统的性能。<br />2，有两个表UserMain{UserID,UserName,UserType},UserRef{BrefID, UserID, UserBrief}<br />下面的存储过程可以接受jdbc传来的参数，新增内容到UserMain和UserRef，并输出一个OutUserID.<br />CREATE PROCEDURE ap_adduser<br />(<br />@OutUserID int output, //此为输出参数,output标记<br />@UserName varchar(25), //参数表示方法："@XXX"为变量名，"变量名 类型 [output]"<br />@UserType tinyint,<br />@UserBrief varchar(255),<br />)<br />AS<br />Declare @UserID int //定义局部变量<br />insert into UserMain(UserName, UserType)<br />values(@UserName,@UserType)<br />select @UserID=@@IDENTITY //赋值用select,此处自动获得ID<br />insert into UserRef(UserID, UserBrief)<br />select @OutUserID=@UserID<br />GO/*结束，基本结构：<br />CREATE PROCEDURE procedureName(<br />parameters<br />)<br />AS<br />actions<br />GO<br />*/<br /><br /><br />JSP页面中这样使用：<br />CallableStatement stmt=con.prepareCall("{call ap_adduser(?,?,?,?)}");<br />stmt.registerOutParameter(1,Types.INTEGER,1);//注册输出变量<br />stmt.setString(2,"edmund");<br />stmt.setInt(3,1);<br />stmt.setString(4,"description");<br />stmt.execute();<br />int userid=stmt.getInt(1);<br />stmt.close()<br /><br />八，使用事务<br />1，事务中的操作是一个整体，要么都执行成功要么都不成功：事务开始后，如果所有的改变都正确，则使用commit方法将这些动作全部存入数据库，否则就使用rollback取消所有的改变动作，而这时数据库中的数据和执行事务前的是相同的。<br />2，使用事务时应当先用 con.setAutoCommit(false)，最后使用commit或者rollback<br />3，rollback一般在catch段执行<br />九，数据库连接池<br />1，如果有一个数据库连接请求并且连接中没有连接，则生成一个新的连接。这个连接使用完之后并不关闭它，而是将它放入连接池。在这个过程中，还要判断连接池中的连接是否超期。如果超期则将它关闭。<br />2，有很多已有的Connection Pool包可以使用。<br />3，一般将Connection Pool作为一个application作用域的变量使用<br />&lt;jsp:useBean id="pool" scope="application" class="javastart.tools.ConnectionPool" /&gt;<br />&lt;%@page import="java.sql.*"%&gt;<br />&lt;%@page import="javastart.tools.*"%&gt;<br />&lt;!--javastart.tools是你的Connection Pool所在的地方--&gt;<br />DBConnection con=null;<br />try{<br />con=pool.getConnection("sun.jdbc.odbc.JdbcOdbcDriver","jdbc:odbc:access","","");<br />Statement stmt=con.createStatement();<br />stmt.setMaxRows(10);<br />String query=request.getParameter("quey");<br />ResultSet rs=stml.executeQuery(query);<br />ResultSetMetaData rsmd=rs.getMetaData();<br />}<br />.....<br />finally{<br />pool.releaseConnection(con);<br />}<br /><br />也可以使用一个Servlet初始化连接池<img src ="http://www.blogjava.net/mac521/aggbug/52942.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mac521/" target="_blank">风中起航</a> 2006-06-15 10:59 <a href="http://www.blogjava.net/mac521/archive/2006/06/15/52942.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>转载：JBuild下解决中文问题</title><link>http://www.blogjava.net/mac521/archive/2006/04/08/39985.html</link><dc:creator>风中起航</dc:creator><author>风中起航</author><pubDate>Sat, 08 Apr 2006 04:41:00 GMT</pubDate><guid>http://www.blogjava.net/mac521/archive/2006/04/08/39985.html</guid><wfw:comment>http://www.blogjava.net/mac521/comments/39985.html</wfw:comment><comments>http://www.blogjava.net/mac521/archive/2006/04/08/39985.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mac521/comments/commentRss/39985.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mac521/services/trackbacks/39985.html</trackback:ping><description><![CDATA[
		<p>方法一：<br />　　　下载最新版的JDK把jre/lib下的font.properties.zh盖掉JBX所用的JDK相同目录JBX/jdk1.4/jre/lib下的相同文件就行了。</p>
		<p>方法二：<br />　　　Project =&gt; Project Properties =&gt; General =&gt; Encoding =&gt;改为GBK。</p>
		<p>方法三：步骤如下：<br />1: 安装JBX；不用说了；</p>
		<p>2: 改变一下，Tools =&gt; Preferences... =&gt; Editor =&gt; Display 里面的字体，主要是让JBuilderX搜索一下系统的字体；</p>
		<p>3: 关闭JBX；</p>
		<p>4: 在用户主目录下（X:\Documents and Settings\Administrator\）<br />　　打开.primetimeX\user_zh.properties<br />　　将所有的editor.display;known_fonts.***=***拷贝出来；<br />　　新建一个文件，粘贴过去然后把这里的known_fonts全部替换成fixed_fonts，然后拷贝所有，回到user_zh.properties文件来；<br />　　替换掉这里的所有的editor.display;fixed_fonts.***=***行，保存；</p>
		<p>5: 重起JBX，Tools =&gt; Preferences... =&gt; Editor =&gt; Display ==&gt; Font Family里面的字体是全部Windows的字体了</p>
<img src ="http://www.blogjava.net/mac521/aggbug/39985.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mac521/" target="_blank">风中起航</a> 2006-04-08 12:41 <a href="http://www.blogjava.net/mac521/archive/2006/04/08/39985.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>今天终于完成了洗牌程序.不过可能有点乱!</title><link>http://www.blogjava.net/mac521/archive/2006/04/01/38620.html</link><dc:creator>风中起航</dc:creator><author>风中起航</author><pubDate>Sat, 01 Apr 2006 08:50:00 GMT</pubDate><guid>http://www.blogjava.net/mac521/archive/2006/04/01/38620.html</guid><wfw:comment>http://www.blogjava.net/mac521/comments/38620.html</wfw:comment><comments>http://www.blogjava.net/mac521/archive/2006/04/01/38620.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/mac521/comments/commentRss/38620.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mac521/services/trackbacks/38620.html</trackback:ping><description><![CDATA[import java.applet.*;<br />import java.awt.*;<br />import java.awt.event.*;<br />import java.util.*;<br />import javax.swing.*;<br />public class puke extends JApplet <br />{<br /> JFrame f=new JFrame();<br /> Container y=getContentPane();<br /> JButton wash=new JButton("洗牌");<br />  JButton post=new JButton("发牌");<br /> JLabel first=new JLabel("The first is:");<br /> JLabel second=new JLabel("The second is:");<br /> JLabel third=new JLabel("The third is:");<br /> JLabel fourth=new JLabel("The fourth is:");<br /> public void init()<br /> {   <br />  y.setLayout(new GridLayout(3,2));<br />  y.add(wash);<br />  y.add(post);<br />  y.add(first);<br />  y.add(second);<br />  y.add(third);<br />  y.add(fourth);<br />  wash.addActionListener(new WashActionAdapter());<br />  post.addActionListener(new PostActionAdapter());       <br /> }<br />//---------------------------------------------------------------<br />   class MyThread extends Thread<br />   {<br />    public void run()<br />    {<br />     Stack save=new Stack();<br />     Vector MyVector=new Vector(1,1);<br />    String[] wpkp={"红桃","黑桃","方片","草花"};<br />      Random i=new Random();<br />        int a,j;<br />        a=4; <br />    try<br />    {<br />         while(a!=0)<br />   {<br />     j=i.nextInt(4);<br />     if(wpkp[j]!="NULL")<br />      {<br />       save.push(wpkp[j]);<br />         wpkp[j]="NULL";<br />        a-=1;<br />     }<br />     else continue;<br />    }<br />     while(!save.empty())       <br />          MyVector.addElement(save.pop()); <br />          for(int ii=0;ii&lt;MyVector.capacity();ii++)<br />          {<br />           switch(ii%5)<br />     {<br />      case 0:first.setText("The first is:"+MyVector.get(ii).toString());break;<br />      case 1:second.setText("The second is:"+MyVector.get(ii).toString());break;<br />      case 2:third.setText("The third is:"+MyVector.get(ii).toString());break;<br />      case 3:fourth.setText("The fourth is:"+MyVector.get(ii).toString());break;<br />     }<br />     }<br />    }<br />    catch(Exception ee)<br />    {<br />    }<br />     }<br />    }<br />//----------------------------------------------------------------<br />  class WashActionAdapter implements ActionListener<br />  {<br />//   Stack save=new Stack();<br />       <br />      <br />   <br />   public  void actionPerformed(ActionEvent e)<br />   {<br />            first.setText("The first is:");<br />      second.setText("The second is:");<br />      third.setText("The third is:");<br />      fourth.setText("The fourth is:");    <br />    }<br />   }<br />//-------------------------------------------------------------------------------------<br />   class PostActionAdapter implements ActionListener <br />   {<br />    public  void actionPerformed(ActionEvent e)<br />    { <br />     String cmd=e.getActionCommand();<br />     String title="Message Dialog";<br />     String message="";<br />     int type;<br />     if(first.getText().equals("The first is:"))<br />     {<br />      Thread t=new MyThread();<br />        t.start();<br />      }<br />     else<br />     {<br />      type=JOptionPane.PLAIN_MESSAGE;<br />      message="请先洗牌";<br />     JOptionPane.showMessageDialog(f,message,title,type);<br />      }<br />    <br />     }<br />   }<br />//---------------------------------------------------------------------------------------   <br />}<br /><br /><br /><br /><br /><br />自己感觉有点乱，大家有好的方法可以告诉我，精诚合作，金石为开<img height="19" src="http://www.blogjava.net/Emoticons/shades_smile.gif" width="19" border="0" /><img src ="http://www.blogjava.net/mac521/aggbug/38620.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mac521/" target="_blank">风中起航</a> 2006-04-01 16:50 <a href="http://www.blogjava.net/mac521/archive/2006/04/01/38620.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>索求学习资源......</title><link>http://www.blogjava.net/mac521/archive/2006/03/25/37335.html</link><dc:creator>风中起航</dc:creator><author>风中起航</author><pubDate>Sat, 25 Mar 2006 05:21:00 GMT</pubDate><guid>http://www.blogjava.net/mac521/archive/2006/03/25/37335.html</guid><wfw:comment>http://www.blogjava.net/mac521/comments/37335.html</wfw:comment><comments>http://www.blogjava.net/mac521/archive/2006/03/25/37335.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/mac521/comments/commentRss/37335.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mac521/services/trackbacks/37335.html</trackback:ping><description><![CDATA[       我还是一个初学者，希望大虾和小虾们能够多多帮助。如果有好的资源或学习的网站，愿意共享的话，可以告诉我......<br />        在这个先谢谢了<img height="19" src="http://www.blogjava.net/Emoticons/shades_smile.gif" width="19" border="0" /><img src ="http://www.blogjava.net/mac521/aggbug/37335.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mac521/" target="_blank">风中起航</a> 2006-03-25 13:21 <a href="http://www.blogjava.net/mac521/archive/2006/03/25/37335.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>求助JAVA程序</title><link>http://www.blogjava.net/mac521/archive/2006/03/25/37332.html</link><dc:creator>风中起航</dc:creator><author>风中起航</author><pubDate>Sat, 25 Mar 2006 05:08:00 GMT</pubDate><guid>http://www.blogjava.net/mac521/archive/2006/03/25/37332.html</guid><wfw:comment>http://www.blogjava.net/mac521/comments/37332.html</wfw:comment><comments>http://www.blogjava.net/mac521/archive/2006/03/25/37332.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/mac521/comments/commentRss/37332.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/mac521/services/trackbacks/37332.html</trackback:ping><description><![CDATA[      昨天学习JAVA的时候遇到一道编程题：编写一个随机发牌和洗牌的程序。我和同学讨论了半天想到了math.random()可是这个函数每次都只能从0~1中取，而且又不能保证所有的数都能被取到。<br />      后来我们想到给上面的函数乘以牌数，然后强制转换成整数，可是后面的问题还是没有解决。我想到定义一个长度和牌的数目一样的数组，然后每次丛数组取出一个数，就令这个对应的数组中的数为NULL，过后把取到的数对应的放入栈中。<br />       同学说我的算法没有效率，其实我也觉得有点......如果谁有比较好点的算法可以写出来，最好是程序都写出来<img height="19" src="http://www.blogjava.net/Emoticons/red_smile.gif" width="19" border="0" /><br />      我的邮箱是<a href="mailto:zyl198511@hotmail.com">zyl198511@hotmail.com</a><img src ="http://www.blogjava.net/mac521/aggbug/37332.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/mac521/" target="_blank">风中起航</a> 2006-03-25 13:08 <a href="http://www.blogjava.net/mac521/archive/2006/03/25/37332.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>