<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>flyinglife</title>
    <description></description>
    <link>http://flyinglife.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>自己写的类struts的简易的mvc实现+一个类Spring的IOC和简单AOP</title>
        <author>flyinglife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flyinglife.javaeye.com">flyinglife</a>&nbsp;
          链接：<a href="http://flyinglife.javaeye.com/blog/222772" style="color:red;">http://flyinglife.javaeye.com/blog/222772</a>&nbsp;
          发表时间: 2008年08月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          类struts的简易的mvc实现+一个类Spring的IOC和简单AOP<br /><br />看了的人提个意见，谢谢。
          <br/>
          <span style="color:red;">
            <a href="http://flyinglife.javaeye.com/blog/222772#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 01 Aug 2008 14:42:09 +0800</pubDate>
        <link>http://flyinglife.javaeye.com/blog/222772</link>
        <guid>http://flyinglife.javaeye.com/blog/222772</guid>
      </item>
      <item>
        <title>点名游戏</title>
        <author>flyinglife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flyinglife.javaeye.com">flyinglife</a>&nbsp;
          链接：<a href="http://flyinglife.javaeye.com/blog/218680" style="color:red;">http://flyinglife.javaeye.com/blog/218680</a>&nbsp;
          发表时间: 2008年07月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.对自己最想说的话是什么？ <br /><br />妈了个逼的的，算你倒霉。<br /><br />2.什么时候你会感到孤单？ <br /><br />没有目标，身边没有朋友<br /><br />3.你会同时爱上2个人吗？ <br /><br />2个人？没这种情况，通常是多个，我是个感情不专一，而且泛滥的家伙。<br /><br />4.最想实现的愿望是什么？ <br /><br /> 在狗日的社会横冲直撞<br /><br />5.有压力了怎么缓解？ <br /><br />找朋友聊天，看电影<br /><br />6.最受不了自己哪个缺点 ？ <br /><br />不肯动脑 目标动摇<br /><br />7.遇到喜欢的人是勇敢表白还是默默关注？ <br /><br />先看看，伺机而动<br /><br />8.最喜欢哪里的美食？ <br /><br />没有特定，最好跟我妈做的一样<br /><br />9.爱情对于你排第几？ <br /><br />爱情是什么？<br /><br />10.对点你名的人的印象？ <br /><br />总是对着你猛笑<br /><br />11.你希望从朋友（不是爱人）那里得到什么？ <br /><br />­理解，支持<br /><br />12.什么样的人会让你视为知己？ <br /><br />坦诚相待<br /><br />13.  30岁意味着什么？<br /><br />那是个解脱的年纪<br /><br />14.最值得回忆的事？ <br /><br />没有<br /><br />15.最近想看的电影？ <br /><br />《教父》一直没时间<br /><br />16.最讨厌什么样的异性？ <br /><br />没修养，没内涵<br /><br />17.未来三年有什么打算？ <br /><br />在北京成为超一流的讲师<br /><br />18.你这段时间以来听到的最讨厌的一句话？ <br /><br />谢老师看起来不像老师/谢老师看起来和我们年纪差不多<br /><br />19.你是一个会妥协的人吗？ <br /><br />看了，我也把握不准<br /><br />20.你相信缘分吗？ <br /><br />相信<br /><br />21.觉得自己是个自恋的人吗？ <br /><br />搞不清楚<br /><br />22.最希望别人对你说的话是什么？ <br /><br />“老师，你课讲的太好了。上你的课感觉就像你在给我一个人上课，那种感觉太好了”<br /><br />23.最喜欢的一句话？ <br /><br />彪悍一点，再彪悍一点<br /><br />24.爱情中最重要的是什么？ <br /><br />信任，宽容<br /><br />25.在家庭和事业中你会首先选哪个？ <br /><br />家庭<br /><br />26.你认为自己是个有耐性的人么？ <br /><br />不是<br /><br />28.经济条件是你选择爱人的必要条件吗？ <br /><br />不是<br /><br />29.喜欢什么样的爱情模式，一见钟情还是日久生情？ <br /><br />一见钟情，就是她了<br /><br />30.你现在最害怕的事是什么？ <br /><br />动摇<br /><br />31.最喜欢什么样的生活方式？ <br /><br />努力工作，自由支配剩下的时间，和好朋友们在一起。<br /><br />32.你觉得住大房子，开好车很重要吗？这算是你的目标之一吗？ <br /><br />要，算<br /><br />33.更爱自己还是家人？ <br /><br />家人<br /><br />34.最开心的时候会和谁一起分享？ <br /><br />朋友 家人<br /><br />35.你喜欢儿子还是女儿？ <br /><br />都喜欢<br /><br />36.拿了年终奖或是压岁钱后你想干嘛? <br /><br />折腾<br /><br />37.你对现在的生活有什么感觉？ <br /><br />失望<br /><br />38.现在最期待的一件事？<br /><br />能够帮助别人了<br /><br />39.你会要几个宝宝？ <br /><br />最好不要超过10个<br /><br />40.最近一次大哭是因为什么？ <br /><br />忘记了<br /><br />41.什么会让你觉得幸福？ <br /><br />家庭 朋友<br /><br />42.你经常开心大笑么？ <br /><br />每天<br /><br />43.你总会无意间与某个人偶遇吗？ <br /><br />是的，我对路人兴趣很大<br /><br />44.你相信情可以超越时空吗？ <br /><br />相信<br /><br />45.希望自己多大结婚？ <br /><br />27或者28<br /><br />46.你最想去的城市或是国家是哪里？ <br /><br />美国，拉斯维加斯<br /><br />47.喜欢的专业？ <br /><br /> 讲师<br /><br />48.和朋友之间怎么样才能保持好的关系？ <br /><br />坦诚相待<br /><br />49.你希望自己拥有什么能力？ <br /><br />强健的体魄<br /><br />50.总结过去人生的词语？ <br /><br />这他妈是人过的日子吗？<br /><br /> 注：来自戴志伟的BLOG（http://wosuixinxiang.blog.163.com/blog/）<br /><br />要点名了：<br />铁桥，刘健，谢忠则<br /><br /><br />点名规则：<br />A.被点到名字的人要在自己的空间里复制所有问题并写出自己的答案，然后去掉一个你最不喜欢的问题再加上一个你的问题，仍然组成50个问题。 <br />B.要在自己的博客里注明是从哪里接到的，并继续点名（3至２０个人），让游戏继续下去，但不得回传。要通知对方“你被点名了”，被点名者不得拒绝回答问题。 <br />C.被点到名字的人将会得到大家的祝福，完成游戏的人所有美好的愿望都会在不久的将来实现。
          <br/>
          <span style="color:red;">
            <a href="http://flyinglife.javaeye.com/blog/218680#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 Jul 2008 18:29:23 +0800</pubDate>
        <link>http://flyinglife.javaeye.com/blog/218680</link>
        <guid>http://flyinglife.javaeye.com/blog/218680</guid>
      </item>
      <item>
        <title>jdbc学习笔记</title>
        <author>flyinglife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flyinglife.javaeye.com">flyinglife</a>&nbsp;
          链接：<a href="http://flyinglife.javaeye.com/blog/217963" style="color:red;">http://flyinglife.javaeye.com/blog/217963</a>&nbsp;
          发表时间: 2008年07月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          jdbc学习笔记(三)<br />关键字: jdbc,java <br />一.事务（Transaction） <br />原子操作:不可再分的操作,一个操作不能再分成比它更细小的操作. <br />事务是针对原子操作的，要求原子操作不可再分，并且必须同时成功同时失败。 <br />事务就是把一些非原子操作,变成原子操作,由应用服务器来提出要求,由数据库服务器来执行操作. <br /><br />在JDBC中默认是自动提交的,如果要想使用事务,需要按以下步骤执行: <br />1.要调用con.setAutoCommite(false)方法，把自动提交（commit）置为false。 <br />2.进行正常的数据库操作 <br />3.如果操作成功了可以选择con.commit(),或者操作失败时选择con.roolback(); <br />注意:打开事务就要关闭自动提交,当不需要再使用事务的时候调用setAutoCommite(true). <br /><br />二.事务并发产生的问题 <br />三种并发产生的后果: <br />1，脏读:一个事务读取到了另外一个事务没有提交的数据。 <br />2，重复读:一个事务读取到了另外一个事务提交的数据。它是要保持在同一时间点上读取到的数据相同，希望在一段时间内的数据是不变的。 <br />3，幻读:一个事务读取到了另外一个事务提交的数据。用同样的操作读取两次,得到的记录数不相同。 <br /><br />三.事务隔离级别 <br />五种控制级别: <br />TRANSACTION_NONE不使用事务。 <br />TRANSACTION_READ_UNCOMMITTED 允许脏读。 <br />TRANSACTION_READ_COMMITTED防止脏读，最常用的隔离级别,并且是大多数数据库的默认隔离级别 <br />TRANSACTION_REPEATABLE_READ可以防止脏读和不可重复读， <br />TRANSACTION_SERIALIZABLE可以防止脏读，不可重复读取和幻读，（事务串行化）会降低数据库的效率 <br /><br />以上的五个事务隔离级别都是在Connection类中定义的静态常量，使用setTransactionIsolation(int level) 方法可以设置事务隔离级别。 <br />如:con.setTransactionIsolation(Connection.REPEATABLE_READ); <br /><br />四.JDBC2.0新特性 <br />1.可滚动特性和可更新特性 <br />JDBC1.0中是指游标的移动的方向和方式是单向,单步(相对)移动,功能比较简单. <br />JDBC2.0中游标可以双向,相对或者绝对移动. <br />可滚动结果集:这种结果集不但可以双向滚动，相对定位，绝对定位，并且还可以修改数据信息。 <br /><br />1)滚动特性 <br />定位函数: <br />boolean absolute(int row)，定位到指定的记录位置。定位成功返回true，不成功返回false。 <br />void afterLast() ，把游标移动到最后一条记录的后面(逻辑位置)。 <br />void beforeFirst() ，把游标移动到第一条记录的前面(逻辑位置)。 <br />//由于第一条记录的前面和最后一条记录的后面这两个位置肯定存在,所以无需判断是否存在,返回值设为void. <br />boolean first()，把游标定位到第一条记录。 <br />boolean last()，把游标定位到最后一条记录。 <br />//当结果集为空的时候,这两个方法会返回false. <br />boolean next()，此方法是使游标向下一条记录移动。 <br />boolean previous() ，此方法可以使游标向上一条记录移动，前提是前面还有记录。 <br />boolean relative(int rows) ，相对定位方法，参数值可正可负，参数为正，游标从当前位置向后移动指定值条记录，参数为负，游标从当前位置向前移动指定值条记录。 <br /><br />判断函数: <br />ifBeforeFirst()判断是否在在第一条记录之前. <br />ifAfterLast()判断是否在在最后一条记录之后. <br />ifFirst()判断是否为第一条记录. <br />ifLast()判断是否为最后一条记录. <br /><br />要使用可滚动结果集时，需要一次设置更新特性与滚动特性,不能分开. <br /><br />1.更新特性常量: <br />CONCUR_READ_ONLY 只读结果集(默认) <br />CONCUR_UPDATABLE 可更新结果集 <br /><br />2.滚动特性常量: <br />TYPE_FORWARD_ONLY ，该常量表示指针只能向前移动的 ResultSet 对象的类型。(默认) <br />TYPE_SCROLL_INSENSITIVE ，该常量指示可滚动但通常不受其他更改影响的 ResultSet 对象的类型。 <br />TYPE_SCROLL_SENSITIVE ，该常量指示可滚动并且通常受其他更改影响的 ResultSet 对象的类型。 <br />//敏感:数据库改变,结果集改变. <br />语法: <br />Statement st=null; <br />st=con.createStatement(ReusltSet.TYPE_SCROLL_INSENSITIVE,ResuleSet.CONCUR_UPDATABLE) <br />在创建Statement的时候就要指定这两个参数,使用Statement,第一个参数代表滚动特性常量,第二个代表更新特性常量 <br /><br />2)可更新特性 <br />a.moveToInsertRow();记录当前游标位置,将游标移到和结果集结构类似的缓冲区; <br />b.使用updateXxx(int column,columnType value)方法来更新指定列数据; <br />c.使用insertRow() 方法插入记录; <br />d.将游标指回原位，moveToCurrentRow() 。 <br /><br />能否使用JDBC2.0 ResultSet的新特性，要看使用的数据库驱动是否支持. <br />还有只能用于单表且表中有主键字段（可能会是联合主键），不能够有表连接，会取 <br />可更新操作必须满足以下条件: <br />a.查询只能引用一张表. <br />b.不能包含任何连接操作. <br />c.必须把完整的主键查到结果集里面; <br />d.保证所有字段为非空字段并且没有默认值。 <br /><br />五.数据库元数据: <br />DatabaseMetaData dbmd = con.getMetaData();//得到数据库元数据 <br />dbmd.supportsResultSetConcurrency(ResultSet.TYPE_FORWARD_ONLY, <br />ResultSet.CONCUR_UPDATABLE);//判断是否支持可更新操作 <br /><br />六.批量更新 <br />优势: <br />1.节省传递时间 <br />2.并发处理 <br /><br />PreparedStatement: <br />1.addBatch() 将一组参数添加到 PreparedStatement对象内部 <br />2.executeBatch() 将一批参数提交给数据库来执行，如果全部命令执行成功，则返回更新计数组成的数组。 <br /><br />Statement: <br />addBatch(String sql)方法会在批处理缓存中加入一条sql语句 <br />executeBatch()执行批处理缓存中的所有sql语句。 <br /><br />注意：PreparedStatement中使用批量更新时，要先设置好参数后再使用addBatch()方法加入缓存。 <br />批量更新中只能使用更新或插入语句 <br /><br />七.SQL3中的数据类型 <br />Array:数组 <br />Sturct:结构 <br />大对象: <br />Blob:大的二进制数据文件对象。 <br />Clob:大的文本文件对象。 <br />优点: <br />1.理论上大小没有上限,受制于数据库表空间的大小. <br />2.流式读取. <br /><br />使用大对象的步骤: <br />1.先插入一个空的占位对象empty_blob()(oracle的函数):insert into t_blob values(?,?,empty_blob()); <br />2.获得大对象:select blob_data from t_blob where name = ? for update; <br />3.获取流进行写入:blob.setBinaryStream(0); <br />4.通过流来获取blob中存储的数据:blob.getBinaryStream()
          <br/>
          <span style="color:red;">
            <a href="http://flyinglife.javaeye.com/blog/217963#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 Jul 2008 12:14:37 +0800</pubDate>
        <link>http://flyinglife.javaeye.com/blog/217963</link>
        <guid>http://flyinglife.javaeye.com/blog/217963</guid>
      </item>
      <item>
        <title>MySQL存储过程之事务管理</title>
        <author>flyinglife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flyinglife.javaeye.com">flyinglife</a>&nbsp;
          链接：<a href="http://flyinglife.javaeye.com/blog/217777" style="color:red;">http://flyinglife.javaeye.com/blog/217777</a>&nbsp;
          发表时间: 2008年07月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://hideto.javaeye.com/blog/195275" target="_blank">http://hideto.javaeye.com/blog/195275</a><br /><br /><br />MySQL存储过程之事务管理 <br /><br />ACID:Atomic、Consistent、Isolated、Durable <br />存储程序提供了一个绝佳的机制来定义、封装和管理事务。 <br /><br />1，MySQL的事务支持 <br />MySQL的事务支持不是绑定在MySQL服务器本身，而是与存储引擎相关： <br />Java代码 <br />MyISAM：不支持事务，用于只读程序提高性能   <br />InnoDB：支持ACID事务、行级锁、并发   <br />Berkeley DB：支持事务  <br /><br />MyISAM：不支持事务，用于只读程序提高性能<br />InnoDB：支持ACID事务、行级锁、并发<br />Berkeley DB：支持事务<br /><br /><br />隔离级别： <br />隔离级别决定了一个session中的事务可能对另一个session的影响、并发session对数据库的操作、一个session中所见数据的一致性 <br />ANSI标准定义了4个隔离级别，MySQL的InnoDB都支持： <br />Java代码 <br />READ UNCOMMITTED：最低级别的隔离，通常又称为dirty read，它允许一个事务读取还没commit的数据，这样可能会提高性能，但是dirty read可能不是我们想要的   <br />READ COMMITTED：在一个事务中只允许已经commit的记录可见，如果session中select还在查询中，另一session此时insert一条记录，则新添加的数据不可见   <br />REPEATABLE READ：在一个事务开始后，其他session对数据库的修改在本事务中不可见，直到本事务commit或rollback。在一个事务中重复select的结果一样，除非本事务中update数据库。   <br />SERIALIZABLE：最高级别的隔离，只允许事务串行执行。为了达到此目的，数据库会锁住每行已经读取的记录，其他session不能修改数据直到前一事务结束，事务commit或取消时才释放锁。  <br /><br />READ UNCOMMITTED：最低级别的隔离，通常又称为dirty read，它允许一个事务读取还没commit的数据，这样可能会提高性能，但是dirty read可能不是我们想要的<br />READ COMMITTED：在一个事务中只允许已经commit的记录可见，如果session中select还在查询中，另一session此时insert一条记录，则新添加的数据不可见<br />REPEATABLE READ：在一个事务开始后，其他session对数据库的修改在本事务中不可见，直到本事务commit或rollback。在一个事务中重复select的结果一样，除非本事务中update数据库。<br />SERIALIZABLE：最高级别的隔离，只允许事务串行执行。为了达到此目的，数据库会锁住每行已经读取的记录，其他session不能修改数据直到前一事务结束，事务commit或取消时才释放锁。<br /><br /><br />可以使用如下语句设置MySQL的session隔离级别： <br />Java代码 <br />SET TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}  <br /><br />SET TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ COMMITTED | REPEATABLE READ | SERIALIZABLE}<br /><br /><br />MySQL默认的隔离级别是REPEATABLE READ，在设置隔离级别为READ UNCOMMITTED或SERIALIZABLE时要小心，READ UNCOMMITTED会导致数据完整性的严重问题，而SERIALIZABLE会导致性能问题并增加死锁的机率 <br /><br />事务管理语句： <br />Java代码 <br />START TRANSACTION：开始事务，autocommit设为0，如果已经有一个事务在运行，则会触发一个隐藏的COMMIT   <br />COMMIT：提交事务，保存更改，释放锁   <br />ROLLBACK：回滚本事务对数据库的所有更改，然后结束事务，释放锁   <br />SAVEPOINT savepoint_name：创建一个savepoint识别符来ROLLBACK TO SAVEPOINT   <br />ROLLBACK TO SAVEPOINT savepoint_name：回滚到从savepoint_name开始对数据库的所有更改，这样就允许回滚事务中的一部分，保证更改的一个子集被提交   <br />SET TRANSACTION：允许设置事务的隔离级别   <br />LOCK TABLES：允许显式的锁住一个或多个table，会隐式的关闭当前打开的事务，建议在执行LOCK TABLES语句之前显式的commit或rollback。我们一般所以一般在事务代码里不会使用LOCK TABLES  <br /><br />START TRANSACTION：开始事务，autocommit设为0，如果已经有一个事务在运行，则会触发一个隐藏的COMMIT<br />COMMIT：提交事务，保存更改，释放锁<br />ROLLBACK：回滚本事务对数据库的所有更改，然后结束事务，释放锁<br />SAVEPOINT savepoint_name：创建一个savepoint识别符来ROLLBACK TO SAVEPOINT<br />ROLLBACK TO SAVEPOINT savepoint_name：回滚到从savepoint_name开始对数据库的所有更改，这样就允许回滚事务中的一部分，保证更改的一个子集被提交<br />SET TRANSACTION：允许设置事务的隔离级别<br />LOCK TABLES：允许显式的锁住一个或多个table，会隐式的关闭当前打开的事务，建议在执行LOCK TABLES语句之前显式的commit或rollback。我们一般所以一般在事务代码里不会使用LOCK TABLES<br /><br /><br />2，定义事务 <br />MySQL默认的行为是在每条SQL语句执行后执行一个COMMIT语句，从而有效的将每条语句独立为一个事务。 <br />在复杂的应用场景下这种方式就不能满足需求了。 <br />为了打开事务，允许在COMMIT和ROLLBACK之前多条语句被执行，我们需要做以下两步： <br />1, 设置MySQL的autocommit属性为0，默认为1 <br />2，使用START TRANSACTION语句显式的打开一个事务 <br /><br />如果已经打开一个事务，则SET autocommit=0不会起作用，因为START TRANSACTION会隐式的提交session中所有当前的更改，结束已有的事务，并打开一个新的事务。 <br /><br />使用SET AUTOCOMMIT语句的存储过程例子： <br />Java代码 <br />CREATE PROCEDURE tfer_funds   <br />    (from_account int, to_account int, tfer_amount numeric(10,2))   <br />BEGIN   <br />    SET autocommit=0;   <br />  <br />    UPDATE account_balance SET balance=balance-tfer_amount WHERE account_id=from_account;   <br />  <br />    UPDATE account_balance SET balance=balance+tfer_amount WHERE account_id=to_account;   <br />  <br />    COMMIT;   <br />END;  <br /><br />CREATE PROCEDURE tfer_funds<br />    (from_account int, to_account int, tfer_amount numeric(10,2))<br />BEGIN<br />    SET autocommit=0;<br /><br />    UPDATE account_balance SET balance=balance-tfer_amount WHERE account_id=from_account;<br /><br />    UPDATE account_balance SET balance=balance+tfer_amount WHERE account_id=to_account;<br /><br />    COMMIT;<br />END;<br /><br />使用START TRANSACITON打开事务的例子： <br />Java代码 <br />CREATE PROCEDURE tfer_funds   <br />    (from_account int, to_account int, tfer_amount numeric(10,2))   <br />BEGIN   <br />    START TRANSACTION;   <br />  <br />    UPDATE account_balance SET balance=balance-tfer_amount WHERE account_id=from_account;   <br />  <br />    UPDATE account_balance SET balance=balance+tfer_amount WHERE account_id=to_account;   <br />  <br />    COMMIT;   <br />END;  <br /><br />CREATE PROCEDURE tfer_funds<br />    (from_account int, to_account int, tfer_amount numeric(10,2))<br />BEGIN<br />    START TRANSACTION;<br /><br />    UPDATE account_balance SET balance=balance-tfer_amount WHERE account_id=from_account;<br /><br />    UPDATE account_balance SET balance=balance+tfer_amount WHERE account_id=to_account;<br /><br />    COMMIT;<br />END;<br /><br /><br />通常COMMIT或ROLLBACK语句执行时才完成一个事务，但是有些DDL语句等会隐式触发COMMIT，所以应该在事务中尽可能少用或注意一下： <br />Java代码 <br />ALTER FUNCTION   <br />ALTER PROCEDURE   <br />ALTER TABLE   <br />BEGIN   <br />CREATE DATABASE   <br />CREATE FUNCTION   <br />CREATE INDEX   <br />CREATE PROCEDURE   <br />CREATE TABLE   <br />DROP DATABASE   <br />DROP FUNCTION   <br />DROP INDEX   <br />DROP PROCEDURE   <br />DROP TABLE   <br />UNLOCK TABLES   <br />LOAD MASTER DATA   <br />LOCK TABLES   <br />RENAME TABLE   <br />TRUNCATE TABLE   <br />SET AUTOCOMMIT=1  <br />START TRANSACTION  <br /><br />ALTER FUNCTION<br />ALTER PROCEDURE<br />ALTER TABLE<br />BEGIN<br />CREATE DATABASE<br />CREATE FUNCTION<br />CREATE INDEX<br />CREATE PROCEDURE<br />CREATE TABLE<br />DROP DATABASE<br />DROP FUNCTION<br />DROP INDEX<br />DROP PROCEDURE<br />DROP TABLE<br />UNLOCK TABLES<br />LOAD MASTER DATA<br />LOCK TABLES<br />RENAME TABLE<br />TRUNCATE TABLE<br />SET AUTOCOMMIT=1<br />START TRANSACTION<br /><br /><br />3，使用Savepoint <br />使用savepoint回滚难免有些性能消耗，一般可以用IF改写 <br />savepoint的良好使用的场景之一是“嵌套事务”，你可能希望程序执行一个小的事务，但是不希望回滚外面更大的事务： <br />Java代码 <br />CREATE PROCEDURE nested_tfer_funds   <br />    (in_from_acct   INTEGER,   <br />     in_to_acct     INTEGER,   <br />     in_tfer_amount DECIMAL(8,2))   <br />BEGIN   <br />    DECLARE txn_error INTEGER DEFAULT 0;   <br />  <br />    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN   <br />        SET txn_error=1;   <br />    END   <br />  <br />    SAVEPINT savepint_tfer;   <br />  <br />    UPDATE account_balance   <br />       SET balance=balance-in_tfer_amount   <br />     WHERE account_id=in_from_acct;   <br />  <br />    IF txn_error THEN   <br />        ROLLBACK TO savepoint_tfer;   <br />        SELECT 'Transfer aborted';   <br />    ELSE   <br />        UPDATE account_balance   <br />           SET balance=balance+in_tfer_amount   <br />         WHERE account_id=in_to_acct;   <br />  <br />        IF txn_error THEN   <br />            ROLLBACK TO savepoint_tfer;   <br />            SELECT 'Transfer aborted';   <br />  <br />        END IF:   <br />    END IF;   <br />END;  <br /><br />CREATE PROCEDURE nested_tfer_funds<br />    (in_from_acct   INTEGER,<br />     in_to_acct     INTEGER,<br />     in_tfer_amount DECIMAL(8,2))<br />BEGIN<br />    DECLARE txn_error INTEGER DEFAULT 0;<br /><br />    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN<br />        SET txn_error=1;<br />    END<br /><br />    SAVEPINT savepint_tfer;<br /><br />    UPDATE account_balance<br />       SET balance=balance-in_tfer_amount<br />     WHERE account_id=in_from_acct;<br /><br />    IF txn_error THEN<br />        ROLLBACK TO savepoint_tfer;<br />        SELECT 'Transfer aborted';<br />    ELSE<br />        UPDATE account_balance<br />           SET balance=balance+in_tfer_amount<br />         WHERE account_id=in_to_acct;<br /><br />        IF txn_error THEN<br />            ROLLBACK TO savepoint_tfer;<br />            SELECT 'Transfer aborted';<br /><br />        END IF:<br />    END IF;<br />END;<br /><br /><br />4，事务和锁 <br />事务的ACID属性只能通过限制数据库的同步更改来实现，从而通过对修改数据加锁来实现。 <br />直到事务触发COMMIT或ROLLBACK语句时锁才释放。 <br />缺点是后面的事务必须等前面的事务完成才能开始执行，吞吐量随着等待锁释放的时间增长而递减。 <br />MySQL/InnoDB通过行级锁来最小化锁竞争。这样修改同一table里其他行的数据没有限制，而且读数据可以始终没有等待。 <br />可以在SELECT语句里使用FOR UPDATE或LOCK IN SHARE MODE语句来加上行级锁 <br />Java代码 <br />SELECT select_statement options [FOR UPDATE|LOCK IN SHARE MODE]  <br /><br />SELECT select_statement options [FOR UPDATE|LOCK IN SHARE MODE]<br /><br />FOR UPDATE会锁住该SELECT语句返回的行，其他SELECT和DML语句必须等待该SELECT语句所在的事务完成 <br />LOCK IN SHARE MODE同FOR UPDATE，但是允许其他session的SELECT语句执行并允许获取SHARE MODE锁 <br /><br />死锁： <br />死锁发生于两个事务相互等待彼此释放锁的情景 <br />当MySQL/InnoDB检查到死锁时，它会强制一个事务rollback并触发一条错误消息 <br />对InnoDB而言，所选择的rollback的事务是完成工作最少的事务（所修改的行最少） <br />Java代码 <br />mysql > CALL tfer_funds(1,2,300);   <br />ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction  <br /><br />mysql > CALL tfer_funds(1,2,300);<br />ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction<br /><br />死锁在任何数据库系统里都可能发生，但是对MySQL/InnoDB这种行级锁数据库而言可能性相对较少。 <br />可以通过使用一致的顺序来锁row或table以及让事务保持尽可能短来减少死锁的频率。 <br />如果死锁不容易debug，你可以向你的程序中添加一些逻辑来处理死锁并重试事务，但这部分代码多了以后很难维护 <br />所以，比较好的避免死锁的方式是在做任何修改之前按一定的顺序添加行级锁，这样就能避免死锁: <br />Java代码 <br />CREATE PROCEDURE tfer_funds3   <br />    (from_account INT, to_account INT, tfer_amount NUMERIC(10,2))   <br />BEGIN   <br />    DECLARE local_account_id INT;   <br />    DECLARE lock_cursor CURSOR FOR   <br />        SELECT account_id   <br />          FROM account_balance   <br />         WHERE account_id IN (from_account, to_account)   <br />         ORDER BY account_id   <br />           FOR UPDATE;   <br />  <br />    START TRANSACTION;   <br />  <br />    OPEN lock_cursor;   <br />    FETCH lock_cursor INTO local_account_id;   <br />  <br />    UPDATE account_balance   <br />       SET balance=balance-tfer_amount   <br />     WHERE account_id=from_account;   <br />  <br />    UPDATE account_balance   <br />       SET balance=balance+tfer_amount   <br />     WHERE account_id=to_account;   <br />  <br />    CLOSE lock_cursor;   <br />  <br />    COMMIT;   <br />END;  <br /><br />CREATE PROCEDURE tfer_funds3<br />    (from_account INT, to_account INT, tfer_amount NUMERIC(10,2))<br />BEGIN<br />    DECLARE local_account_id INT;<br />    DECLARE lock_cursor CURSOR FOR<br />        SELECT account_id<br />          FROM account_balance<br />         WHERE account_id IN (from_account, to_account)<br />         ORDER BY account_id<br />           FOR UPDATE;<br /><br />    START TRANSACTION;<br /><br />    OPEN lock_cursor;<br />    FETCH lock_cursor INTO local_account_id;<br /><br />    UPDATE account_balance<br />       SET balance=balance-tfer_amount<br />     WHERE account_id=from_account;<br /><br />    UPDATE account_balance<br />       SET balance=balance+tfer_amount<br />     WHERE account_id=to_account;<br /><br />    CLOSE lock_cursor;<br /><br />    COMMIT;<br />END;<br /><br /><br />设置死锁ttl: innodb_lock_wait_timeout，默认为50秒 <br />如果你在一个事务中混合使用InnoDB和非InnoDB表，则MySQL不能检测到死锁，此时会抛出“lock wait timeuot”1205错误 <br /><br />乐观所和悲观锁策略： <br />悲观锁：在读取数据时锁住那几行，其他对这几行的更新需要等到悲观锁结束时才能继续 <br />乐观所：读取数据时不锁，更新时检查是否数据已经被更新过，如果是则取消当前更新 <br />一般在悲观锁的等待时间过长而不能接受时我们才会选择乐观锁 <br />悲观锁的例子： <br />Java代码 <br />CREATE PROCEDURE tfer_funds   <br />       (from_account INT, to_account INT,tfer_amount NUMERIC(10,2),   <br />        OUT status INT, OUT message VARCHAR(30))   <br />BEGIN   <br />    DECLARE from_account_balance NUMERIC(10,2);   <br />  <br />    START TRANSACTION;   <br />  <br />  <br />    SELECT balance   <br />      INTO from_account_balance   <br />      FROM account_balance   <br />     WHERE account_id=from_account   <br />       FOR UPDATE;   <br />  <br />    IF from_account_balance>=tfer_amount THEN   <br />  <br />         UPDATE account_balance   <br />            SET balance=balance-tfer_amount   <br />          WHERE account_id=from_account;   <br />  <br />         UPDATE account_balance   <br />            SET balance=balance+tfer_amount   <br />          WHERE account_id=to_account;   <br />         COMMIT;   <br />  <br />         SET status=0;   <br />         SET message='OK';   <br />    ELSE   <br />         ROLLBACK;   <br />         SET status=-1;   <br />         SET message='Insufficient funds';   <br />    END IF;   <br />END;  <br /><br />CREATE PROCEDURE tfer_funds<br />       (from_account INT, to_account INT,tfer_amount NUMERIC(10,2),<br />        OUT status INT, OUT message VARCHAR(30))<br />BEGIN<br />    DECLARE from_account_balance NUMERIC(10,2);<br /><br />    START TRANSACTION;<br /><br /><br />    SELECT balance<br />      INTO from_account_balance<br />      FROM account_balance<br />     WHERE account_id=from_account<br />       FOR UPDATE;<br /><br />    IF from_account_balance>=tfer_amount THEN<br /><br />         UPDATE account_balance<br />            SET balance=balance-tfer_amount<br />          WHERE account_id=from_account;<br /><br />         UPDATE account_balance<br />            SET balance=balance+tfer_amount<br />          WHERE account_id=to_account;<br />         COMMIT;<br /><br />         SET status=0;<br />         SET message='OK';<br />    ELSE<br />         ROLLBACK;<br />         SET status=-1;<br />         SET message='Insufficient funds';<br />    END IF;<br />END;<br /><br />乐观锁的例子： <br />Java代码 <br />CREATE PROCEDURE tfer_funds   <br />    (from_account INT, to_account INT, tfer_amount NUMERIC(10,2),   <br />        OUT status INT, OUT message VARCHAR(30) )   <br />  <br />BEGIN   <br />  <br />    DECLARE from_account_balance    NUMERIC(8,2);   <br />    DECLARE from_account_balance2   NUMERIC(8,2);   <br />    DECLARE from_account_timestamp1 TIMESTAMP;   <br />    DECLARE from_account_timestamp2 TIMESTAMP;   <br />  <br />    SELECT account_timestamp,balance   <br />        INTO from_account_timestamp1,from_account_balance   <br />            FROM account_balance   <br />            WHERE account_id=from_account;   <br />  <br />    IF (from_account_balance>=tfer_amount) THEN   <br />  <br />        -- Here we perform some long running validation that   <br />        -- might take a few minutes */   <br />        CALL long_running_validation(from_account);   <br />  <br />        START TRANSACTION;   <br />  <br />        -- Make sure the account row has not been updated since   <br />        -- our initial check   <br />        SELECT account_timestamp, balance   <br />            INTO from_account_timestamp2,from_account_balance2   <br />            FROM account_balance   <br />            WHERE account_id=from_account   <br />            FOR UPDATE;   <br />  <br />        IF (from_account_timestamp1 &lt;> from_account_timestamp2 OR   <br />            from_account_balance    &lt;> from_account_balance2)  THEN   <br />            ROLLBACK;   <br />            SET status=-1;   <br />            SET message=CONCAT("Transaction cancelled due to concurrent update",   <br />                " of account"  ,from_account);   <br />        ELSE   <br />            UPDATE account_balance   <br />                SET balance=balance-tfer_amount   <br />                WHERE account_id=from_account;   <br />  <br />            UPDATE account_balance   <br />                SET balance=balance+tfer_amount   <br />                WHERE account_id=to_account;   <br />  <br />            COMMIT;   <br />  <br />            SET status=0;   <br />            SET message="OK";   <br />        END IF;   <br />  <br />    ELSE   <br />        ROLLBACK;   <br />        SET status=-1;   <br />        SET message="Insufficient funds";   <br />    END IF;   <br />END$$  <br /><br />CREATE PROCEDURE tfer_funds<br />    (from_account INT, to_account INT, tfer_amount NUMERIC(10,2),<br />        OUT status INT, OUT message VARCHAR(30) )<br /><br />BEGIN<br /><br />    DECLARE from_account_balance    NUMERIC(8,2);<br />    DECLARE from_account_balance2   NUMERIC(8,2);<br />    DECLARE from_account_timestamp1 TIMESTAMP;<br />    DECLARE from_account_timestamp2 TIMESTAMP;<br /><br />    SELECT account_timestamp,balance<br />        INTO from_account_timestamp1,from_account_balance<br />            FROM account_balance<br />            WHERE account_id=from_account;<br /><br />    IF (from_account_balance>=tfer_amount) THEN<br /><br />        -- Here we perform some long running validation that<br />        -- might take a few minutes */<br />        CALL long_running_validation(from_account);<br /><br />        START TRANSACTION;<br /><br />        -- Make sure the account row has not been updated since<br />        -- our initial check<br />        SELECT account_timestamp, balance<br />            INTO from_account_timestamp2,from_account_balance2<br />            FROM account_balance<br />            WHERE account_id=from_account<br />            FOR UPDATE;<br /><br />        IF (from_account_timestamp1 &lt;> from_account_timestamp2 OR<br />            from_account_balance    &lt;> from_account_balance2)  THEN<br />            ROLLBACK;<br />            SET status=-1;<br />            SET message=CONCAT("Transaction cancelled due to concurrent update",<br />                " of account"  ,from_account);<br />        ELSE<br />            UPDATE account_balance<br />                SET balance=balance-tfer_amount<br />                WHERE account_id=from_account;<br /><br />            UPDATE account_balance<br />                SET balance=balance+tfer_amount<br />                WHERE account_id=to_account;<br /><br />            COMMIT;<br /><br />            SET status=0;<br />            SET message="OK";<br />        END IF;<br /><br />    ELSE<br />        ROLLBACK;<br />        SET status=-1;<br />        SET message="Insufficient funds";<br />    END IF;<br />END$$<br /><br /><br />5，事务设计指南 <br />Java代码 <br />1，保持事务短小   <br />2，尽量避免事务中rollback   <br />3，尽量避免savepoint   <br />4，默认情况下，依赖于悲观锁   <br />5，为吞吐量要求苛刻的事务考虑乐观锁   <br />6，显示声明打开事务   <br />7，锁的行越少越好，锁的时间越短越好
          <br/>
          <span style="color:red;">
            <a href="http://flyinglife.javaeye.com/blog/217777#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 Jul 2008 11:32:16 +0800</pubDate>
        <link>http://flyinglife.javaeye.com/blog/217777</link>
        <guid>http://flyinglife.javaeye.com/blog/217777</guid>
      </item>
      <item>
        <title>请问这是什么错误啊。</title>
        <author>flyinglife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flyinglife.javaeye.com">flyinglife</a>&nbsp;
          链接：<a href="http://flyinglife.javaeye.com/blog/207701" style="color:red;">http://flyinglife.javaeye.com/blog/207701</a>&nbsp;
          发表时间: 2008年06月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          undefined method `whiny_protected_attributes=' for ActiveRecord::Base:Class<br /><br />我刚装的rails2.1.0 ，在执行 rake db:schema:load时出错，会不会是版本太新了。<br /><br />我要用回指定的rails版本怎么办啊？ 求教！
          <br/>
          <span style="color:red;">
            <a href="http://flyinglife.javaeye.com/blog/207701#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Jun 2008 01:09:53 +0800</pubDate>
        <link>http://flyinglife.javaeye.com/blog/207701</link>
        <guid>http://flyinglife.javaeye.com/blog/207701</guid>
      </item>
      <item>
        <title>近来学习了BIRT</title>
        <author>flyinglife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flyinglife.javaeye.com">flyinglife</a>&nbsp;
          链接：<a href="http://flyinglife.javaeye.com/blog/83161" style="color:red;">http://flyinglife.javaeye.com/blog/83161</a>&nbsp;
          发表时间: 2007年05月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1.spring+struts+hibernate+db2+websphere5.1</p>
<p>要点：连接db2要求ibm的jdk,处理方法，把ibm的jre拷贝到eclipse.exe同目录下。</p>
<p>　　　发布到websphere时，要设置</p>
          <br/>
          <span style="color:red;">
            <a href="http://flyinglife.javaeye.com/blog/83161#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 25 May 2007 18:33:11 +0800</pubDate>
        <link>http://flyinglife.javaeye.com/blog/83161</link>
        <guid>http://flyinglife.javaeye.com/blog/83161</guid>
      </item>
      <item>
        <title>quartz-scheduler阶段性总结 1</title>
        <author>flyinglife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flyinglife.javaeye.com">flyinglife</a>&nbsp;
          链接：<a href="http://flyinglife.javaeye.com/blog/74552" style="color:red;">http://flyinglife.javaeye.com/blog/74552</a>&nbsp;
          发表时间: 2007年04月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;在阐述quartz是个什么东西之前，我先说个事。很多时候，我们经常在台历上标注出，某一天是某人的生日，某一天有某个重要的事情，给自己一个提醒。一个台历加上所要做的事情的内容，就是一个scheduler。计算机系统，是帮助人们完成既定事务的。所以，我们希望，把&ldquo;日程规划＋具体事务&rdquo;，交给系统，系统就能按照我们的要求自动去工作。<br />
&nbsp;&nbsp;&nbsp;&nbsp;好了，quartz就是这么一个东西。我们只需要定义好时间表，并对应指定的操作，它就能够按照我们的要求在指定时间驱动指定的工作，如此简单。不过中文网站能够找到的东西太有限了，推荐取opensymphony的官方网站，以及该网站的quartz论坛，地址是<img src="http://www.blogcn.com/images/aurl.gif" border="0" align="absBottom" hspace="2" alt="::URL::" /><a href="http://forums.opensymphony.com/category.jspa?categoryID=8。另外推荐一个java的blog：http://www.blogjava.net/javaora/。惊奇的发现，这个人所研究的和我现在研究的一模一样。" target="_blank">http://forums.opensymphony.com/category.jspa?categoryID=8。另外推荐一个java的blog：http://www.blogjava.net/javaora/。惊奇的发现，这个人所研究的和我现在研究的一模一样。</a> <br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;这个总结着重总结job的内容。<br />
&nbsp;&nbsp;&nbsp;&nbsp;quartz中，所有需要驱动的工作，都是实现job接口的类。job接口很简单，就只有一个excute()方法，只要把这个类交给quartz，它就会自动去执行这个方法。方法里面定义的就是我们真正需要进行的工作，恩，这都没有什么问题。<br />
&nbsp;&nbsp;&nbsp;&nbsp;现在的问题在于，很多时候我们需要执行的工作类，是外部类，并没有继承job接口。也就是说，我们希望quartz能够驱动任意的类的任意方法，这该怎么办？这也是我第一阶段的一个小目标。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;一开始我想改变quartz的驱动方式，也就是改变runshell里面的东西，后来发现，这太复杂了，这是quartz最核心的东西，动一发而牵全身。我只是想利用quartz的优势，并不想大规模的改动。<br />
&nbsp;&nbsp;&nbsp;&nbsp;走了不少弯路之后，想了一个不错的方案。就是，我们只需要定义好所需要的类名、方法名、方法需要的参数，然后利用reflect，来实例化类，然后invoke指定方法。而把这些工作放在一个通用的job模板中的excute方法，这样，我们只需要把指定参数传入这个通用job模板，然后直接驱动此job就能实现我们上面的目标。<br />
&nbsp;&nbsp;&nbsp;&nbsp;参数传递采用的方案是：<br />
&nbsp;&nbsp;&nbsp;&nbsp;1、数据源。把我们需要指定的信息以配置文件的方式给出，主要是，工作组、工作名、工作对应的类，指定的方法，所需的参数。<br />
&nbsp;&nbsp;&nbsp;&nbsp;2、数据传递。写一个metadata用来包装这些信息，这样做是为了将来管理的方便。然后用metadata来初始化jobdetail，重写工作组、工作名，将类信息保存在jobDataMap中，然后在执行excute的时候，再把这些信息取出来。<br />
&nbsp;&nbsp;&nbsp;&nbsp;3、工作执行。利用reflect技术，执行指定类的指定方式。<br />
&nbsp;&nbsp;&nbsp;&nbsp;4、数据返回。excute结束之前，把需要返回的数据放在jobDataMap中，scheduler结束之前，把这些数据从jobDataMap中取出来。<br />
&nbsp;&nbsp;&nbsp;&nbsp;完美的方案，开心一下！<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;下一步研究quartz的另外一个大部分&nbsp;时间表。<br />
          <br/>
          <span style="color:red;">
            <a href="http://flyinglife.javaeye.com/blog/74552#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Apr 2007 08:38:02 +0800</pubDate>
        <link>http://flyinglife.javaeye.com/blog/74552</link>
        <guid>http://flyinglife.javaeye.com/blog/74552</guid>
      </item>
      <item>
        <title>quartz-scheduler阶段性总结 2</title>
        <author>flyinglife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flyinglife.javaeye.com">flyinglife</a>&nbsp;
          链接：<a href="http://flyinglife.javaeye.com/blog/74553" style="color:red;">http://flyinglife.javaeye.com/blog/74553</a>&nbsp;
          发表时间: 2007年04月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;quartz的一些基本概念<br />
&nbsp;&nbsp;&nbsp;&nbsp;Job&nbsp;与&nbsp;JobDetail<br />
&nbsp;&nbsp;&nbsp;&nbsp;Job是quartz中最基本的概念了，Job做为一个接口只有一个execute()方法等待实现，理论上所有用quartz执行的job都需要实现这个接口，但是现在大多数的系统都不会服从这种约束，而希望能够更自由的调用原有系统中的类的方法。实现自由调用，有两个途径，我上一节总结中的那个方案是一个简单的途径，另外一个途径就是借助于spring的class&nbsp;bean，这个将在后面介绍。<br />
&nbsp;&nbsp;&nbsp;&nbsp;StatefullJob接口:&nbsp;无状态任务对应的JobDataMap可以认为是只读的,而有状态的任务在多次执行过程中保留对JobDataMap所作的修改,一个后果是有状态任务无法被并发执行。上面这句话是抄袭的，事实上我还是不是很清楚二者究竟的区别？<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;JobDetail是用来包装Job实例的具体细节的。Job以class的方式传入JobDetail，quartz会自动实例化Job类的。同时需要规定job的name和group，在jobdetail的validate()下，一个job是必须有name和group属性，并且二者组合标示唯一的job。JobDetail中的一些重要数据存放在JobDataMap中，这个map可以用来在控制程序和job内传递需要传递的参数。<br />
&nbsp;&nbsp;&nbsp;&nbsp;JobDetail还有三个重要的boolean值的属性，分别是durability、volatility、shouldRecover。这三个属性默认是false，主要在数据库操作的时候起作用。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Trigger时间调度<br />
&nbsp;&nbsp;&nbsp;&nbsp;相对于job，trigger简单一些。所谓的时间调度，就是设置job执行的时间表。Trigger主要分为SimpleTrigger和CronTrigger两大类。前者主要是以1/1000<br />
为单位的简单时间，可是设置startTime、endTime、repeatCount、repeatInterval等主要参数。CronTrigger的详细用法参看quartz文档的的CronTriggers&nbsp;Tutorial。<br />
&nbsp;&nbsp;&nbsp;&nbsp;scheduler.schedulerJob(jobDetail,&nbsp;trigger);将JobDetail和对应的Trigger部署到scheduler中，然后根据trigger的定义，自动执行指定job。<br />
&nbsp;&nbsp;&nbsp;&nbsp;Calendar这个类用来标识出特殊的时间，scheduler根据trigger执行job的时候，如果遇到这些标识出的特殊时间则不执行job。Calendar具体的接口有BaseCalendar、AnnualCalendar、HolidayCalendar、MonthlyCalendar、WeeklyCalendar等等。calendar的具体用法参看quartz的文档。<br />
&nbsp;&nbsp;&nbsp;&nbsp;Misfire&nbsp;Instruction....设定当trigger错过了触发时刻的时候需要采取的处理策略<br />
&nbsp;&nbsp;&nbsp;&nbsp;TriggerUtils相当于一个trigger&nbsp;factory，方便我们取得特殊trigger的实例，而不用自己去构造。<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;Listener是用来监听quartz的执行过程的，主要有JobListener，TriggerListener，SchedulerListener。joblistener监听一个job在quartz中执行的待执行，禁止执行，执行完毕三个状态。TriggerListener监听trigger触发、完成、错过、禁止四个状态。SchedulerListener监听scheduler执行过程的一些状态，具体参看SchedulerListener的源代码。<br />
          <br/>
          <span style="color:red;">
            <a href="http://flyinglife.javaeye.com/blog/74553#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 25 Apr 2007 08:38:00 +0800</pubDate>
        <link>http://flyinglife.javaeye.com/blog/74553</link>
        <guid>http://flyinglife.javaeye.com/blog/74553</guid>
      </item>
      <item>
        <title>面试技巧</title>
        <author>flyinglife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flyinglife.javaeye.com">flyinglife</a>&nbsp;
          链接：<a href="http://flyinglife.javaeye.com/blog/51224" style="color:red;">http://flyinglife.javaeye.com/blog/51224</a>&nbsp;
          发表时间: 2007年01月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>问题一：&ldquo;请你自我介绍一下&rdquo; <br />
<br />
常规思路： ①介绍内容要与个人简历相一致； ②表述方式上尽量口语化；③要切中要害，不谈无关、无用的内容；④条理要清晰，层次要分明；⑤事先最好以文字的形式写好背熟。 <br />
<br />
点评：我个人在面试中一般喜欢用这个作开场白，这个问题其实已经心里有数，只是作开场白而已，然后对阅读简历中发现的问题，在开场白的时候找机会了解。在回答这个问题的时候一定要想好细节，考官在这个时候一般都会追问几个细节。一般编造的简历和经历在这个过程中都会&ldquo;穿帮&rdquo;。 <br />
<br />
问题二：&ldquo;谈谈你的家庭情况&rdquo; <br />
<br />
常规思路：①对于了解应聘者的性格、观念、心态等有一定的作用，这是招聘公司提问的主要原因；②简单地罗列家庭人口；③宜强调温馨和睦的家庭氛围；④宜强调父母对自己教育的重视；⑤宜强调各位家庭成员的良好状况；⑥宜强调家庭成员对自己工作的支持；⑦宜强调自己对家庭的责任感。 <br />
<br />
点评：这个问题一般很少问，因为毕竟牵涉到个人隐私。国企和部分民营喜欢问，主要是了解社会关系。而不是上述的回答。 <br />
<br />
问题三：&ldquo;你有什么业余爱好？&rdquo; <br />
<br />
常规思路：①业余爱好能在一定程度上反映应聘者的性格、观念、心态，这是招聘单位提问的主要原因；②最好不要说自己没有业余爱好；③不要说自己有那些庸俗的、令人感觉不好的爱好；④最好不要说自己仅限于读书、听音乐、上网，否则可能令面试官怀疑应聘者性格孤僻；⑤最好能有一些户外的业余爱好来&ldquo;点缀&rdquo;你的形象。 <br />
<br />
点评：这个问题一般也问的不多，在面试大学生时提问的概率高些。如果在面试有工作经验人士的时候，主要目的是为了消除紧张感，使对方放松，这个问题本身没有什么特别意义。 <br />
<br />
问题四：&ldquo;你最崇拜谁？&rdquo; <br />
<br />
常规思路：①最崇拜的人能在一定程度上反映应聘者的性格、观念、心态，这是面试官的主要目的；②不宜说自己谁都不崇拜；③不宜说崇拜自己；④不宜说崇拜一个虚幻的、或是不知名的人；⑤不宜说崇拜一个明显具有负面形象的人；⑥所崇拜的人最好与自己所应聘的工作能&ldquo;搭&rdquo;上关系；⑦最好说出自己所崇拜的人的哪些品质、哪些思想感染着自己、鼓舞着自己。 <br />
<br />
点评：这个也最多使面试应届生时候的问题，对经验人士从来不用，否则会显得考官比较傻。 <br />
<br />
问题五：&ldquo;你的座右铭是什么？&rdquo; <br />
<br />
常规思路：①座右铭能在一定程度上反映应聘者的性格、观念、心态，这是面试官问这个问题的主要原因；②不宜说那些医引起不好联想的座右铭；③不宜说那些太抽象的座右铭；④不宜说太长的座右铭；⑤座右铭最好能反映出自己某种优秀品质；⑥参考答案&mdash;&mdash;&ldquo;只为成功找方法，不为失败找借口&rdquo;。 <br />
<br />
点评：此问题回答同上。 <br />
<br />
问题六：&ldquo;谈谈你的缺点&rdquo; <br />
<br />
常规思路：①不宜说自己没缺点；②不宜把那些明显的优点说成缺点；③不宜说出严重影响所应聘职位的缺点；④不宜说出令人不放心、不舒服的缺点；⑤可以说出一些对于所应聘职位&ldquo;无关紧要&rdquo;的缺点，甚至是一些表面上看似&ldquo;缺点&rdquo;，从工作的角度看却是优点的&ldquo;缺点&rdquo;。 <br />
<br />
点评：这个问题上是各种教人面试技巧中，最&ldquo;害人&rdquo;的。考官问这个问题，是想测试一个人的成熟度、对自己的判断、和学习改进能力。说出自己有什么缺点，其实一点都不重要。这里重点测评的是面试者是不是真正的对自己有一个正确的评价，而且一般在问这类问题的时候，我喜欢让面试者举出一两件具体事例，这样更具有真实性。尤其是用上面的思路5来回答，纯粹是把面试官当成XXX，难道他们听不出来吗？，如果这样回答，应聘者在面试官心中一定减分不少。 <br />
<br />
问题七：&ldquo;谈一谈你的一次失败经历&rdquo; <br />
<br />
常规思路：①不宜说自己没有失败的经历；②不宜把那些明显的成功说成是失败；③不宜说出严重影响所应聘职位的失败经历；④所谈经历的结果应是失败的；⑤宜说明失败之前自己曾信心百倍、尽心尽力；⑥说明仅仅是由于外在客观原因导致失败；⑦失败后自己很快振作起来，以更加饱满的热情面对以后的工作。 <br />
<br />
点评：上面所谓的经典思路，在这个问题上又一次误判的考官的目的。考官在问这个问题的时候，他的目的仅仅是想知道你做事的手法，而并不是想知道你失败的事情。这个问题会经常变为你成功的经历、工作中最难忘的一件事等等。考官一般在这个时候会重点了解3个方面，当时的背景和资源、应聘者处理事情的手法、应聘者当时反思的结果。通过这三点了解一个人的做事手法和学习能力。上面的所谓思路，纠集于解释失败上面，纯粹是中了考官的圈套。 <br />
<br />
问题八：&ldquo;你为什么选择我们公司？&rdquo; <br />
<br />
常规思路： ①面试官试图从中了解你求职的动机、愿望以及对此项工作的态度；②建议从行业、企业和岗位这三个角度来回答；③参考答案&mdash;&mdash;&ldquo;我十分看好贵公司所在的行业，我认为贵公司十分重视人才，而且这项工作很适合我，相信自己一定能做好。&rdquo; <br />
<br />
点评：我很少问这个问题，如果有人问此问题按照思路中作答尚可。 <br />
<br />
问题九：&ldquo;对这项工作，你有哪些可预见的困难？&rdquo; <br />
<br />
常规思路：①不宜直接说出具体的困难，否则可能令对方怀疑应聘者不行；②可以尝试迂回战术，说出应聘者对困难所持有的态度&mdash;&mdash;&ldquo;工作中出现一些困难是正常的，也是难免的，但是只要有坚忍不拔的毅力、良好的合作精神以及事前周密而充分的准备，任何困难都是可以克服。&rdquo; <br />
<br />
点评：一般问这个问题，面试者的希望就比较大了，因为已经在谈工作细节。但常规思路中的回答，又被面试官&ldquo;骗&rdquo;了。当面试官询问这个问题的时候，有两个目的。第一，看看应聘者是不是在行，说出的困难是不是在这个职位中一般都不可避免的问题。第二，是想看一下应聘者解决困难的手法对不对，及公司能否提供这样的资源。而不是想了解应聘者对困难的态度。 <br />
<br />
问题十：&ldquo;如果我录用你，你将怎样开展工作？&rdquo; <br />
<br />
常规思路： ①如果应聘者对于应聘的职位缺乏足够的了解，最好不要直接说出自己开展工作的具体办法；②可以尝试采用迂回战术来回答，如&ldquo;首先听取领导的指示和要求，然后就有关情况进行了解和熟悉，接下来制定一份近期的工作计划并报领导批准，最后根据计划开展工作。&rdquo; <br />
<br />
点评：这个问题的主要目的也是了解应聘者的工作能力和计划性、条理性，而且重点想要知道细节。如果向思路中所讲的迂回战术，面试官会认为回避问题，如果引导了几次仍然是回避的话。此人绝对不会录用了。 <br />
<br />
问题十一：&ldquo;与上级意见不一是，你将怎么办？&rdquo; <br />
<br />
常规思路：①一般可以这样回答&ldquo;我会给上级以必要的解释和提醒，在这种情况下，我会服从上级的意见。&rdquo;②如果面试你的是总经理，而你所应聘的职位另有一位经理，且这位经理当时不在场，可以这样回答：&ldquo;对于非原则性问题，我会服从上级的意见，对于涉及公司利益的重大问题，我希望能向更高层领导反映。&rdquo; <br />
<br />
点评：这个问题的标准答案是思路1，如果用2的回答，必死无疑。你没有摸清楚改公司的内部情况，先想打小报告，这样的人没有人敢要。 <br />
<br />
问题十二：&ldquo;我们为什么要录用你？&rdquo; <br />
<br />
常规思路：①应聘者最好站在招聘公司的角度来回答；②招聘公司一般会录用这样的应聘者：基本符合条件、对这份工作感兴趣、有足够的信心；③如&ldquo;我符合贵公司的招聘条件，凭我目前掌握的技能、高度的责任感和良好的适应能力及学习能力 ，完全能胜任这份工作。我十分希望能为贵公司服务，如果贵公司给我这个机会，我一定能成为贵公司的栋梁！&rdquo; <br />
<br />
点评：按思路中的回答还可以。 <br />
<br />
问题十三：&ldquo;你是应届毕业生，缺乏经验，如何能胜任这项工作？&rdquo; <br />
<br />
常规思路：①如果招聘单位对应届毕业生的应聘者提出这个问题，说明招聘公司并不真正在乎&ldquo;经验&rdquo;，关键看应聘者怎样回答；②对这个问题的回答最好要体现出应聘者的诚恳、机智、果敢及敬业；③如&ldquo;作为应届毕业生，在工作经验方面的确会有所欠缺，因此在读书期间我一直利用各种机会在这个行业里做兼职。我也发现，实际工作远比书本知识丰富、复杂。但我有较强的责任心、适应能力和学习能力，而且比较勤奋，所以在兼职中均能圆满完成各项工作，从中获取的经验也令我受益非浅。请贵公司放心，学校所学及兼职的工作经验使我一定能胜任这个职位。&rdquo; <br />
<br />
点评：这个问题思路中的答案尚可。突出自己的吃苦能力和适应性以及学习能力（不是学习成绩）为好。 <br />
<br />
问题十四：&ldquo;你希望与什么样的上级共事？&rdquo; <br />
<br />
常规思路：①通过应聘者对上级的&ldquo;希望&rdquo;可以判断出应聘者对自我要求的意识，这既上一个陷阱，又是一次机会；②最好回避对上级具体的希望，多谈对自己的要求；③如&ldquo;做为刚步入社会的新人，我应该多要求自己尽快熟悉环境、适应环境，而不应该对环境提出什么要求，只要能发挥我的专长就可以了 <br />
<br />
点评：这个问题比较好的回答是，希望我的上级能够在工作中对我多指导，对我工作中的错误能够立即指出。总之，从上级指导这个方面谈，不会有大的纰漏。 <br />
<br />
问题十五：&ldquo;您在前一家公司的离职原因是什么？&rdquo; <br />
<br />
常规思路：①最重要的是：应聘者要使找招聘单位相信，应聘者在过往的单位的&ldquo;离职原因&rdquo;在此家招聘单位里不存在；②避免把&ldquo;离职原因&rdquo;说得太详细、太具体；③不能掺杂主观的负面感受，如&ldquo;太辛苦&rdquo;、&ldquo;人际关系复杂&rdquo;、&ldquo;管理太混乱&rdquo;、&ldquo;公司不重视人才&rdquo;、&ldquo;公司排斥我们某某的员工&rdquo;等；④但也不能躲闪、回避，如&ldquo;想换换环境&rdquo;、&ldquo;个人原因&rdquo;等；⑤不能涉及自己负面的人格特征，如不诚实、懒惰、缺乏责任感、不随和等；⑥尽量使解释的理由为应聘者个人形象添彩；⑦相关例子：如&ldquo;我离职是因为这家公司倒闭；我在公司工作了三年多，有较深的感情；从去年始，由于市场形势突变，公司的局面急转直下；到眼下这一步我觉得很遗憾，但还要面对显示，重新寻找能发挥我能力的舞台。&rdquo;同一个面试问题并非只有一个答案，而同一个答案并不是在任何面试场合都有效，关键在应聘者掌握了规律后，对面试的具体情况进行把握，有意识地揣摩面试官提出问题的心理背景，然后投其所好。 <br />
<br />
点评：除非是薪资太低，或者是最初的工作，否则不要用薪资作为理由。&ldquo;求发展&rdquo;也被考官听得太多，离职理由要根据每个人的真实离职理由来设计，但是在回答时一定要表现得真诚。实在想不出来的时候，家在外地可以说是因为家中有事，须请假几个月，公司又不可能准假，所以辞职。这个答案一般面试官还能接受<wbr></wbr> </p>
          <br/>
          <span style="color:red;">
            <a href="http://flyinglife.javaeye.com/blog/51224#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 30 Jan 2007 13:17:05 +0800</pubDate>
        <link>http://flyinglife.javaeye.com/blog/51224</link>
        <guid>http://flyinglife.javaeye.com/blog/51224</guid>
      </item>
      <item>
        <title>[action]: Servlet.service() for servlet action threw excepti</title>
        <author>flyinglife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flyinglife.javaeye.com">flyinglife</a>&nbsp;
          链接：<a href="http://flyinglife.javaeye.com/blog/50697" style="color:red;">http://flyinglife.javaeye.com/blog/50697</a>&nbsp;
          发表时间: 2007年01月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>[action]: Servlet.service() for servlet action threw exception<br />
这个错误可能是页面有一个集合类,而用户把集合类中的类型搞错了.</p>
<p>有时候是session中有同名的集合类,比如 [ list&nbsp; ]</p>
          <br/>
          <span style="color:red;">
            <a href="http://flyinglife.javaeye.com/blog/50697#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 26 Jan 2007 17:03:01 +0800</pubDate>
        <link>http://flyinglife.javaeye.com/blog/50697</link>
        <guid>http://flyinglife.javaeye.com/blog/50697</guid>
      </item>
      <item>
        <title>oracle to_date()用法</title>
        <author>flyinglife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flyinglife.javaeye.com">flyinglife</a>&nbsp;
          链接：<a href="http://flyinglife.javaeye.com/blog/50601" style="color:red;">http://flyinglife.javaeye.com/blog/50601</a>&nbsp;
          发表时间: 2007年01月26日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          to_date(string,[format,[nlsparams]])函数将char &nbsp; 或varchar2类型的值转化为一个Date值。 &nbsp; <br />
&nbsp; format,nlsparams是可选项；format &nbsp; 指定了要转化的格式；nlsparams指定了返回日期所使用的语言，格式为：'NLS_DATE_LANGUAGE=LANGUAGE'；如果没有指定format和nlsparams，则按oracle的默认模式处理。如下例： &nbsp; <br />
&nbsp; 1)select &nbsp; to_date('2003 &nbsp; JULY &nbsp; 21','YYYY-MM-DD','NLS_DATE_LANGUE=english)&quot;result&quot; &nbsp; from &nbsp; dual; &nbsp; <br />
&nbsp; 2)select &nbsp; to_date('20030411155050','YYYY-MM-DD &nbsp; HH24MISS') &nbsp; FROM &nbsp; DUAL;&nbsp;&nbsp;
          <br/>
          <span style="color:red;">
            <a href="http://flyinglife.javaeye.com/blog/50601#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 26 Jan 2007 11:44:08 +0800</pubDate>
        <link>http://flyinglife.javaeye.com/blog/50601</link>
        <guid>http://flyinglife.javaeye.com/blog/50601</guid>
      </item>
      <item>
        <title>select语句完整语句</title>
        <author>flyinglife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flyinglife.javaeye.com">flyinglife</a>&nbsp;
          链接：<a href="http://flyinglife.javaeye.com/blog/50317" style="color:red;">http://flyinglife.javaeye.com/blog/50317</a>&nbsp;
          发表时间: 2007年01月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一.<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">语句</strong>的<strong style="COLOR: black; BACKGROUND-COLOR: #99ff99">完整语法</strong>为：&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>[ALL|DISTINCT|DISTINCTROW|TOP]&nbsp;<br />
{*|talbe.*|[table.]field1[AS&nbsp;alias1][,[table.]field2[AS&nbsp;alias2][,&hellip;]]}&nbsp;<br />
FROM&nbsp;tableexpression[,&hellip;][IN&nbsp;externaldatabase]&nbsp;<br />
[WHERE&hellip;]&nbsp;<br />
[GROUP&nbsp;BY&hellip;]&nbsp;<br />
[HAVING&hellip;]&nbsp;<br />
[ORDER&nbsp;BY&hellip;]&nbsp;<br />
[WITH&nbsp;OWNERACCESS&nbsp;OPTION]&nbsp;<br />
说明：&nbsp;<br />
用中括号([])括起来的部分表示是可选的，用大括号({})括起来的部分是表示必须从中选择其中的一个。&nbsp;<br />
1&nbsp;FROM子句&nbsp;<br />
FROM子句指定了<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">语句</strong>中字段的来源。FROM子句后面是包含一个或多个的表达式(由逗号分开)，其中的表达式可为单一表名称、已保存的查询或由&nbsp;INNER&nbsp;JOIN、LEFT&nbsp;JOIN&nbsp;或&nbsp;RIGHT&nbsp;JOIN&nbsp;得到的复合结果。如果表或查询存储在外部数据库，在IN&nbsp;子句之后指明其完整路径。&nbsp;<br />
例：下列SQL<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">语句</strong>返回所有有定单的客户：&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;OrderID,Customer.customerID&nbsp;<br />
FROM&nbsp;Orders&nbsp;Customers&nbsp;<br />
WHERE&nbsp;Orders.CustomerID=Customers.CustomeersID&nbsp;<br />
<br />
2&nbsp;ALL、DISTINCT、DISTINCTROW、TOP谓词&nbsp;<br />
(1)&nbsp;ALL&nbsp;返回满足SQL<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">语句</strong>条件的所有记录。如果没有指明这个谓词，默认为ALL。&nbsp;<br />
例：<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;ALL&nbsp;FirstName,LastName&nbsp;<br />
FROM&nbsp;Employees&nbsp;<br />
(2)&nbsp;DISTINCT&nbsp;如果有多个记录的选择字段的数据相同，只返回一个。&nbsp;<br />
(3)&nbsp;DISTINCTROW&nbsp;如果有重复的记录，只返回一个&nbsp;<br />
(4)&nbsp;TOP显示查询头尾若干记录。也可返回记录的百分比，这是要用&nbsp;TOP&nbsp;N&nbsp;PERCENT子句（其中N&nbsp;表示百分比）&nbsp;<br />
例：返回5%定货额最大的定单&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;TOP&nbsp;5&nbsp;PERCENT*&nbsp;<br />
FROM&nbsp;[&nbsp;Order&nbsp;Details]&nbsp;<br />
ORDER&nbsp;BY&nbsp;UnitPrice*Quantity*(1-Discount)&nbsp;DESC&nbsp;<br />
<br />
3&nbsp;用&nbsp;AS&nbsp;子句为字段取别名&nbsp;<br />
如果想为返回的列取一个新的标题，或者，经过对字段的计算或总结之后，产生了一个新的值，希望把它放到一个新的列里显示，则用AS保留。&nbsp;<br />
例：返回FirstName字段取别名为NickName&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;FirstName&nbsp;AS&nbsp;NickName&nbsp;,LastName&nbsp;,City&nbsp;<br />
FROM&nbsp;Employees&nbsp;<br />
例：返回新的一列显示库存价值&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;ProductName&nbsp;,UnitPrice&nbsp;,UnitsInStock&nbsp;,UnitPrice*UnitsInStock&nbsp;AS&nbsp;valueInStock&nbsp;<br />
FROM&nbsp;Products&nbsp;<br />
<br />
二&nbsp;.WHERE&nbsp;子句指定查询条件&nbsp;<br />
<br />
1&nbsp;比较运算符&nbsp;<br />
比较运算符&nbsp;含义&nbsp;<br />
=&nbsp;等于&nbsp;<br />
&gt;&nbsp;大于&nbsp;<br />
&lt;&nbsp;小于&nbsp;<br />
&gt;=&nbsp;大于等于&nbsp;<br />
&lt;=&nbsp;小于等于&nbsp;<br />
&lt;&gt;&nbsp;不等于&nbsp;<br />
!&gt;&nbsp;不大于&nbsp;<br />
!&lt;&nbsp;不小于&nbsp;<br />
例：返回96年1月的定单&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;OrderID,&nbsp;CustomerID,&nbsp;OrderDate&nbsp;<br />
FROM&nbsp;Orders&nbsp;<br />
WHERE&nbsp;OrderDate&gt;#1/1/96#&nbsp;AND&nbsp;OrderDate&lt;#1/30/96#&nbsp;<br />
注意：&nbsp;<br />
Mcirosoft&nbsp;JET&nbsp;SQL&nbsp;中，日期用&lsquo;#&rsquo;定界。日期也可以用Datevalue()函数来代替。在比较字符型的数据时，要加上单引号&rsquo;&rsquo;，尾空格在比较中被忽略。&nbsp;<br />
例：&nbsp;<br />
WHERE&nbsp;OrderDate&gt;#96-1-1#&nbsp;<br />
也可以表示为：&nbsp;<br />
WHERE&nbsp;OrderDate&gt;Datevalue(&lsquo;1/1/96&rsquo;)&nbsp;<br />
使用&nbsp;NOT&nbsp;表达式求反。&nbsp;<br />
例：查看96年1月1日以后的定单&nbsp;<br />
WHERE&nbsp;Not&nbsp;OrderDate&lt;=#1/1/96#&nbsp;<br />
2&nbsp;范围（BETWEEN&nbsp;和&nbsp;NOT&nbsp;BETWEEN）&nbsp;<br />
BETWEEN&nbsp;&hellip;AND&hellip;运算符指定了要搜索的一个闭区间。&nbsp;<br />
例：返回96年1月到96年2月的定单。&nbsp;<br />
WHERE&nbsp;OrderDate&nbsp;Between&nbsp;#1/1/96#&nbsp;And&nbsp;#2/1/96#&nbsp;<br />
3&nbsp;列表（IN&nbsp;，NOT&nbsp;IN）&nbsp;<br />
IN&nbsp;运算符用来匹配列表中的任何一个值。IN子句可以代替用OR子句连接的一连串的条件。&nbsp;<br />
例：要找出住在&nbsp;London、Paris或Berlin的所有客户&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;CustomerID,&nbsp;CompanyName,&nbsp;ContactName,&nbsp;City&nbsp;<br />
FROM&nbsp;Customers&nbsp;<br />
WHERE&nbsp;City&nbsp;In(&lsquo;London&rsquo;,&rsquo;&nbsp;Paris&rsquo;,&rsquo;&nbsp;Berlin&rsquo;)&nbsp;<br />
4&nbsp;模式匹配(LIKE)&nbsp;<br />
LIKE运算符检验一个包含字符串数据的字段值是否匹配一指定模式。&nbsp;<br />
LIKE运算符里使用的通配符&nbsp;<br />
通配符&nbsp;含义&nbsp;<br />
？&nbsp;任何一个单一的字符&nbsp;<br />
*&nbsp;任意长度的字符&nbsp;<br />
#&nbsp;0~9之间的单一数字&nbsp;<br />
[字符列表]&nbsp;在字符列表里的任一值&nbsp;<br />
[！字符列表]&nbsp;不在字符列表里的任一值&nbsp;<br />
-&nbsp;指定字符范围，两边的值分别为其上下限&nbsp;<br />
例：返回邮政编码在（171）555-0000到（171）555-9999之间的客户&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;CustomerID&nbsp;,CompanyName,City,Phone&nbsp;<br />
FROM&nbsp;Customers&nbsp;<br />
WHERE&nbsp;Phone&nbsp;Like&nbsp;&lsquo;(171)555-####&rsquo;&nbsp;<br />
LIKE运算符的一些样式及含义&nbsp;<br />
样式&nbsp;含义&nbsp;不符合&nbsp;<br />
LIKE&nbsp;&lsquo;A*&rsquo;&nbsp;A后跟任意长度的字符&nbsp;Bc,c255&nbsp;<br />
LIKE&rsquo;5[*]&rsquo;&nbsp;5*5&nbsp;555&nbsp;<br />
LIKE&rsquo;5?5&rsquo;&nbsp;5与5之间有任意一个字符&nbsp;55,5wer5&nbsp;<br />
LIKE&rsquo;5##5&rsquo;&nbsp;5235，5005&nbsp;5kd5,5346&nbsp;<br />
LIKE&rsquo;[a-z]&rsquo;&nbsp;a-z间的任意一个字符&nbsp;5,%&nbsp;<br />
LIKE&rsquo;[!0-9]&rsquo;&nbsp;非0-9间的任意一个字符&nbsp;0,1&nbsp;<br />
LIKE&rsquo;[[]&rsquo;&nbsp;1,*&nbsp;<br />
三&nbsp;.用ORDER&nbsp;BY子句排序结果&nbsp;<br />
ORDER子句按一个或多个（最多16个）字段排序查询结果，可以是升序（ASC）也可以是降序（DESC），缺省是升序。ORDER子句通常放在SQL<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">语句</strong>的最后。&nbsp;<br />
ORDER子句中定义了多个字段，则按照字段的先后顺序排序。&nbsp;<br />
例：&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;ProductName,UnitPrice,&nbsp;UnitInStock&nbsp;<br />
FROM&nbsp;Products&nbsp;<br />
ORDER&nbsp;BY&nbsp;UnitInStock&nbsp;DESC&nbsp;,&nbsp;UnitPrice&nbsp;DESC,&nbsp;ProductName&nbsp;<br />
ORDER&nbsp;BY&nbsp;子句中可以用字段在选择列表中的位置号代替字段名，可以混合字段名和位置号。&nbsp;<br />
例：下面的<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">语句</strong>产生与上列相同的效果。&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;ProductName,UnitPrice,&nbsp;UnitInStock&nbsp;<br />
FROM&nbsp;Products&nbsp;<br />
ORDER&nbsp;BY&nbsp;1&nbsp;DESC&nbsp;,&nbsp;2&nbsp;DESC,3&nbsp;<br />
四&nbsp;.运用连接关系实现多表查询&nbsp;<br />
例：找出同一个城市中供应商和客户的名字&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;Customers.CompanyName,&nbsp;Suppliers.ComPany.Name&nbsp;<br />
FROM&nbsp;Customers,&nbsp;Suppliers&nbsp;<br />
WHERE&nbsp;Customers.City=Suppliers.City&nbsp;<br />
例：找出产品库存量大于同一种产品的定单的数量的产品和定单&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;ProductName,OrderID,&nbsp;UnitInStock,&nbsp;Quantity&nbsp;<br />
FROM&nbsp;Products,&nbsp;[Order&nbsp;Deails]&nbsp;<br />
WHERE&nbsp;Product.productID=[Order&nbsp;Details].ProductID&nbsp;<br />
AND&nbsp;UnitsInStock&gt;Quantity&nbsp;<br />
另一种方法是用&nbsp;Microsof&nbsp;JET&nbsp;SQL&nbsp;独有的&nbsp;JNNER&nbsp;JOIN&nbsp;<br />
语法：&nbsp;<br />
FROM&nbsp;table1&nbsp;INNER&nbsp;JOIN&nbsp;table2&nbsp;<br />
ON&nbsp;table1.field1&nbsp;comparision&nbsp;table2.field2&nbsp;<br />
其中comparision&nbsp;就是前面WHERE子句用到的比较运算符。&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;FirstName,lastName,OrderID,CustomerID,OrderDate&nbsp;<br />
FROM&nbsp;Employees&nbsp;<br />
INNER&nbsp;JOIN&nbsp;Orders&nbsp;ON&nbsp;Employees.EmployeeID=Orders.EmployeeID&nbsp;<br />
注意：&nbsp;<br />
INNER&nbsp;JOIN不能连接Memo&nbsp;OLE&nbsp;Object&nbsp;Single&nbsp;Double&nbsp;数据类型字段。&nbsp;<br />
在一个JOIN<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">语句</strong>中连接多个ON子句&nbsp;<br />
语法：&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;fields&nbsp;<br />
FROM&nbsp;table1&nbsp;INNER&nbsp;JOIN&nbsp;table2&nbsp;<br />
ON&nbsp;table1.field1&nbsp;compopr&nbsp;table2.field1&nbsp;AND&nbsp;<br />
ON&nbsp;table1.field2&nbsp;compopr&nbsp;table2.field2&nbsp;OR&nbsp;<br />
ON&nbsp;table1.field3&nbsp;compopr&nbsp;table2.field3&nbsp;<br />
也可以&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;fields&nbsp;<br />
FROM&nbsp;table1&nbsp;INNER&nbsp;JOIN&nbsp;<br />
（table2&nbsp;INNER&nbsp;JOIN&nbsp;[(&nbsp;]table3&nbsp;<br />
[INNER&nbsp;JOER]&nbsp;[(&nbsp;]tablex[INNER&nbsp;JOIN]&nbsp;<br />
ON&nbsp;table1.field1&nbsp;compopr&nbsp;table2.field1&nbsp;<br />
ON&nbsp;table1.field2&nbsp;compopr&nbsp;table2.field2&nbsp;<br />
ON&nbsp;table1.field3&nbsp;compopr&nbsp;table2.field3&nbsp;<br />
外部连接返回更多记录，在结果中保留不匹配的记录，不管存不存在满足条件的记录都要返回另一侧的所有记录。&nbsp;<br />
FROM&nbsp;table&nbsp;[LEFT|RIGHT]JOIN&nbsp;table2&nbsp;<br />
ON&nbsp;table1.field1comparision&nbsp;table.field2&nbsp;<br />
用左连接来建立外部连接，在表达式的左边的表会显示其所有的数据&nbsp;<br />
例：不管有没有定货量，返回所有商品&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;ProductName&nbsp;,OrderID&nbsp;<br />
FROM&nbsp;Products&nbsp;<br />
LEFT&nbsp;JOIN&nbsp;Orders&nbsp;ON&nbsp;Products.PrductsID=Orders.ProductID&nbsp;<br />
右连接与左连接的差别在于：不管左侧表里有没有匹配的记录，它都从左侧表中返回所有记录。&nbsp;<br />
例：如果想了解客户的信息，并统计各个地区的客户分布，这时可以用一个右连接，即使某个地区没有客户，也要返回客户信息。&nbsp;<br />
空值不会相互匹配，可以通过外连接才能测试被连接的某个表的字段是否有空值。&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;*&nbsp;<br />
FROM&nbsp;talbe1&nbsp;<br />
LEFT&nbsp;JOIN&nbsp;table2&nbsp;ON&nbsp;table1.a=table2.c&nbsp;<br />
1&nbsp;连接查询中使用Iif函数实现以0值显示空值&nbsp;<br />
Iif表达式：&nbsp;Iif(IsNull(Amount,0,Amout)&nbsp;<br />
例：无论定货大于或小于￥50，都要返回一个标志。&nbsp;<br />
Iif([Amount]&gt;50,?Big&nbsp;order?,?Small&nbsp;order?)&nbsp;<br />
五.&nbsp;分组和总结查询结果&nbsp;<br />
在SQL的语法里，GROUP&nbsp;BY和HAVING子句用来对数据进行汇总。GROUP&nbsp;BY子句指明了按照哪几个字段来分组，而将记录分组后，用HAVING子句过滤这些记录。&nbsp;<br />
GROUP&nbsp;BY&nbsp;子句的语法&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;fidldlist&nbsp;<br />
FROM&nbsp;table&nbsp;<br />
WHERE&nbsp;criteria&nbsp;<br />
[GROUP&nbsp;BY&nbsp;groupfieldlist&nbsp;[HAVING&nbsp;groupcriteria]]&nbsp;<br />
注：Microsoft&nbsp;Jet数据库&nbsp;Jet&nbsp;不能对备注或OLE对象字段分组。&nbsp;<br />
GROUP&nbsp;BY字段中的Null值以备分组但是不能被省略。&nbsp;<br />
在任何SQL合计函数中不计算Null值。&nbsp;<br />
GROUP&nbsp;BY子句后最多可以带有十个字段，排序优先级按从左到右的顺序排列。&nbsp;<br />
例：在&lsquo;WA&rsquo;地区的雇员表中按头衔分组后，找出具有同等头衔的雇员数目大于1人的所有头衔。&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;Title&nbsp;,Count(Title)&nbsp;as&nbsp;Total&nbsp;<br />
FROM&nbsp;Employees&nbsp;<br />
WHERE&nbsp;Region&nbsp;=&nbsp;&lsquo;WA&rsquo;&nbsp;<br />
GROUP&nbsp;BY&nbsp;Title&nbsp;<br />
HAVING&nbsp;Count(Title)&gt;1&nbsp;<br />
JET&nbsp;SQL&nbsp;中的聚积函数&nbsp;<br />
聚集函数&nbsp;意义&nbsp;<br />
SUM&nbsp;(&nbsp;)&nbsp;求和&nbsp;<br />
AVG&nbsp;(&nbsp;)&nbsp;平均值&nbsp;<br />
COUNT&nbsp;(&nbsp;)&nbsp;表达式中记录的数目&nbsp;<br />
COUNT&nbsp;(*&nbsp;)&nbsp;计算记录的数目&nbsp;<br />
MAX&nbsp;最大值&nbsp;<br />
MIN&nbsp;最小值&nbsp;<br />
VAR&nbsp;方差&nbsp;<br />
STDEV&nbsp;标准误差&nbsp;<br />
FIRST&nbsp;第一个值&nbsp;<br />
LAST&nbsp;最后一个值&nbsp;<br />
六.&nbsp;用Parameters声明创建参数查询&nbsp;<br />
Parameters声明的语法:&nbsp;<br />
PARAMETERS&nbsp;name&nbsp;datatype[,name&nbsp;datatype[,&nbsp;&hellip;]]&nbsp;<br />
其中name&nbsp;是参数的标志符,可以通过标志符引用参数.&nbsp;<br />
Datatype说明参数的数据类型.&nbsp;<br />
使用时要把PARAMETERS&nbsp;声明置于任何其他<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">语句</strong>之前.&nbsp;<br />
例:&nbsp;<br />
PARAMETERS[Low&nbsp;price]&nbsp;Currency,[Beginning&nbsp;date]datatime&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;OrderID&nbsp;,OrderAmount&nbsp;<br />
FROM&nbsp;Orders&nbsp;<br />
WHERE&nbsp;OrderAMount&gt;[low&nbsp;price]&nbsp;<br />
AND&nbsp;OrderDate&gt;=[Beginning&nbsp;date]&nbsp;<br />
七.&nbsp;功能查询&nbsp;<br />
所谓功能查询,实际上是一种操作查询,它可以对数据库进行快速高效的操作.它以选择查询为目的,挑选出符合条件的数据,再对数据进行批处理.功能查询包括更新查询,删除查询,添加查询,和生成表查询.&nbsp;<br />
1&nbsp;更新查询&nbsp;<br />
UPDATE子句可以同时更改一个或多个表中的数据.它也可以同时更改多个字段的值.&nbsp;<br />
更新查询语法:&nbsp;<br />
UPDATE&nbsp;表名&nbsp;<br />
SET&nbsp;新值&nbsp;<br />
WHERE&nbsp;准则&nbsp;<br />
例:英国客户的定货量增加5%,货运量增加3%&nbsp;<br />
UPDATE&nbsp;OEDERS&nbsp;<br />
SET&nbsp;OrderAmount&nbsp;=&nbsp;OrderAmount&nbsp;*1.1&nbsp;<br />
Freight&nbsp;=&nbsp;Freight*1.03&nbsp;<br />
WHERE&nbsp;ShipCountry&nbsp;=&nbsp;&lsquo;UK&rsquo;&nbsp;<br />
2&nbsp;删除查询&nbsp;<br />
DELETE子句可以使用户删除大量的过时的或冗于的数据.&nbsp;<br />
注:删除查询的对象是整个记录.&nbsp;<br />
DELETE子句的语法:&nbsp;<br />
DELETE&nbsp;[表名.*]&nbsp;<br />
FROM&nbsp;来源表&nbsp;<br />
WHERE&nbsp;准则&nbsp;<br />
例:&nbsp;要删除所有94年前的定单&nbsp;<br />
DELETE&nbsp;*&nbsp;<br />
FROM&nbsp;Orders&nbsp;<br />
WHERE&nbsp;OrderData&lt;#94-1-1#&nbsp;<br />
3&nbsp;追加查询&nbsp;<br />
INSERT子句可以将一个或一组记录追加到一个或多个表的尾部.&nbsp;<br />
INTO&nbsp;子句指定接受新记录的表&nbsp;<br />
valueS&nbsp;关键字指定新记录所包含的数据值.&nbsp;<br />
INSERT&nbsp;子句的语法:&nbsp;<br />
INSETR&nbsp;INTO&nbsp;目的表或查询(字段1,字段2,&hellip;)&nbsp;<br />
valueS(数值1,数值2,&hellip;)&nbsp;<br />
例:增加一个客户&nbsp;<br />
INSERT&nbsp;INTO&nbsp;Employees(FirstName,LastName,title)&nbsp;<br />
valueS(&lsquo;Harry&rsquo;,&rsquo;Washington&rsquo;,&rsquo;Trainee&rsquo;)&nbsp;<br />
4&nbsp;生成表查询&nbsp;<br />
可以一次性地把所有满足条件的记录拷贝到一张新表中.通常制作记录的备份或副本或作为报表的基础.&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;INTO子句用来创建生成表查询语法:&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;字段1,字段2,&hellip;&nbsp;<br />
INTO&nbsp;新表[IN&nbsp;外部数据库]&nbsp;<br />
FROM&nbsp;来源数据库&nbsp;<br />
WHERE&nbsp;准则&nbsp;<br />
例:为定单制作一个存档备份&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;*&nbsp;<br />
INTO&nbsp;OrdersArchive&nbsp;<br />
FROM&nbsp;Orders&nbsp;<br />
八.&nbsp;联合查询&nbsp;<br />
UNION运算可以把多个查询的结果合并到一个结果集里显示.&nbsp;<br />
UNION运算的一般语法:&nbsp;<br />
[表]查询1&nbsp;UNION&nbsp;[ALL]查询2&nbsp;UNION&nbsp;&hellip;&nbsp;<br />
例:返回巴西所有供给商和客户的名字和城市&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;CompanyName,City&nbsp;<br />
FROM&nbsp;Suppliers&nbsp;<br />
WHERE&nbsp;Country&nbsp;=&nbsp;&lsquo;Brazil&rsquo;&nbsp;<br />
UNION&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;CompanyName,City&nbsp;<br />
FROM&nbsp;Customers&nbsp;<br />
WHERE&nbsp;Country&nbsp;=&nbsp;&lsquo;Brazil&rsquo;&nbsp;<br />
注:&nbsp;<br />
缺省的情况下,UNION子句不返回重复的记录.如果想显示所有记录,可以加ALL选项&nbsp;<br />
UNION运算要求查询具有相同数目的字段.但是,字段数据类型不必相同.&nbsp;<br />
每一个查询参数中可以使用GROUP&nbsp;BY&nbsp;子句&nbsp;或&nbsp;HAVING&nbsp;子句进行分组.要想以指定的顺序来显示返回的数据,可以在最后一个查询的尾部使用OREER&nbsp;BY子句.&nbsp;<br />
九.&nbsp;交叉查询&nbsp;<br />
交叉查询可以对数据进行总和,平均,计数或其他总和计算法的计算,这些数据通过两种信息进行分组:一个显示在表的左部,另一个显示在表的顶部.&nbsp;<br />
Microsoft&nbsp;Jet&nbsp;SQL&nbsp;用TRANSFROM<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">语句</strong>创建交叉表查询语法:&nbsp;<br />
TRANSFORM&nbsp;aggfunction&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">语句</strong>&nbsp;<br />
GROUP&nbsp;BY&nbsp;子句&nbsp;<br />
PIVOT&nbsp;pivotfield[IN(value1&nbsp;[,value2[,&hellip;]])&nbsp;]&nbsp;<br />
Aggfounction指SQL聚积函数,&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">语句</strong>选择作为标题的的字段,&nbsp;<br />
GROUP&nbsp;BY&nbsp;分组&nbsp;<br />
说明：&nbsp;<br />
Pivotfield&nbsp;在查询结果集中创建列标题时用的字段或表达式,用可选的IN子句限制它的取值.&nbsp;<br />
value代表创建列标题的固定值.&nbsp;<br />
例:显示在1996年里每一季度每一位员工所接的定单的数目:&nbsp;<br />
TRANSFORM&nbsp;Count(OrderID)&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;FirstName&amp;&rsquo;&rsquo;&amp;LastName&nbsp;AS&nbsp;FullName&nbsp;<br />
FROM&nbsp;Employees&nbsp;INNER&nbsp;JOIN&nbsp;Orders&nbsp;<br />
ON&nbsp;Employees.EmployeeID&nbsp;=&nbsp;Orders.EmployeeID&nbsp;<br />
WHERE&nbsp;DatePart(&ldquo;yyyy&rdquo;,OrderDate)=&nbsp;&lsquo;1996&rsquo;&nbsp;<br />
GROUP&nbsp;BY&nbsp;FirstName&amp;&rsquo;&rsquo;&amp;LastName&nbsp;<br />
ORDER&nbsp;BY&nbsp;FirstName&amp;&rsquo;&rsquo;&amp;LastName&nbsp;<br />
POVOT&nbsp;DatePart(&ldquo;q&rdquo;,OrderDate)&amp;&rsquo;季度&rsquo;&nbsp;<br />
十&nbsp;.子查询&nbsp;<br />
子查询可以理解为&nbsp;套查询.子查询是一个<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">语句</strong>.&nbsp;<br />
1&nbsp;表达式的值与子查询返回的单一值做比较&nbsp;<br />
语法:&nbsp;<br />
表达式&nbsp;comparision&nbsp;[ANY|ALL|SOME](子查询)&nbsp;<br />
说明：&nbsp;<br />
ANY和SOME谓词是同义词,与比较运算符(=,&lt;,&gt;,&lt;&gt;,&lt;=,&gt;=)一起使用.返回一个布尔值True或False.ANY的意思是,表达式与子查询返回的一系列的值逐一比较,只要其中的一次比较产生True结果,ANY测试的返回&nbsp;True值(既WHERE子句的结果),对应于该表达式的当前记录将进入主查询的结果中.ALL测试则要求表达式与子查询返回的一系列的值的比较都产生True结果,才回返回True值.&nbsp;<br />
例:主查询返回单价比任何一个折扣大于等于25%的产品的单价要高的所有产品&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;*&nbsp;FROM&nbsp;Products&nbsp;<br />
WHERE&nbsp;UnitPrice&gt;ANY&nbsp;<br />
(<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;UnitPrice&nbsp;FROM[Order&nbsp;Details]&nbsp;WHERE&nbsp;Discount&gt;0.25)&nbsp;<br />
<br />
2&nbsp;检查表达式的值是否匹配子查询返回的一组值的某个值&nbsp;<br />
语法:&nbsp;<br />
[NOT]IN(子查询)&nbsp;<br />
例:返回库存价值大于等于1000的产品.&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;ProductName&nbsp;FROM&nbsp;Products&nbsp;<br />
WHERE&nbsp;ProductID&nbsp;IN&nbsp;<br />
(<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;PrdoctID&nbsp;FROM&nbsp;[Order&nbsp;DEtails]&nbsp;<br />
WHERE&nbsp;UnitPrice*Quantity&gt;=&nbsp;1000)&nbsp;<br />
<br />
3检测子查询是否返回任何记录&nbsp;<br />
语法:&nbsp;<br />
[NOT]EXISTS&nbsp;(子查询)&nbsp;<br />
例:用EXISTS检索英国的客户&nbsp;<br />
<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;ComPanyName,ContactName&nbsp;<br />
FROM&nbsp;Orders&nbsp;<br />
WHERE&nbsp;EXISTS&nbsp;<br />
(<strong style="COLOR: black; BACKGROUND-COLOR: #ffff66">SELECT</strong>&nbsp;*&nbsp;<br />
FROM&nbsp;Customers&nbsp;<br />
WHERE&nbsp;Country&nbsp;=&nbsp;&lsquo;UK&rsquo;&nbsp;AND&nbsp;<br />
Customers.CustomerID=&nbsp;Orders.CustomerID)
          <br/>
          <span style="color:red;">
            <a href="http://flyinglife.javaeye.com/blog/50317#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 25 Jan 2007 09:49:30 +0800</pubDate>
        <link>http://flyinglife.javaeye.com/blog/50317</link>
        <guid>http://flyinglife.javaeye.com/blog/50317</guid>
      </item>
      <item>
        <title>name parameter cannot be null</title>
        <author>flyinglife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flyinglife.javaeye.com">flyinglife</a>&nbsp;
          链接：<a href="http://flyinglife.javaeye.com/blog/49954" style="color:red;">http://flyinglife.javaeye.com/blog/49954</a>&nbsp;
          发表时间: 2007年01月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>1.可能是&quot; name space&quot;错误</p>
<p>2.可能是 int,long,等数值类型为null,而又付值给了int,long.</p>
          <br/>
          <span style="color:red;">
            <a href="http://flyinglife.javaeye.com/blog/49954#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 24 Jan 2007 17:02:50 +0800</pubDate>
        <link>http://flyinglife.javaeye.com/blog/49954</link>
        <guid>http://flyinglife.javaeye.com/blog/49954</guid>
      </item>
      <item>
        <title>javascript常用字符串函数</title>
        <author>flyinglife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flyinglife.javaeye.com">flyinglife</a>&nbsp;
          链接：<a href="http://flyinglife.javaeye.com/blog/49384" style="color:red;">http://flyinglife.javaeye.com/blog/49384</a>&nbsp;
          发表时间: 2007年01月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>几种常用的表单输入判断 <br />
文章类型：JavaScript 文章加入时间：2004年11月1日11:2 </p>
<p>--------------------------------------------------------------------------------<br />
&nbsp;<br />
几种常用的表单输入判断<br />
//<a name="baidusnap3"></a><strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">函数</strong>名：chksafe<br />
//功能介绍：检查是否含有&quot;'&quot;,'\\',&quot;/&quot;<br />
//参数说明：要检查的<a name="baidusnap1"></a><strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">字符串</strong><br />
//返回值：0：是&nbsp; 1：不是<br />
function chksafe(a)<br />
{ <br />
&nbsp;return 1;<br />
/* fibdn = new Array (&quot;'&quot; ,&quot;\\&quot;, &quot;、&quot;, &quot;,&quot;, &quot;;&quot;, &quot;/&quot;);<br />
&nbsp;i=fibdn.length;<br />
&nbsp;j=a.length;<br />
&nbsp;for (ii=0;ii&lt;i;ii++)<br />
&nbsp;{ for (jj=0;jj&lt;j;jj++)<br />
&nbsp; { temp1=a.charAt(jj);<br />
&nbsp;&nbsp; temp2=fibdn[ii];<br />
&nbsp;&nbsp; if (tem';p1==temp2)<br />
&nbsp;&nbsp; { return 0; }<br />
&nbsp; }<br />
&nbsp;}<br />
&nbsp;return 1;<br />
*/ <br />
}</p>
<p>//<strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">函数</strong>名：chkspc<br />
//功能介绍：检查是否含有空格<br />
//参数说明：要检查的<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">字符串</strong><br />
//返回值：0：是&nbsp; 1：不是<br />
function chkspc(a)<br />
{<br />
&nbsp;var i=a.length;<br />
&nbsp;var j = 0;<br />
&nbsp;var k = 0;<br />
&nbsp;while (k&lt;i)<br />
&nbsp;{<br />
&nbsp; if (a.charAt(k) != &quot; &quot;)<br />
&nbsp;&nbsp; j = j+1;<br />
&nbsp; k = k+1;<br />
&nbsp;}<br />
&nbsp;if (j==0)<br />
&nbsp;{<br />
&nbsp; return 0;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;if (i!=j)<br />
&nbsp;{ return 2; }<br />
&nbsp;else<br />
&nbsp;{<br />
&nbsp; return 1;<br />
&nbsp;}<br />
}</p>
<p><br />
//<strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">函数</strong>名：chkemail<br />
//功能介绍：检查是否为Email Address<br />
//参数说明：要检查的<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">字符串</strong><br />
//返回值：0：不是&nbsp; 1：是<br />
function chkemail(a)<br />
{ var i=a.length;<br />
&nbsp;var temp = a.indexOf(<a href="mailto:'@'">'@'</a>);<br />
&nbsp;var tempd = a.indexOf('.');<br />
&nbsp;if (temp &gt; 1) {<br />
&nbsp; if ((i-temp) &gt; 3){<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp; if ((i-tempd)&gt;0){<br />
&nbsp;&nbsp;&nbsp;&nbsp; return 1;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; <br />
&nbsp; }<br />
&nbsp;}<br />
&nbsp;return 0;<br />
}</p>
<p>//opt1 小数&nbsp;&nbsp;&nbsp;&nbsp; opt2&nbsp;&nbsp; 负数<br />
//当opt2为1时检查num是否是负数<br />
//当opt1为1时检查num是否是小数<br />
//返回1是正确的，0是错误的<br />
function chknbr(num,opt1,opt2)<br />
{<br />
&nbsp;var i=num.length;<br />
&nbsp;var staus;<br />
//staus用于记录.的个数<br />
&nbsp;status=0;<br />
&nbsp;if ((opt2!=1) &amp;&amp; (num.charAt(0)=='-'))<br />
&nbsp;{<br />
&nbsp; //alert(&quot;You have enter a invalid number.&quot;);<br />
&nbsp; return 0;<br />
&nbsp;<br />
&nbsp;}<br />
//当最后一位为.时出错<br />
&nbsp;if (num.charAt(i-1)=='.')<br />
&nbsp;{<br />
&nbsp; //alert(&quot;You have enter a invalid number.&quot;);<br />
&nbsp; return 0;<br />
&nbsp;}</p>
<p>&nbsp;for (j=0;j&lt;i;j++)<br />
&nbsp;{<br />
&nbsp; if (num.charAt(j)=='.')<br />
&nbsp; {<br />
&nbsp;&nbsp; status++;<br />
&nbsp; }<br />
&nbsp; if (status&gt;1) <br />
&nbsp; {<br />
&nbsp; //alert(&quot;You have enter a invalid number.&quot;);<br />
&nbsp; return 0;&nbsp; <br />
&nbsp; }<br />
&nbsp; if (num.charAt(j)&lt;'0' || num.charAt(j)&gt;'9' )<br />
&nbsp; {<br />
&nbsp;&nbsp; if (((opt1==0) || (num.charAt(j)!='.')) &amp;&amp; (j!=0)) <br />
&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp; //alert(&quot;You have enter a invalid number.&quot;);<br />
&nbsp;&nbsp;&nbsp; return 0;<br />
&nbsp;&nbsp; }<br />
&nbsp; }<br />
&nbsp;}<br />
&nbsp;return 1;<br />
}</p>
<p>//<strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">函数</strong>名：chkdate<br />
//功能介绍：检查是否为日期<br />
//参数说明：要检查的<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">字符串</strong><br />
//返回值：0：不是日期&nbsp; 1：是日期<br />
function chkdate(datestr)<br />
{<br />
&nbsp;var lthdatestr<br />
&nbsp;if (datestr != &quot;&quot;)<br />
&nbsp; lthdatestr= datestr.length ;<br />
&nbsp;else<br />
&nbsp; lthdatestr=0;<br />
&nbsp; <br />
&nbsp;var tmpy=&quot;&quot;;<br />
&nbsp;var tmpm=&quot;&quot;;<br />
&nbsp;var tmpd=&quot;&quot;;<br />
&nbsp;//var datestr;<br />
&nbsp;var status;<br />
&nbsp;status=0;<br />
&nbsp;if ( lthdatestr== 0)<br />
&nbsp; return 0</p>
<p><br />
&nbsp;for (i=0;i&lt;lthdatestr;i++)<br />
&nbsp;{ if (datestr.charAt(i)== '-')<br />
&nbsp; {<br />
&nbsp;&nbsp; status++;<br />
&nbsp; }<br />
&nbsp; if (status&gt;2)<br />
&nbsp; {<br />
&nbsp;&nbsp; //alert(&quot;Invalid format of date!&quot;);<br />
&nbsp;&nbsp; return 0;<br />
&nbsp; }<br />
&nbsp; if ((status==0) &amp;&amp; (datestr.charAt(i)!='-'))<br />
&nbsp; {<br />
&nbsp;&nbsp; tmpy=tmpy+datestr.charAt(i)<br />
&nbsp; }<br />
&nbsp; if ((status==1) &amp;&amp; (datestr.charAt(i)!='-'))<br />
&nbsp; {<br />
&nbsp;&nbsp; tmpm=tmpm+datestr.charAt(i)<br />
&nbsp; }<br />
&nbsp; if ((status==2) &amp;&amp; (datestr.charAt(i)!='-'))<br />
&nbsp; {<br />
&nbsp;&nbsp; tmpd=tmpd+datestr.charAt(i)<br />
&nbsp; }</p>
<p>&nbsp;}<br />
&nbsp;year=new String (tmpy);<br />
&nbsp;month=new String (tmpm);<br />
&nbsp;day=new String (tmpd)<br />
&nbsp;//tempdate= new String (year+month+day);<br />
&nbsp;//alert(tempdate);<br />
&nbsp;if ((tmpy.length!=4) || (tmpm.length&gt;2) || (tmpd.length&gt;2))<br />
&nbsp;{<br />
&nbsp; //alert(&quot;Invalid format of date!&quot;);<br />
&nbsp; return 0;<br />
&nbsp;}<br />
&nbsp;if (!((1&lt;=month) &amp;&amp; (12&gt;=month) &amp;&amp; (31&gt;=day) &amp;&amp; (1&lt;=day)) )<br />
&nbsp;{<br />
&nbsp; //alert (&quot;Invalid month or day!&quot;);<br />
&nbsp; return 0;<br />
&nbsp;}<br />
&nbsp;if (!((year % 4)==0) &amp;&amp; (month==2) &amp;&amp; (day==29))<br />
&nbsp;{<br />
&nbsp; //alert (&quot;This is not a leap year!&quot;);<br />
&nbsp; return 0;<br />
&nbsp;}<br />
&nbsp;if ((month&lt;=7) &amp;&amp; ((month % 2)==0) &amp;&amp; (day&gt;=31))<br />
&nbsp;{<br />
&nbsp; //alert (&quot;This month is a small month!&quot;);<br />
&nbsp; return 0;<br />
&nbsp;<br />
&nbsp;}<br />
&nbsp;if ((month&gt;=8) &amp;&amp; ((month % 2)==1) &amp;&amp; (day&gt;=31))<br />
&nbsp;{<br />
&nbsp; //alert (&quot;This month is a small month!&quot;);<br />
&nbsp; return 0;<br />
&nbsp;}<br />
&nbsp;if ((month==2) &amp;&amp; (day==30))<br />
&nbsp;{<br />
&nbsp; //alert(&quot;The Febryary never has this day!&quot;);<br />
&nbsp; return 0;<br />
&nbsp;}<br />
&nbsp;<br />
&nbsp;return 1;<br />
}</p>
<p>//<strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">函数</strong>名：fucPWDchk<br />
//功能介绍：检查是否含有非数字或字母<br />
//参数说明：要检查的<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">字符串</strong><br />
//返回值：0：含有 1：全部为数字或字母<br />
function fucPWDchk(str)<br />
{<br />
&nbsp; var strSource =&quot;0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ&quot;;<br />
&nbsp; var ch;<br />
&nbsp; var i;<br />
&nbsp; var temp;<br />
&nbsp; <br />
&nbsp; for (i=0;i&lt;=(str.length-1);i++)<br />
&nbsp; {<br />
&nbsp; <br />
&nbsp;&nbsp;&nbsp; ch = str.charAt(i);<br />
&nbsp;&nbsp;&nbsp; temp = strSource.indexOf(ch);<br />
&nbsp;&nbsp;&nbsp; if (temp==-1) <br />
&nbsp;&nbsp;&nbsp; {<br />
&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br />
&nbsp;&nbsp;&nbsp; }<br />
&nbsp; }<br />
&nbsp; if (strSource.indexOf(ch)==-1)<br />
&nbsp; {<br />
&nbsp;&nbsp;&nbsp; return 0;<br />
&nbsp; }<br />
&nbsp; else<br />
&nbsp; {<br />
&nbsp;&nbsp;&nbsp; return 1;<br />
&nbsp; } <br />
}</p>
<p>function jtrim(str)<br />
{&nbsp;&nbsp;&nbsp;&nbsp; while (str.charAt(0)==&quot; &quot;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {str=str.substr(1);}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp; while (str.charAt(str.length-1)==&quot; &quot;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {str=str.substr(0,str.length-1);}<br />
&nbsp;&nbsp;&nbsp;&nbsp; return(str);<br />
}</p>
<p><br />
//<strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">函数</strong>名：fucCheckNUM<br />
//功能介绍：检查是否为数字<br />
//参数说明：要检查的数字<br />
//返回值：1为是数字，0为不是数字<br />
function fucCheckNUM(NUM)<br />
{<br />
&nbsp;var i,j,strTemp;<br />
&nbsp;strTemp=&quot;0123456789&quot;;<br />
&nbsp;if ( NUM.length== 0)<br />
&nbsp; return 0<br />
&nbsp;for (i=0;i&lt;NUM.length;i++)<br />
&nbsp;{<br />
&nbsp; j=strTemp.indexOf(NUM.charAt(i)); <br />
&nbsp; if (j==-1)<br />
&nbsp; {<br />
&nbsp; //说明有字符不是数字<br />
&nbsp;&nbsp; return 0;<br />
&nbsp; }<br />
&nbsp;}<br />
&nbsp;//说明是数字<br />
&nbsp;return 1;<br />
}</p>
<p>//<strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">函数</strong>名：fucCheckTEL<br />
//功能介绍：检查是否为电话号码<br />
//参数说明：要检查的<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">字符串</strong><br />
//返回值：1为是合法，0为不合法<br />
function fucCheckTEL(TEL)<br />
{<br />
&nbsp;var i,j,strTemp;<br />
&nbsp;strTemp=&quot;0123456789-()# &quot;;<br />
&nbsp;for (i=0;i&lt;TEL.length;i++)<br />
&nbsp;{<br />
&nbsp; j=strTemp.indexOf(TEL.charAt(i)); <br />
&nbsp; if (j==-1)<br />
&nbsp; {<br />
&nbsp; //说明有字符不合法<br />
&nbsp;&nbsp; return 0;<br />
&nbsp; }<br />
&nbsp;}<br />
&nbsp;//说明合法<br />
&nbsp;return 1;<br />
}</p>
<p>//<strong style="COLOR: black; BACKGROUND-COLOR: #ff9999">函数</strong>名：fucCheckLength<br />
//功能介绍：检查<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">字符串</strong>的长度<br />
//参数说明：要检查的<strong style="COLOR: black; BACKGROUND-COLOR: #a0ffff">字符串</strong><br />
//返回值：长度值<br />
function fucCheckLength(strTemp)<br />
{<br />
&nbsp;var i,sum;<br />
&nbsp;sum=0;<br />
&nbsp;for(i=0;i&lt;strTemp.length;i++)<br />
&nbsp;{<br />
&nbsp; if ((strTemp.charCodeAt(i)&gt;=0) &amp;&amp; (strTemp.charCodeAt(i)&lt;=255))<br />
&nbsp;&nbsp; sum=sum+1;<br />
&nbsp; else<br />
&nbsp;&nbsp; sum=sum+2;<br />
&nbsp;}<br />
&nbsp;return sum;<br />
}<br />
&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://flyinglife.javaeye.com/blog/49384#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 23 Jan 2007 11:26:43 +0800</pubDate>
        <link>http://flyinglife.javaeye.com/blog/49384</link>
        <guid>http://flyinglife.javaeye.com/blog/49384</guid>
      </item>
      <item>
        <title>Cannot retrieve definition for form bean null on action</title>
        <author>flyinglife</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://flyinglife.javaeye.com">flyinglife</a>&nbsp;
          链接：<a href="http://flyinglife.javaeye.com/blog/49106" style="color:red;">http://flyinglife.javaeye.com/blog/49106</a>&nbsp;
          发表时间: 2007年01月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">Cannot retrieve definition for form bean null on action</font></p>
<p>这个错误可能是因为没有为action配置formbean</p>
          <br/>
          <span style="color:red;">
            <a href="http://flyinglife.javaeye.com/blog/49106#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 22 Jan 2007 15:16:08 +0800</pubDate>
        <link>http://flyinglife.javaeye.com/blog/49106</link>
        <guid>http://flyinglife.javaeye.com/blog/49106</guid>
      </item>
  </channel>
</rss>