<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 15,comments - 65,trackbacks - 0
          想必不少人聽說(shuō)過javaagent,但是很少人聽說(shuō)Instrumentation,其實(shí)Instrumentation就是javaagent的實(shí)現(xiàn)機(jī)制,說(shuō)到Instrumentation,就必須想了解javaattach機(jī)制,那就先說(shuō)下attach的實(shí)現(xiàn)。

            大家進(jìn)行jstack的時(shí)候,是不是經(jīng)常看到兩個(gè)線程Signal Dispatcher Attach Listener線程,可能不知道是干嘛的吧,這兩個(gè)線程是實(shí)現(xiàn)attach的關(guān)鍵所在,其中前者是在jvm啟動(dòng)的時(shí)候就會(huì)創(chuàng)建的,后者只有接收過attach請(qǐng)求的時(shí)候vm才會(huì)創(chuàng)建,顧名思義,Signal Dispatcher是分發(fā)信號(hào)的, Attach Listener 是處理attach請(qǐng)求的,那么兩者有什么關(guān)系呢,當(dāng)我們執(zhí)行attach方法的時(shí)候,會(huì)向目標(biāo)vm發(fā)出一個(gè)SIGQUIT 的信號(hào),目標(biāo)vm收到這個(gè)信號(hào)之后就會(huì)創(chuàng)建Attach Listener線程了,當(dāng)然jvm保證了不會(huì)多創(chuàng)建。
     1  path = findSocketFile(pid);
     2         if (path == null) {
     3             File f = new File(tmpdir, ".attach_pid" + pid);
     4             createAttachFile(f.getPath());
     5             try {
     6                 sendQuitTo(pid);
     7 
     8                 // give the target VM time to start the attach mechanism
     9                 int i = 0;
    10                 long delay = 200;
    11                 int retries = (int)(attachTimeout() / delay);
    12                 do {
    13                     try {
    14                         Thread.sleep(delay);
    15                     } catch (InterruptedException x) { }
    16                     path = findSocketFile(pid);
    17                     i++;
    18                 } while (i <= retries && path == null);
    19                 if (path == null) {
    20                     throw new AttachNotSupportedException(
    21                         "Unable to open socket file: target process not responding " +
    22                         "or HotSpot VM not loaded");
    23                 }
    24             } finally {
    25                 f.delete();
    26             }
    27         }
            Attach機(jī)制說(shuō)得簡(jiǎn)單點(diǎn)就是提供A進(jìn)程可以連上B進(jìn)程(當(dāng)然是java進(jìn)程),創(chuàng)建socket進(jìn)行通信,A通過發(fā)命令給B,B然后對(duì)命令進(jìn)行截取從自己的vm中獲取信息發(fā)回給客戶端vm,但是并不是隨便發(fā)指令都會(huì)處理的,那么attach Listener接收哪些命令呢,如下所示
    static AttachOperationFunctionInfo funcs[] = {
      { "agentProperties",  get_agent_properties },
      { "datadump",         data_dump },
      { "dumpheap",         dump_heap },
      { "load",             JvmtiExport::load_agent_library },
      { "properties",       get_system_properties },
      { "threaddump",       thread_dump },
      { "inspectheap",      heap_inspection },
      { "setflag",          set_flag },
      { "printflag",        print_flag },
      { "jcmd",             jcmd },
      { NULL,               NULL }
    };
             Instrumentation的實(shí)現(xiàn)其實(shí)主要使用了load這個(gè)指令,它用來(lái)實(shí)現(xiàn)讓target vm動(dòng)態(tài)加載agentlib,Instrumentation的實(shí)現(xiàn)在一個(gè)名為libinstrument.dylib的動(dòng)態(tài)lib庫(kù),linux下是libinstrument.so,它是基于jvmti接口實(shí)現(xiàn)的,因此在對(duì)其進(jìn)行l(wèi)oad的時(shí)候會(huì)創(chuàng)建一個(gè)agent實(shí)例,并往jvmti環(huán)境注冊(cè)一些回調(diào)方法,比如監(jiān)聽類文件加載的事件,vm初始化完成事件等,執(zhí)行Agent_OnAttach,這里會(huì)創(chuàng)建一個(gè)Instrumentation實(shí)例并返回給用戶供大家擴(kuò)展Instrumentation,比如增加一些transform。并會(huì)執(zhí)行Instrumentation實(shí)例的loadClassAndCallAgentmain方法,該方法主要執(zhí)行agent的MF文件里定義的 Agent-Class類的agentmain方法,當(dāng)vm初始化完畢之后,會(huì)調(diào)用loadClassAndCallPremain方法,該方法主要執(zhí)行agent的MF文件里定義的 Agent-Class類的pre main方法。在類進(jìn)行加載的時(shí)候會(huì)調(diào)用Instrumentation的transform方法,可以看看參數(shù)里有個(gè)byte數(shù)組,這個(gè)數(shù)組其實(shí)就是正在加載的class字節(jié)碼,所以如果要字節(jié)碼增強(qiáng)在這里就可以入手啦,甚至可以實(shí)現(xiàn)偷天換日.
    posted @ 2013-04-12 22:38 你假笨 閱讀(2202) | 評(píng)論 (0)編輯 收藏
           本文最初發(fā)表在http://www.lovestblog.cn,轉(zhuǎn)載請(qǐng)注明出處,謝謝。
     最近在忙一個(gè)項(xiàng)目,使用的是Flex+Spring+Hibernate,期間碰到一個(gè)問題,有必要在此記錄一下,也方便有相似問題的來(lái)者參考下
            問題描述:有一個(gè)用戶表和一個(gè)用戶詳情表,這兩個(gè)表是一個(gè)一對(duì)一的單向關(guān)聯(lián)關(guān)系,即在用戶表中一個(gè)外鍵引用用戶詳情表,我在UserInfo的映射文件中使用的是many-to-one,設(shè)置了unique="true"表示一對(duì)一關(guān)系,設(shè)置了cascade="save-update"表示的是在保存useInfo對(duì)象的時(shí)候會(huì)自動(dòng)保存與之關(guān)聯(lián)的userDetails臨時(shí)對(duì)象,即我希望的是先執(zhí)行一個(gè)在用戶詳情表中的插入語(yǔ)句然后再執(zhí)行一個(gè)在用戶表中的插入語(yǔ)句,userInfo對(duì)象是從flex端傳過來(lái)的,當(dāng)然也設(shè)置了userDetails屬性的值,在userInfo的dao文件中save方法是這樣的
        public IvUserInfo save(IvUserInfo transientInstance) {
            log.debug(
    "saving IvUserInfo instance");
            
    try {
                getHibernateTemplate().save(transientInstance);
                log.debug(
    "save successful");
            } 
    catch (RuntimeException re) {
                log.error(
    "save failed", re);
                
    throw re;
            }
            
    return transientInstance;
        }
    后面發(fā)現(xiàn)執(zhí)行的sql語(yǔ)句只有一條插入語(yǔ)句,就是在用戶表中的一個(gè)插入,由于外鍵的關(guān)聯(lián)作用,是用戶表的這條插入也無(wú)法執(zhí)行,這就是問題所在了。
            問題解決:這個(gè)問題我也沒有具體研究Hibernate的源碼,我先寫了個(gè)測(cè)試類,發(fā)現(xiàn)僅僅在java中執(zhí)行操作的話是可以正確執(zhí)行兩條插入語(yǔ)句的,但是通過flex傳過來(lái)就有問題了,那說(shuō)明是flex端傳參數(shù)過來(lái)的問題,于是我試著修改UserInfo的save方法:

    public IvUserInfo save(IvUserInfo transientInstance) {
            log.debug(
    "saving IvUserInfo instance");
            
    try {
                IvUserDetails ud
    =new IvUserDetails();
                ud.setQq(transientInstance.getIvUserDetails().getQq());

                transientInstance.setIvUserDetails(ud);
                getHibernateTemplate().save(transientInstance);
                log.debug(
    "save successful");
            } 
    catch (RuntimeException re) {
                log.error(
    "save failed", re);
                
    throw re;
            }
            
    return transientInstance;
        }
    這樣一來(lái)問題解決了,順利執(zhí)行了兩條插入語(yǔ)句。
           如果朋友知道具體原因的話希望給我留言了,同時(shí)也希望該記錄能幫助碰到此類問題的朋友。
    posted @ 2010-06-22 11:20 你假笨 閱讀(1571) | 評(píng)論 (0)編輯 收藏
             歡迎光臨筆者博客http://www.lovestblog.cn
            最近兩天本人在為本博實(shí)現(xiàn)rss發(fā)布和訂閱,本來(lái)是想在前端實(shí)現(xiàn)xml的生成和修改,因?yàn)橛胊s3的E4X操作xml比較方便,但是后面發(fā)現(xiàn)不能為元素設(shè)置CDATA值,于是只好作罷,便只能依靠后臺(tái)的java來(lái)實(shí)現(xiàn)此功能了,當(dāng)然操作xml的話,我首先想到了dom4j,dom4j操作xml還是比較方便的,即可以輕松實(shí)現(xiàn)我們的CDATA設(shè)置,也可以為我們?nèi)我馕恢貌迦朐靥峁┝藢?shí)現(xiàn),對(duì)于在指定位置新增節(jié)點(diǎn)開始我有點(diǎn)蒙了,后面通過網(wǎng)上搜索資源加之自己的一些理解,而實(shí)現(xiàn)了此功能,下面展示了部分代碼供今后參考吧:
    1. public static int createXMLFile(String filename,List list){   
                 
      /** 返回操作結(jié)果, 0表失敗, 1表成功 */  
                 
      int returnValue = 0;    
                 Document document 
      = DocumentHelper.createDocument();   
                 Element rssElement 
      = document.addElement("rss");   
                 rssElement.addAttribute(
      "version""2.0");     
                 Element channelElement 
      = rssElement.addElement("channel");   
                 Element titleElement 
      = channelElement.addElement("title");   
                 titleElement.setText(
      "你假笨(nijiaben)心情技術(shù)博客");    
                    
                 Element linkElement 
      = channelElement.addElement("link");   
                 linkElement.setText(
      "http://www.lovestblog.cn");   
                    
                 Element descriptionElement 
      = channelElement.addElement("description");   
                 descriptionElement.setText(
      "專注于Java,Flex技術(shù)開發(fā)研究");   
                    
                 Element languageElement 
      = channelElement.addElement("language");   
                 languageElement.setText(
      "zh-cn");   
                    
                 Element lastBuildDateElement 
      = channelElement.addElement("lastBuildDate");   
                 lastBuildDateElement.setText(
      new java.text.SimpleDateFormat("yyyy-mm-dd hh:mm:ss",Locale.CHINA).format(((ArticleInfo)(list.get(0))).getCreateTime()));             
                          
                 
      for(int i=list.size()-1;i>0;i--){   
                     ArticleInfo ainfo
      =(ArticleInfo)(list.get(i));   
                     Element itemElement 
      = channelElement.addElement("item");   
                     Element title1Element 
      = itemElement.addElement("title");   
                     title1Element.setText(ainfo.getTitle());   
                     Element description1Element 
      = itemElement.addElement("description");   
                     
      int maxLen=5000;   
                     
      if(ainfo.getRssContent().length()<5000){   
                         maxLen
      =ainfo.getRssContent().length();   
                     }
         
                     description1Element.addCDATA(ainfo.getRssContent().substring(
      0, maxLen));          
                     Element pubDate
      =itemElement.addElement("pubDate");   
                     pubDate.setText(
      new java.text.SimpleDateFormat("yyyy-mm-dd hh:mm:ss",Locale.CHINA).format(ainfo.getCreateTime()));                     
                     Element link1Element
      =itemElement.addElement("link");   
                     link1Element.setText(
      "http://www.lovestblog.cn");   
                 }
         
                 
      try{   
                     
      /** 將document中的內(nèi)容寫入文件中 */  
                     XMLWriter writer 
      = new XMLWriter(new FileOutputStream(path+filename));   
                     writer.write(document);   
                     writer.close();   
                     
      /** 執(zhí)行成功,需返回1 */  
                     returnValue 
      = 1;   
                 }
      catch(Exception ex){   
                     ex.printStackTrace();   
                 }
         
                 
      return returnValue;   
              }
        
    posted @ 2010-04-01 12:14 你假笨 閱讀(3086) | 評(píng)論 (1)編輯 收藏

              本文最新發(fā)布于http://www.lovestblog.cn,歡迎轉(zhuǎn)載該文,但請(qǐng)注明文章出處,謝謝合作。 

              mysql的from從句用來(lái)指定參與查詢的表,當(dāng)然也可以是生成的中間表,在表前我們有時(shí)需要指定數(shù)據(jù)庫(kù),這主要是用在我們需要訪問當(dāng)前數(shù)據(jù)庫(kù)之外的數(shù)據(jù)庫(kù)中的表的情況,在這中情況下我們采用"."操作符來(lái)進(jìn)行,如userdb.user,其實(shí)userdb為數(shù)據(jù)庫(kù)名,user為表名,這是對(duì)mysql數(shù)據(jù)庫(kù)而言的,對(duì)于DB2和Oracle就不是通過指定數(shù)據(jù)庫(kù)名了,而是指定sql用戶了,這就是說(shuō)不同sql用戶可以建立相同名字的表,但是同一個(gè)sql用戶只能建立唯一名字的表。這就是它們?cè)谶@表規(guī)范上面的區(qū)別。對(duì)于列規(guī)范,mysql可以在需要查詢的列則可以采用如下形式進(jìn)行訪問:“數(shù)據(jù)庫(kù)名.表名.列名”。對(duì)于多個(gè)表的規(guī)范,也就是涉及查詢多個(gè)表的情況下,執(zhí)行的過程是采用笛卡爾積的形式進(jìn)行的。也就是說(shuō)生成的中間表的列數(shù)為兩個(gè)表中列數(shù)的總和,而行的總數(shù)等于一個(gè)表中的行的數(shù)量與另外一個(gè)表中行的數(shù)量的乘積。
           對(duì)于from從句中使用假名的情況,比如select u.id,name,age,a.account from utb as u,atb as a where u.id=a.user_id,在我們使用假名之后,那么在該sql語(yǔ)句的任何地方都只能使用假名,不能使用真實(shí)的表名,同時(shí)上面的as關(guān)鍵字也是可以省略的,也就是說(shuō)對(duì)于上面的語(yǔ)句不能用atb來(lái)取代a,utb來(lái)取代u了。雖然from從句不是我們指定的第一條語(yǔ)句,但是絕對(duì)是第一個(gè)被處理的語(yǔ)句,所以在聲明假名前使用假名不會(huì)導(dǎo)致錯(cuò)誤。如果一條from從句引用到兩個(gè)有著相同名稱的表,則必須使用假名。如:

    1select p.playerno
    2from players as p,players as par
    3where par.fn="jp" and par.ln="l" and p.birth_date<par.birth_date


           對(duì)于多個(gè)表間的連接處理可能會(huì)導(dǎo)致有相同的結(jié)果,即有重復(fù)的結(jié)果,sql并不會(huì)自動(dòng)從最終結(jié)果中刪除重復(fù)的行,這是如果我們不希望在結(jié)果中出現(xiàn)重復(fù)的行,那么我們可以在select后直接指定distinct。如:

    1select distinct T.playerno 
    2from teams as T,penalties as pen 
    3where T.playerno=pen.playerno。

     

            接下來(lái)說(shuō)說(shuō)連接哈,對(duì)于內(nèi)連接,如果是兩個(gè)表的話,就取兩個(gè)表的一個(gè)交集,如果是左外連接的話,那就是左邊的表全取,右邊沒有的用null替代,弱國(guó)是右外連接的話,那就是右邊的表全取,左邊沒有的用null表示。下面看看一個(gè)具體的例子:

    1--表stu        --表exam 
    2id name        id grade 
    31, Jack         156 
    42, Tom         276
    53, Kity         1189
    64, nono 

     

    內(nèi)連接 (顯示兩表id匹配的)

    1select stu.id,exam.id,stu.name, exam.grade from stu (inner) join exam on stu.id=exam.id 
    2-------------------------------- 
    31 1 Jack 56 
    42 2 Tom 76 

     

    左連接(顯示join 左邊的表的所有數(shù)據(jù),exam只有兩條記錄,所以stu.id,grade 都用NULL 顯示)

    1select stu.id,exam.id,stu.name, exam.grade from stu left (outer) join exam on stu.id=exam.id 
    21 1 Jack 56 
    32 2 Tom 76 
    43 NULL Kity NULL 
    54 NULL nono NULL 

     

    右連接(與作連接相反,顯示join右邊表的所有數(shù)據(jù))

    1select stu.id,exam.id,stu.name, exam.grade from stu right join exam on stu.id=exam.id 
    21 1 Jack 56 
    32 2 Tom 76 
    4NULL 11 NULL 89 

     

    內(nèi)連接取交集,外連接分左和右,
    左連接左邊的全取,
    右連接右邊的全取

          對(duì)于連接的列的名稱相同的話,那么可以使用using來(lái)替代條件,如上面的內(nèi)連接可以這樣改寫:
        

    1  select stu.id,exam.id,stu.name, exam.grade from stu inner join exam using(id)。

          對(duì)于左外連接使用的情況一般是當(dāng)左表的連接列中存在未出現(xiàn)在右表的連接列中的值時(shí),左外連接才有用。
          還有個(gè)全外連接的,也就是說(shuō)只要在兩個(gè)表中出現(xiàn)的記錄都會(huì)在中間表中出現(xiàn),當(dāng)右表有而左表沒有或當(dāng)左表有而右表沒有的時(shí)候用null表示。具體語(yǔ)法如下:select stu.id,exam.id,stu.name, exam.grade from stu full join exam using(id)。
          交叉連接:就是顯示求表的笛卡爾積,select * from teams cross join penalties.這句完全等價(jià)于select teams.*,penalties.* from teams,penalties.
          聯(lián)合連接:select * from teams union join penalties,這個(gè)其實(shí)很容易理解,產(chǎn)生結(jié)果所包含的列為兩個(gè)表所有的列和,對(duì)于數(shù)據(jù)的列出,首先列出左表的數(shù)據(jù),對(duì)于屬于右表的列,用null表示,接下來(lái)列出右表的數(shù)據(jù),對(duì)于屬于左表的列用null表示。
           自然連接:select * from teams nature inner join penalties where division='first';此句完全等同與select t.playerno,t.teamno,t.division,pen.paymentno,pen.payment_date,pen.amount from teams  as t inner join penalties as pen on t.playerno=pen.playerno where dividion='first'.相比就知道,我們無(wú)須顯示指出必須要連接到哪些列,sql會(huì)自動(dòng)查找兩表中是否有相同名稱的列,且假設(shè)他們必須在連接條件中使用。此處的on或using從句是多余的,因此不允許使用。

           下面看個(gè)例子創(chuàng)建一個(gè)稱為towns的虛擬表:

    1select *
    2from (select 'Stratford' as town,4 as number 
    3       union
    4       select 'Plymouth',6
    5       union
    6       select 'Inglewood',1                 
    7       union
    8       select 'Douglas',2) as towns
    9order by town;


    結(jié)果為:

    1town             number
    2----------------------
    3Douglas              2
    4Inglewood           1
    5Plymouth            6
    6Stratford            4


     

    posted @ 2009-09-24 15:51 你假笨 閱讀(2023) | 評(píng)論 (0)編輯 收藏
          本文最先發(fā)布于http://www.lovestblog.cn,請(qǐng)轉(zhuǎn)載的該文者注明文章出處,謝謝合作。
         下面簡(jiǎn)單介紹幾種標(biāo)量函數(shù),也是常用的,我們可以通過類似select abs(-123);的語(yǔ)句來(lái)看到我們標(biāo)量函數(shù)的效果。
          abs:該函數(shù)返回一個(gè)數(shù)值表達(dá)式的絕對(duì)值。如abs(-123);

         adddate:該函數(shù)將一個(gè)時(shí)間間隔(參數(shù)2)添加到時(shí)戳或時(shí)戳表達(dá)式(參數(shù)1)中,與此函數(shù)同功能的還有date_add。如adddate('2009-01-01',4);結(jié)果為2009-01-05。adddate(2009-01-01,interval 5 month);結(jié)果為2009-06-01。adddate(timestamp('2009-01-01'),interval 5 month);結(jié)果為2009-06-01 00:00:00。adddate('2009-01-01 12:00:00',interval 5 day);結(jié)果為2009-01-06 12:00:00。

          addtime:把兩個(gè)時(shí)間表達(dá)式加起來(lái)。如addtime('100:00:00','200:02:04');結(jié)果為300:02:04。

          ascii:該函數(shù)返回一個(gè)字符串表達(dá)式的第一個(gè)字符的ASCII值。

          bin:該函數(shù)將參數(shù)的數(shù)值轉(zhuǎn)換為二進(jìn)制值。

          bit_count:該函數(shù)顯示表示參數(shù)的值的位數(shù)。如bit_count(3)結(jié)果為2。

          bit_length:該函數(shù)返回字符串值的位長(zhǎng)度。如bit_length(bin(2));結(jié)果為16

          ceiling:該函數(shù)返回大于或等于參數(shù)值的最大整數(shù)。如ceiling(11.11);->12。ceicling(-11.11);->-11

          char:該函數(shù)返回?cái)?shù)值參數(shù)的字符串字符,與此函數(shù)同功能的還有chr函數(shù)。如char(82)+char(105)+char(99)+char(107);->'Rich'

          character_length:該函數(shù)返回一個(gè)字符串表達(dá)式的長(zhǎng)度,此方法同功能的還有char_length函數(shù)。

          charset:該函數(shù)返回字符串參數(shù)的字符集的名稱。

          coalesce:該函數(shù)接受多個(gè)參數(shù),返回第一個(gè)非null值的參數(shù)的值。如coalesce(null,null,'ljp');->'ljp';

          concat:該函數(shù)合并兩個(gè)字符串的值。

          conv:該函數(shù)將一基數(shù)為參數(shù)2的值(參數(shù)1)轉(zhuǎn)換為另一個(gè)以參數(shù)3為基數(shù)的值。如conv(1110,10,16)表示將以10進(jìn)制的數(shù)1110轉(zhuǎn)換成16進(jìn)制值為456。后面兩個(gè)參數(shù)必須介于2~36之間,否則結(jié)果為null,此外參數(shù)1的值應(yīng)該匹配參數(shù)2的基數(shù),否則結(jié)果為0。

          convert:該函數(shù)轉(zhuǎn)換參數(shù)1的數(shù)據(jù)類型為參數(shù)2指定的類型。參數(shù)2必須是一種數(shù)據(jù)類型,包括binary,char,date,datetime,time,signed,signed integer,unsigned,unsigned integer,varchar。如convert('12.56',unsigned integer);->13。

          database:該函數(shù)顯示當(dāng)前數(shù)據(jù)庫(kù)的名稱。

          date:該函數(shù)將參數(shù)變換為一個(gè)日期值。如date('2009-01-01 12:00:00');->'2009-01-01'。

          datediff:該函數(shù)計(jì)算兩個(gè)日期或時(shí)間戳表達(dá)式間的天數(shù)。第一個(gè)參數(shù)減去第二個(gè)參數(shù)。

          date_sub:該函數(shù)從一個(gè)日期或時(shí)間戳表達(dá)式(參數(shù)一)中減去一個(gè)時(shí)間間隔(參數(shù)2),與才函數(shù)同功能的還有subdate函數(shù)。

          day:該函數(shù)從一個(gè)日期或時(shí)間戳表達(dá)式中返回月的天數(shù),結(jié)果總是介于1~31之間的整數(shù),與此函數(shù)同功能的還有dayofmonth。

          dayname:該函數(shù)從一個(gè)日期或時(shí)間戳表達(dá)式中返回一周中某天的名稱。

          dayofweek:該函數(shù)返回一個(gè)日期或時(shí)間戳表達(dá)式中返回某周的天數(shù)的序號(hào)。該結(jié)果總是介于1~7之間的整數(shù)。

          dayofyear:該函數(shù)返回一個(gè)日期或時(shí)間戳表達(dá)式中返回一年中某日的序號(hào)。

          default:該函數(shù)返回參數(shù)指定的某列的默認(rèn)值。

          floor:該函數(shù)返回小于或等于參數(shù)值的最小整數(shù),與ceiling相對(duì)。

          exp:該函數(shù)返回e的x次幕的結(jié)果。

          format:該函數(shù)將一個(gè)數(shù)值的格式設(shè)置為nn,nnn,nnn.nnn的格式。第二個(gè)參數(shù)表示小數(shù)點(diǎn)后的數(shù)字個(gè)數(shù)。

          greatest:該函數(shù)返回一系列參數(shù)中的最大值,和least相對(duì)。

          hex:如果參數(shù)為數(shù)字,那么就返回該數(shù)字的十六進(jìn)制表示;如果是字符串,那么將返回每個(gè)字符對(duì)應(yīng)的ASCII碼。

          if:如果第一個(gè)參數(shù)值為true,那么函數(shù)返回第二個(gè)參數(shù)的值,否則返回第三個(gè)參數(shù)的值。如if((1>2),"ljp","st");將返回st。

          ifnull:如果參數(shù)1的值為null,那么返回參數(shù)2的值,否則返回參數(shù)1的值。如ifnull(null,"ljp");返回"ljp"。

          insert:參數(shù)4的值放在參數(shù)1中由參數(shù)2指定的位置,參數(shù)3表示參數(shù)1中從參數(shù)2指定的位置開始接下來(lái)的幾個(gè)字符將被參數(shù)4取代。如insert('abcdefgh',4,3,'zzz');->'abczzzgh'。insert('abcdefgh',,4,2,'zzz');->'abczzzfgh'。insert('abcdefgh',4,0,'zzz');->'abczzzdefgh'。insert('abcdefgh',4,-1,'zzz');->'abczzz'。insert('abcdefgh',1,5,'zzz');->'zzzfgh'。

          instr:該函數(shù)返回參數(shù)1內(nèi)參數(shù)2的起始位置。如果為找到,則返回0。如instr('12345',4);->4。

          interval:該函數(shù)第一個(gè)參數(shù)指定要插入的值,接下來(lái)的參數(shù)組成一個(gè)升序序列,看第一個(gè)參數(shù)該插入哪個(gè)位置。該函數(shù)就是返回該位置。如interval(5,0,1,2,3,6,7);->4表示要把5放在第四個(gè)位置(此位置上值為3)之后。

          isnull:如果參數(shù)值為null,那么返回1,否則返回0。

          last_day:該函數(shù)返回參數(shù)指定的日期或時(shí)間戳表達(dá)式中月的最后一天,如last_day('2009-01-09');->'2009-01-31'。

          lcase:該函數(shù)將參數(shù)的值的所有大寫字母轉(zhuǎn)換為小寫字母,與lower同義,與ucase相對(duì)。

          left:該函數(shù)返回一個(gè)字符串值參數(shù)1的左側(cè)部分,該部分的長(zhǎng)度由第二個(gè)參數(shù)指定。如left("hello world",3);->'hel'。

          length:該函數(shù)返回一個(gè)字符串值的字節(jié)長(zhǎng)度。如length(null);->null。

          ln:該函數(shù)返回參數(shù)的自然對(duì)數(shù),與log同義。

          localtime:該函數(shù)返回系統(tǒng)日期和時(shí)間,localtimestamp與只同義。

          locate:該函數(shù)返回參數(shù)1在參數(shù)2內(nèi)的起點(diǎn)位置。如果參數(shù)1在參數(shù)2內(nèi)未出現(xiàn),則返回0。參數(shù)3表示開始搜索的位置。注意instr函數(shù)的區(qū)別,instr函數(shù)是返回參數(shù)1內(nèi)參數(shù)2的開始位置。

          log2:返回參數(shù)以2為底的對(duì)數(shù)。如log2(64);->6

          log10:返回參數(shù)以10為底的對(duì)數(shù)。

          lpad:參數(shù)3的值填充在參數(shù)1的左側(cè),直到該值的總長(zhǎng)度等于參數(shù)2的長(zhǎng)度。如果最大長(zhǎng)度小于參數(shù)1的長(zhǎng)度,則參數(shù)1在左側(cè)被截取。如lpad('data',6,'base');->'badata'。lpad('data',2,'base');->'da'。

          ltrim:該函數(shù)刪除出現(xiàn)在參數(shù)前的所有空白,rtrim表示刪除參數(shù)末尾的所以空白。

          makedate:參數(shù)2表示天數(shù),他們被添加到參數(shù)1中。如makedate(2009,10);->'2009-01-10'。

          maketime:三參數(shù)分別表示小時(shí),分鐘,秒鐘。其中分鐘和秒鐘必須在0~59之間,否則會(huì)返回null。

          mid:該函數(shù)提取參數(shù)1中的部分字符串值,參數(shù)2標(biāo)識(shí)開始位置,參數(shù)3標(biāo)識(shí)字符數(shù)。如mid('database',5);->'base'。mid('database',5,2);->'ba'。mid('database',-6);-> 'tabase'。mid('database',-6,3);->'tab'。

          minute:該函數(shù)從一個(gè)時(shí)間或時(shí)間戳表達(dá)式中返回分鐘數(shù)。

          mod:該函數(shù)返回兩參數(shù)相除的余數(shù)。如mod(15.4,4,4);->2.2

          month:返回時(shí)間戳中的月份數(shù),值介于1~12之間。

          monthname:該函數(shù)從一個(gè)日期或時(shí)間戳表達(dá)式中返回月的名稱。如monthname('2009-01-01');->‘April’。

          now:返回系統(tǒng)日期和時(shí)間。

          nullif:如果參數(shù)1的值等于參數(shù)2的值,那么函數(shù)返回null。否則返回參數(shù)1的值。

          oct:該函數(shù)返回八進(jìn)制參數(shù)1的十進(jìn)制數(shù)。如oct(8);->10

          ord:該函數(shù)返回參數(shù)指定的字符串表達(dá)式的第一個(gè)字符的字符集位置。如ord('Das');->68。

          period_add:該函數(shù)將月數(shù)添加到一個(gè)指定的日期,日期格式必須為YYYYMM或YYMM。結(jié)果格式為YYYYMM。如period_add('200901',3);->200904。

           period_diff:該函數(shù)返回兩個(gè)日期間的月數(shù)。如period_diff('200908','200901');->7

           PI:返回圓周率。

           power:返回參數(shù)1的參數(shù)2次冪。

           quarter:該函數(shù)從一個(gè)日期或時(shí)間戳表達(dá)式中返回季度值。結(jié)果的值總是介于1~4之間。不過和我們?nèi)粘I钪械募径炔煌?~3月為1,4~6月為2,7~9月為3,10~12月為4。

           rand:該函數(shù)返回0.0和1.0之間的一個(gè)隨機(jī)數(shù)。參數(shù)表示下一個(gè)隨機(jī)值的計(jì)算起點(diǎn)。使用相同的參數(shù)值重復(fù)調(diào)用該函數(shù),結(jié)果總是相同的。如cast(rand()*1000 as unsigned integer);

           repeat:該函數(shù)將參數(shù)1的值重復(fù)參數(shù)2給定的次數(shù)。

           replace:該函數(shù)使參數(shù)1指定的字符串中由參數(shù)2指定的值替換為參數(shù)3指定的值。如replace('data','a','e');->'dete'。

           reverse:該函數(shù)顛倒一個(gè)字符串值中的字符的順序。

           right:該函數(shù)返回參數(shù)1的右側(cè)部分。該部分長(zhǎng)度由第二個(gè)參數(shù)指定。

           round:該函數(shù)將一個(gè)數(shù)字的精度舍入到指定的位數(shù)。如round(123.4,-1);->100;round(183.4,-2);->200。

           rpad:將參數(shù)3的值填充到參數(shù)1的右側(cè),知道值的總長(zhǎng)度等于參數(shù)2指定的長(zhǎng)度,與lpad相對(duì)。rpad('data',2,'base')->'da'。

           second:該函數(shù)返回一個(gè)時(shí)間或時(shí)間戳表達(dá)式中的秒數(shù)。

           sec_to_time:該函數(shù)將秒數(shù)變換為時(shí)間。如sec_to_time((24*60*60)-1);->23:59:59

           sign:該函數(shù)返回一個(gè)數(shù)值的字符。sign(50);->1;sign(0)->0;sign(-50)->-1;

           space:該函數(shù)生成一個(gè)空格行,空格個(gè)數(shù)為參數(shù)指定的值。

           sqrt:返回參數(shù)的平方根值。

           strcmp:該函數(shù)比較兩個(gè)字符串表達(dá)式的值。如果參數(shù)值相等,那么結(jié)果為0,如果參數(shù)1的值較小,那么返回-1,否則結(jié)果為1。

           substring:該函數(shù)從參數(shù)1中減去部分字符串值,參數(shù)2給出起始點(diǎn),參數(shù)3給出子付數(shù)。如substring('database',5,2);->'ba'。

           substring_index:該函數(shù)查找參數(shù)2表示的值在參數(shù)1中的第參數(shù)3此出現(xiàn)。如果參數(shù)3為正表示從左側(cè)查找,返回從左側(cè)開始找到的該次出現(xiàn)。如果參數(shù)3為負(fù),則從右側(cè)開始查找。如substring_index('database','a',3);->'datab';substring_index('database','a',-3);->'tabase';substring_index('database','data',1);->'';substring_index('database','data',-1);->'base'  
       
           subtime:該函數(shù)對(duì)兩個(gè)時(shí)間表達(dá)式執(zhí)行相減操作并返回一個(gè)新時(shí)間,timediff與此函數(shù)功能相似。

           time:該函數(shù)返回一個(gè)時(shí)間或時(shí)間戳表達(dá)式的時(shí)間部分。如time('12:13');->12:13:00

           time_to_sec:該函數(shù)將時(shí)間變換為秒數(shù)。如time_to_sec('00:16:40');->1000

           timestampdiff:該函數(shù)計(jì)算兩個(gè)日期或時(shí)間戳表達(dá)式間的時(shí)間。參數(shù)1表示時(shí)間間隔單元,如day,month,year,quarter,week,hour,minute,second,frac_second,參數(shù)2和參數(shù)3形成兩個(gè)表達(dá)式。如timestampdiff(day,'2009-01-01','2009-01-04');->4.

           timestamp:該函數(shù)將參數(shù)1變換為一個(gè)時(shí)間戳,如果指定了參數(shù)2,則它應(yīng)該是一個(gè)時(shí)間表達(dá)式,且會(huì)被添加到參數(shù)1的值中。

           timestampadd:該函數(shù)將時(shí)間間隔添加到一個(gè)日期或時(shí)間戳表達(dá)式。參數(shù)1表示時(shí)間間隔的單元,參數(shù)2表示天數(shù)或月數(shù)等,參數(shù)3表示時(shí)間間隔添加到的表達(dá)式。如timestampadd(DAY,2,'2009-01-01');->'2009-01-03';timestampadd(MONTH,2,'2009-01-01');->"2009-03-01"。

           trim:該函數(shù)刪除參數(shù)1表示的字符串值中開始和最后的所有空格。

           truncate:該函數(shù)將數(shù)字截?cái)嗟街付ǖ男?shù)位數(shù),注意和round的區(qū)別,round是四舍五入,而truncate是截?cái)唷H鐃runcate(123.45,-1);->120。truncate(123.375,1);->123.3。

           unhex:與hex相對(duì),將十六進(jìn)制表示的參數(shù)轉(zhuǎn)換為相應(yīng)的字符。如unhex(hex('hello'))'->hello

           ucase:類似upper,都是將參數(shù)中的所有小寫字母轉(zhuǎn)換為大寫字母。

           week:該函數(shù)從一個(gè)日期或時(shí)間戳表達(dá)式中返回周數(shù),類似的函數(shù)還有weekofyear。結(jié)果介于1~53之間的一個(gè)整數(shù)。如week('2009-06-07');->23

           weekday:該函數(shù)返回一周中的天數(shù)。結(jié)果為介于0~6之間的數(shù)。0表示星期一。

           year:該函數(shù)從一個(gè)日期或時(shí)間戳表達(dá)式中返回年數(shù)。
           yearweek:如果指定參數(shù)1,則該函數(shù)從一個(gè)時(shí)間戳或日期表達(dá)式中返回格式為YYYYWW的年份及周數(shù)。周數(shù)的范圍為01~52之間。如yearweek('2009-07-06');->200927
    posted @ 2009-09-23 16:54 你假笨 閱讀(1476) | 評(píng)論 (1)編輯 收藏
            (為了方便java學(xué)習(xí)者使用OsWorkflow,特用flex設(shè)計(jì)了此設(shè)計(jì)器,歡迎大家下載使用。亦歡迎大家光臨我的個(gè)人博客http://www.lovestblog.cn)前兩天和一網(wǎng)友聊天的時(shí)候,他強(qiáng)烈建議我把這個(gè)工作流設(shè)計(jì)器好好完善下,本來(lái)學(xué)校項(xiàng)目的需求基本已經(jīng)滿足了,但是離完善實(shí)在差距太遠(yuǎn),于是花了兩天時(shí)間在原有基礎(chǔ)上進(jìn)行了下改進(jìn),現(xiàn)在得工作流設(shè)計(jì)器比以前的版本多了幾個(gè)功能:
    1. 導(dǎo)出文件請(qǐng)選擇文件-->>導(dǎo)出選項(xiàng),導(dǎo)出文件保存時(shí)請(qǐng)您務(wù)必加上xml的后綴
    2. 鼠標(biāo)移到直線上的時(shí)候,直線會(huì)初始化顯示為綠色,按住鼠標(biāo)不放,拖動(dòng)鼠標(biāo),將會(huì)在直線上出現(xiàn)一個(gè)拐點(diǎn),該拐點(diǎn)可以隨便拖動(dòng),雙擊拐點(diǎn)會(huì)自動(dòng)刪除該拐點(diǎn),也可用框選選中拐點(diǎn)進(jìn)行刪除,選中的拐點(diǎn),初始顏色為藍(lán)色,您可以自由設(shè)置,移開時(shí)直線會(huì)恢復(fù)為粉紅色
    3. 可用框選選中組件進(jìn)行刪除,如果為半透明狀態(tài),則表明為選中,您同時(shí)可以按住ctrl鍵,選中其他沒有被選中的組件,從而進(jìn)行進(jìn)行加選
    4. 如果您本選中了某組件,然后按住ctrl鍵再將其框選,則該組件會(huì)被取消選中
    5. 點(diǎn)擊鼠標(biāo)右鍵有備選菜單進(jìn)行操作
    6. 下面的Outline是臨時(shí)生成的xml文件,您可以在不導(dǎo)出文件的情況下查看現(xiàn)有的xml文件
    7. 選擇子元素步驟操作之后,只有當(dāng)鼠標(biāo)在開始節(jié)點(diǎn)或步驟節(jié)點(diǎn)下面的action列表中點(diǎn)擊時(shí)才會(huì)新增一個(gè)action操作
    8. 合并節(jié)點(diǎn)只能有一個(gè)無(wú)條件連接進(jìn)行連出,合分支節(jié)點(diǎn)只能連出無(wú)條件連接,且可多個(gè)

    9.根據(jù)導(dǎo)入的文件生成得流程圖不具備定位的功能,因?yàn)槲矣X得是多余的,只要它們之間的關(guān)系明確得話,那你再在界面上進(jìn)行拖拉成你喜歡得樣式就可以了,所以當(dāng)你導(dǎo)入文件的時(shí)候,看到的會(huì)是每個(gè)節(jié)點(diǎn)隨機(jī)選擇位置。

         以上是我在此版本中進(jìn)行的系統(tǒng)說(shuō)明,請(qǐng)見關(guān)于--》系統(tǒng)說(shuō)明。

    再您下載我附件的同時(shí),請(qǐng)先到http://get.adobe.com/cn/air/處下載AdobeAIRInstaller.exe文件進(jìn)行安裝,使您系統(tǒng)能進(jìn)行AIR文件的安裝,附件為AIR格式文件。
    /Files/nijiaben/OsWorkflow.rar
    posted @ 2009-09-05 18:28 你假笨 閱讀(1933) | 評(píng)論 (1)編輯 收藏
                歡迎大家提出意見,多余的話就不多說(shuō)了,花了10天的作品,辛苦啊由于有400多k,所以大家在看到下面效果前,先給大家?guī)讖埥貓D哈,如果感興趣再去搗鼓一下那東西呵。也歡迎各位到我個(gè)人博客上留言哈,http://www.lovestblog.cn



    這里好像不能插入flash,如果大家有興趣的話,可以去http://www.lovestblog.cn/articlePicture/84/84.1.swf體驗(yàn)下真實(shí)的效果。
    posted @ 2009-07-31 23:52 你假笨 閱讀(6759) | 評(píng)論 (44)編輯 收藏
            這個(gè)暑假本來(lái)打算去廣州一公司實(shí)習(xí)的,結(jié)果接到老師的一個(gè)項(xiàng)目,是關(guān)于工作流的,實(shí)現(xiàn)一個(gè)文件審批的流程,起初也不知道是怎么回事,老師也有些事情,就拋下一句話“去下載OSWorkflow的客戶端下來(lái)看看”,結(jié)果下載下來(lái)才知道是怎么回事,要求用Flex實(shí)現(xiàn)它,我的媽呀,這個(gè)可是一個(gè)不小的工程,還得我一個(gè)人完成,上面這個(gè)項(xiàng)目也批下來(lái)了,錢都撥下來(lái)了,不完成不行啊,巧合的是自己這個(gè)暑假又有一個(gè)培訓(xùn),根本沒什么時(shí)間去做呀,就在前幾天突然決定暫時(shí)放棄培訓(xùn),先把這個(gè)完成再說(shuō),在做的時(shí)候沒什么底,不知道自己能不能完成,因?yàn)楦杏X很多東西我都不會(huì)。不管怎樣還是要試一下不,我就喜歡嘗試下,往往在嘗試中能發(fā)現(xiàn)點(diǎn)什么,這不從19號(hào)開始就衣食住行都在學(xué)校實(shí)驗(yàn)室了,到今天界面上的功能基本實(shí)現(xiàn)了大部分了,至少能拖組件,然后在組件間能按照一定的要求進(jìn)行連接,比如說(shuō)從合并節(jié)點(diǎn)出來(lái)的只能是無(wú)條件連接到節(jié)點(diǎn)或這操作,每個(gè)操作最多只能有一個(gè)非條件連接,連線的終點(diǎn)只能是節(jié)點(diǎn)等等,我沒有研究過OsWorkflow的源碼,但是我從提供給我的客戶端以及生成的xml文件推斷出一些規(guī)則,于是經(jīng)過不久的思考就開始動(dòng)工了,慢慢的雛形也就出來(lái)了,當(dāng)中碰到了不少問題,當(dāng)然也慢慢解決了,等完成之后再把代碼優(yōu)化下,到時(shí)覺得可以的話,可以開源,上次我那博客http://www.lovestblog.cn本來(lái)也打算開源的,但是確實(shí)有點(diǎn)擔(dān)心,怕放上來(lái),被高人們唾罵,怕承受不了巨大的打擊,就還是先放放了,再者也沒時(shí)間去優(yōu)化代碼,所以等有時(shí)間了再整理下再拿出來(lái)挨批了,呵呵,好了說(shuō)了那么多廢話了,還是把這個(gè)工作流的一個(gè)截圖拿出來(lái)曬曬吧,等全部完成之后在拿出來(lái),希望能聽到大家寶貴的意見。
    posted @ 2009-07-24 23:30 你假笨 閱讀(2160) | 評(píng)論 (2)編輯 收藏
           本文最初發(fā)布于本人的flex博客http://www.lovestblog.cn/,歡迎大家光臨。(轉(zhuǎn)載的請(qǐng)不要?jiǎng)h除該行,謝謝合作)
    我們都知道jQUery對(duì)象中有一個(gè)類數(shù)組的元素包裝集,該集合類似js中的數(shù)組一樣擁有l(wèi)ength屬性,因此我們稱此為類數(shù)組,下面我們就來(lái)總結(jié)下這個(gè)jQuery對(duì)象中的類數(shù)組時(shí)如何進(jìn)行操作的,看看我們的jQuery為我們都提供了哪些可用的方法:
       
    size():很明顯,它應(yīng)該是返回包裝集中的元素個(gè)數(shù),如$('a').size()表示鏈接元素的個(gè)數(shù);
    get(index):當(dāng)沒指定index時(shí)就默認(rèn)取包裝集中所有元素,并以js中的數(shù)組形式返回,如果指定了index,則返回下標(biāo)為index對(duì)應(yīng)的元素,如$('img[title]').get(0)返回包含屬性title的第一個(gè)img元素,其也等效于$('img[title]')[0];
    index(elem):在包裝集中返回元素elem所在的下標(biāo),如果沒找到該元素則返回-1;
    add(String|elem|Array):把參數(shù)中的元素添加到包裝集中,如果參數(shù)是jQuery選擇器,那么將把所有匹配的對(duì)象都添加到集合中,如果是html元素那就通過clean方法得到的元素?cái)?shù)組添加到集合中,如果是dom元素或dom元素?cái)?shù)組,那就直接添加到集合了;注意返回的是添加后的包裝集;如$('img[alt]','img[title]')等效于$('img[alt]').add('img[title]')即返回包含了alt屬性的img元素或包含了title屬性的img元素;
    not(String|elem|Array):把包裝集中滿足參數(shù)條件的元素刪除,注意參數(shù)只能是篩選表達(dá)式,即以"["或者":"開頭的表達(dá)式,如$('img[title]').not('title*=puy')即返回包含title屬性的img元素,并且這些元素的title屬性中包含有puy文本;返回的是篩選之后的包裝集;
    filter(String|function):如果傳入的參數(shù)是String類型的話,那么該表達(dá)式必須也是篩選表達(dá)式,用于從包裝集里刪除所有與選擇器不匹配的元素;如果傳入的是一個(gè)函數(shù)的話,那么包裝集中的每個(gè)元素都調(diào)用這個(gè)函數(shù),若這個(gè)函數(shù)返回false則把這個(gè)元素從包裝集中刪除,而在函數(shù)中可以通過this關(guān)鍵字來(lái)調(diào)用當(dāng)時(shí)包裝集中調(diào)用方法的元素;如$('td').filter(function(){return this.innerHTML.match(/^"d+$/)})返回td中的內(nèi)容為數(shù)字的所有td元素;
    slice(begin,end):創(chuàng)建并返回新的包裝集,該包裝集是原來(lái)包裝集的連續(xù)的一部分,且新包裝集的第一個(gè)元素是原包裝集中的begin位置的元素,而最后一個(gè)元素是end位置元素的前一元素,當(dāng)然end可以不指定,那么將延伸到原始包裝集的末尾;如$('*').slice(2,3)這個(gè)語(yǔ)句選擇頁(yè)面上的所有元素,然后生存包含原始包裝集的第三個(gè)元素的新包裝集,注意這個(gè)$('*').get(2)不同,這個(gè)返回的是元素,而slice方法返回的是包裝集,從而擁有包裝集的操作;
    childen():返回原始包裝集元素的所有不同子元素所組成的新包裝集(不包含文本節(jié)點(diǎn)),如$('div').children()返回所有div元素下的子元素所組成的新包裝集;如果指定了參數(shù),那么該參數(shù)也是篩選表達(dá)式;
    contents():返回原始包裝集元素的內(nèi)容新包裝集(可以包含文本節(jié)點(diǎn));注意此方法不能接受參數(shù)進(jìn)行過濾;
    next():返回原始包裝集元素的所有唯一的下一個(gè)兄弟元素所組成的新包裝集;如果指定了參數(shù),那么該參數(shù)也是篩選表達(dá)式;如$('div#someDiv').next()返回包含id為someDiv的div元素的下一個(gè)兄弟元素的包裝集;如果指定了參數(shù),那么該參數(shù)也是篩選表達(dá)式;
    nextAll():返回包含原始包裝集元素的所有后續(xù)兄弟的新包裝集;如$('div#someDiv').nextAll()返回包含id為someDiv的div元素的后面兄弟元素的新包裝集;如果指定了參數(shù),那么該參數(shù)也是篩選表達(dá)式;
    parent():返回原始包裝集所有元素的唯一直接父元素的新包裝集;如果指定了參數(shù),那么該參數(shù)也是篩選表達(dá)式;
    parents():返回原始包裝集所有元素的祖先元素的新包裝集;如果指定了參數(shù),那么該參數(shù)也是篩選表達(dá)式;
    prev():返回原始包裝集元素的所有唯一的上一個(gè)兄弟元素組成的新包裝集;如果指定了參數(shù),那么該參數(shù)也是篩選表達(dá)式;
    prevAll():返回包含原始包裝集元素的所有前面兄弟元素的新包裝集;如果指定了參數(shù),那么該參數(shù)也是篩選表達(dá)式;
    siblings():返回包含原始包裝集元素中的所有唯一兄弟元素所組成的新包裝集;如果指定了參數(shù),那么該參數(shù)也是篩選表達(dá)式;
    find(String):返回包含原始包裝集里與傳入的選擇器表達(dá)式相匹配的所有元素的新包裝集,并且原始包裝集中的元素的后代也會(huì)被傳入新的包裝集;
    contains(text):返回包含text參數(shù)所傳入的文本字符串的元素所組成的新包裝集;
    is(String):如果包裝集中含有String匹配的元素,那么返回true,否則返回false;
    clone(copyHandle):如果傳入的參數(shù)為true,那么會(huì)連帶事件一起拷貝,否則不拷貝事件,形成一個(gè)新的包裝集;
    end():在jQuery命令鏈內(nèi)調(diào)用,以便返回退到前一個(gè)包裝集;
    andSelf():合并命令鏈內(nèi)最近產(chǎn)生的兩個(gè)包裝集;

         對(duì)于包裝元素的操作就總結(jié)到這里,如果哪里不對(duì)的還請(qǐng)各位指出來(lái)方便大家參考學(xué)習(xí)。

    posted @ 2009-04-22 10:50 你假笨 閱讀(2391) | 評(píng)論 (0)編輯 收藏
            本文最初發(fā)表于本人個(gè)人博客http://www.lovestblog.cn/,歡迎大家光臨 。(轉(zhuǎn)載的請(qǐng)不要?jiǎng)h除該行,謝謝合作)
            jQuery選擇器其實(shí)是一個(gè)有些地方比較費(fèi)解的,如果沒有經(jīng)過多次實(shí)驗(yàn)的話,很難得出它的每個(gè)操作符到底是干什么的,很容易出錯(cuò),經(jīng)過我的多次測(cè)試,終于對(duì)一些比較難理解或容易出錯(cuò)的選擇操作進(jìn)行總結(jié),既方便自己將來(lái)查詢又方便初學(xué)者學(xué)習(xí)。如果哪里有不對(duì)的還望大家?guī)臀抑赋鰜?lái),這里是一個(gè)相互學(xué)習(xí)的地方。 

         1. 先說(shuō)說(shuō)通過位置選擇的幾個(gè)操作: 
    • :first:默認(rèn)情況下是相對(duì)整個(gè)頁(yè)面來(lái)說(shuō)的第一個(gè),如:li:first表示整個(gè)頁(yè)面的第一個(gè)li元素,而ul li:first表示整個(gè)頁(yè)面的第一個(gè)li元素,并且是在ul下的子元素;
    • :last:同上了,只是是最后一個(gè)而已;
    • :first-child:為每個(gè)父元素匹配第一個(gè)子元素,如li:first-child返回每個(gè)ul的第一個(gè)li元素。可以這樣理解,頁(yè)面中的元素有相同的父元素的,并且里面又包含li元素的,那么就取第一個(gè)li元素,每個(gè)子類集合都要進(jìn)行判斷,直到找出所有符合要求的li元素;
    • :last-child:這個(gè)也與上面相對(duì)了,只是取的是最后一個(gè);
    • :only-child:返回所有沒有兄弟節(jié)點(diǎn)的元素,注意,文本元素不是,也就是說(shuō)類似這樣的<div>hello<a href="">jquery</a></div>,對(duì)于這段會(huì)選出<a>元素;對(duì)于$(”label:only-child“)會(huì)選出是label元素,同時(shí)它是它父類唯一的子元素的label元素;
    • :nth-child(n):返回第n個(gè)子節(jié)點(diǎn),n從1開始,如果n取0,那么就會(huì)選擇所有的元素。如:[*]li:nth-child(2)返回li元素,并且該元素是其父元素的第二個(gè)子元素;
    • :nth-child(even|odd):返回偶數(shù)或奇數(shù)的子節(jié)點(diǎn);
    • :nth-child(An+B):返回滿足表達(dá)式An+B的所有子節(jié)點(diǎn),比如3n+1返回所處位置為父節(jié)點(diǎn)子元素的是3的倍數(shù)加1的那個(gè)子元素;
    • :even:頁(yè)面范圍內(nèi)的處于偶數(shù)位置的元素,如:li:even返回全部偶數(shù)li元素;
    • :odd:頁(yè)面范圍內(nèi)的處于奇數(shù)位置的元素;
    • :eq(n):第n個(gè)匹配的元素(n從0開始),如:li:eq(3)返回整個(gè)頁(yè)面的第四個(gè)li元素,ul li:eq(1)返回頁(yè)面中第一個(gè)ul元素下的第二個(gè)li元素,注意:只匹配一次就返回了;
    • :gt(n):第n個(gè)匹配元素(不包括)之后的元素(n從0開始),如:ul:gt(2)返回從第3個(gè)ul開始的所有ul元素(含第三個(gè));
    • :lt(n):第n個(gè)匹配元素(不包括)之前的元素(n從0開始),如:ul:lt(2)返回從第0個(gè)和第1個(gè)ul元素;
        2. 利用css選擇器進(jìn)行選擇: 
    • 元素標(biāo)簽名:比如說(shuō)$(”a“)會(huì)選出所有鏈接元素;
    • #id:通過元素id進(jìn)行選擇,比如說(shuō)$("#form1")會(huì)選擇id為form1的元素;
    • .class:通過元素的CSS類來(lái)選擇,比如說(shuō)$(".boldstyle")會(huì)選擇CSS為boldstyle類的元素;
    • 標(biāo)簽名#id.class:通過某類元素的id屬性和class屬性來(lái)選擇,如:$(a#blog.boldStyle)會(huì)選擇id為blog并且CSS類型為.boldStyle類型的鏈接元素(<a id='blog' class='.boldStyle'>);
    • 父標(biāo)簽名 子標(biāo)簽名.class:通過選擇父標(biāo)簽下的某種CSS類型的子元素,如:$(p a.redStyle)會(huì)選擇p段落元素中的鏈接子元素a,且其css類型為.redStyle;
         3. 通過子選擇器,容器選擇器和屬性選擇器進(jìn)行選擇: 
    • *:匹配所有的元素,比如說(shuō):$(*)會(huì)把頁(yè)面中的所有元素都返回;
    • E:匹配標(biāo)簽名為E的所有元素,如$("a")返回所有鏈接元素;
    • E F:匹配父元素E下的標(biāo)簽名為F的所有子元素(F可以為E的子類的子類,甚至更遠(yuǎn));
    • E>F:匹配父元素E下的所有標(biāo)簽名為F的直接子元素;
    • E+F:匹配所有標(biāo)簽名為F的元素,并且有E類型的兄弟節(jié)點(diǎn)在該F元素之前(E,F緊挨著);
    • E~F:匹配前面是任何兄弟節(jié)點(diǎn)E的所有元素F(E,F不必緊挨著);
    • E:has(F):匹配標(biāo)簽名為E,至少有一個(gè)標(biāo)簽名為F的后代節(jié)點(diǎn)的所有元素E;
    • E.C:匹配帶有類名C的所有元素E。.C等效于*.C;
    • E#I:匹配id為I的所有元素E,#I等效于*#I;
    • E[A]:匹配帶有屬性A的所有元素E;
    • E[A=V]:匹配所有屬性A的值為V的元素E;
    • E[A^=V]:匹配所有元素E,且A的屬性值是V開頭的;
    • E[A$=V]:匹配所有元素E,且A的屬性值是V結(jié)尾的;
    • E[A*=V]:匹配所有元素E,且A的屬性值中包含有V;
         4.利用jQuery自定義的選擇器進(jìn)行選擇: 
    • :button:選擇任何按鈕類型的元素,包括input[type=submit]等等;
    • :checkbox:選擇復(fù)選框元素;
    • :file:選擇所有文件類型元素,即input[type=file];
    • :image:選擇表單中的圖像元素,即input[type=image],注意此處和前面根據(jù)標(biāo)簽名img選擇圖像有點(diǎn)不同哈;
    • :input:選擇表單元素,如<input>,<select>,<textarea>,<button>等;
    • :radio:選擇單選按鈕元素;
    • :reset:選擇復(fù)位按鈕元素,如input[type=reset],button[type=reset];
    • :submit:選擇提交按鈕元素;
    • :text:選擇文本字段元素,即input[type=text];
    • :animated:選擇當(dāng)前處于動(dòng)態(tài)控制下的元素;
    • :contains(hello):選擇包含文本hello的元素;
    • :header:選擇標(biāo)題元素,如<h1>;
    • :parent:選擇擁有后代節(jié)點(diǎn)(包括文本)的元素,而排除空元素;
    • :selected:選擇已選中的選項(xiàng)元素;
    • :visible:選擇可見元素;
    • :enable:選擇界面上已經(jīng)可以使用的表單元素;
    • :disabled:選擇界面上被禁用的表單元素;
    • :checked:選擇已選中的復(fù)選框或單選按鈕;
       主要還是要多練習(xí),多寫點(diǎn)例子熟悉下,東西其實(shí)也不是很多哈,希望能給大家?guī)?lái)幫助;
    posted @ 2009-04-21 12:17 你假笨 閱讀(5310) | 評(píng)論 (1)編輯 收藏
          想必不少人聽說(shuō)過javaagent,但是很少人聽說(shuō)Instrumentation,其實(shí)Instrumentation就是javaagent的實(shí)現(xiàn)機(jī)制,說(shuō)到Instrumentation,就必須想了解javaattach機(jī)制,那就先說(shuō)下attach的實(shí)現(xiàn)。

            大家進(jìn)行jstack的時(shí)候,是不是經(jīng)常看到兩個(gè)線程Signal Dispatcher Attach Listener線程,可能不知道是干嘛的吧,這兩個(gè)線程是實(shí)現(xiàn)attach的關(guān)鍵所在,其中前者是在jvm啟動(dòng)的時(shí)候就會(huì)創(chuàng)建的,后者只有接收過attach請(qǐng)求的時(shí)候vm才會(huì)創(chuàng)建,顧名思義,Signal Dispatcher是分發(fā)信號(hào)的, Attach Listener 是處理attach請(qǐng)求的,那么兩者有什么關(guān)系呢,當(dāng)我們執(zhí)行attach方法的時(shí)候,會(huì)向目標(biāo)vm發(fā)出一個(gè)SIGQUIT 的信號(hào),目標(biāo)vm收到這個(gè)信號(hào)之后就會(huì)創(chuàng)建Attach Listener線程了,當(dāng)然jvm保證了不會(huì)多創(chuàng)建。
     1  path = findSocketFile(pid);
     2         if (path == null) {
     3             File f = new File(tmpdir, ".attach_pid" + pid);
     4             createAttachFile(f.getPath());
     5             try {
     6                 sendQuitTo(pid);
     7 
     8                 // give the target VM time to start the attach mechanism
     9                 int i = 0;
    10                 long delay = 200;
    11                 int retries = (int)(attachTimeout() / delay);
    12                 do {
    13                     try {
    14                         Thread.sleep(delay);
    15                     } catch (InterruptedException x) { }
    16                     path = findSocketFile(pid);
    17                     i++;
    18                 } while (i <= retries && path == null);
    19                 if (path == null) {
    20                     throw new AttachNotSupportedException(
    21                         "Unable to open socket file: target process not responding " +
    22                         "or HotSpot VM not loaded");
    23                 }
    24             } finally {
    25                 f.delete();
    26             }
    27         }
            Attach機(jī)制說(shuō)得簡(jiǎn)單點(diǎn)就是提供A進(jìn)程可以連上B進(jìn)程(當(dāng)然是java進(jìn)程),創(chuàng)建socket進(jìn)行通信,A通過發(fā)命令給B,B然后對(duì)命令進(jìn)行截取從自己的vm中獲取信息發(fā)回給客戶端vm,但是并不是隨便發(fā)指令都會(huì)處理的,那么attach Listener接收哪些命令呢,如下所示
    static AttachOperationFunctionInfo funcs[] = {
      { "agentProperties",  get_agent_properties },
      { "datadump",         data_dump },
      { "dumpheap",         dump_heap },
      { "load",             JvmtiExport::load_agent_library },
      { "properties",       get_system_properties },
      { "threaddump",       thread_dump },
      { "inspectheap",      heap_inspection },
      { "setflag",          set_flag },
      { "printflag",        print_flag },
      { "jcmd",             jcmd },
      { NULL,               NULL }
    };
             Instrumentation的實(shí)現(xiàn)其實(shí)主要使用了load這個(gè)指令,它用來(lái)實(shí)現(xiàn)讓target vm動(dòng)態(tài)加載agentlib,Instrumentation的實(shí)現(xiàn)在一個(gè)名為libinstrument.dylib的動(dòng)態(tài)lib庫(kù),linux下是libinstrument.so,它是基于jvmti接口實(shí)現(xiàn)的,因此在對(duì)其進(jìn)行l(wèi)oad的時(shí)候會(huì)創(chuàng)建一個(gè)agent實(shí)例,并往jvmti環(huán)境注冊(cè)一些回調(diào)方法,比如監(jiān)聽類文件加載的事件,vm初始化完成事件等,執(zhí)行Agent_OnAttach,這里會(huì)創(chuàng)建一個(gè)Instrumentation實(shí)例并返回給用戶供大家擴(kuò)展Instrumentation,比如增加一些transform。并會(huì)執(zhí)行Instrumentation實(shí)例的loadClassAndCallAgentmain方法,該方法主要執(zhí)行agent的MF文件里定義的 Agent-Class類的agentmain方法,當(dāng)vm初始化完畢之后,會(huì)調(diào)用loadClassAndCallPremain方法,該方法主要執(zhí)行agent的MF文件里定義的 Agent-Class類的pre main方法。在類進(jìn)行加載的時(shí)候會(huì)調(diào)用Instrumentation的transform方法,可以看看參數(shù)里有個(gè)byte數(shù)組,這個(gè)數(shù)組其實(shí)就是正在加載的class字節(jié)碼,所以如果要字節(jié)碼增強(qiáng)在這里就可以入手啦,甚至可以實(shí)現(xiàn)偷天換日.
    posted @ 2013-04-12 22:38 你假笨 閱讀(2202) | 評(píng)論 (0)編輯 收藏
           本文最初發(fā)表在http://www.lovestblog.cn,轉(zhuǎn)載請(qǐng)注明出處,謝謝。
     最近在忙一個(gè)項(xiàng)目,使用的是Flex+Spring+Hibernate,期間碰到一個(gè)問題,有必要在此記錄一下,也方便有相似問題的來(lái)者參考下
            問題描述:有一個(gè)用戶表和一個(gè)用戶詳情表,這兩個(gè)表是一個(gè)一對(duì)一的單向關(guān)聯(lián)關(guān)系,即在用戶表中一個(gè)外鍵引用用戶詳情表,我在UserInfo的映射文件中使用的是many-to-one,設(shè)置了unique="true"表示一對(duì)一關(guān)系,設(shè)置了cascade="save-update"表示的是在保存useInfo對(duì)象的時(shí)候會(huì)自動(dòng)保存與之關(guān)聯(lián)的userDetails臨時(shí)對(duì)象,即我希望的是先執(zhí)行一個(gè)在用戶詳情表中的插入語(yǔ)句然后再執(zhí)行一個(gè)在用戶表中的插入語(yǔ)句,userInfo對(duì)象是從flex端傳過來(lái)的,當(dāng)然也設(shè)置了userDetails屬性的值,在userInfo的dao文件中save方法是這樣的
        public IvUserInfo save(IvUserInfo transientInstance) {
            log.debug(
    "saving IvUserInfo instance");
            
    try {
                getHibernateTemplate().save(transientInstance);
                log.debug(
    "save successful");
            } 
    catch (RuntimeException re) {
                log.error(
    "save failed", re);
                
    throw re;
            }
            
    return transientInstance;
        }
    后面發(fā)現(xiàn)執(zhí)行的sql語(yǔ)句只有一條插入語(yǔ)句,就是在用戶表中的一個(gè)插入,由于外鍵的關(guān)聯(lián)作用,是用戶表的這條插入也無(wú)法執(zhí)行,這就是問題所在了。
            問題解決:這個(gè)問題我也沒有具體研究Hibernate的源碼,我先寫了個(gè)測(cè)試類,發(fā)現(xiàn)僅僅在java中執(zhí)行操作的話是可以正確執(zhí)行兩條插入語(yǔ)句的,但是通過flex傳過來(lái)就有問題了,那說(shuō)明是flex端傳參數(shù)過來(lái)的問題,于是我試著修改UserInfo的save方法:

    public IvUserInfo save(IvUserInfo transientInstance) {
            log.debug(
    "saving IvUserInfo instance");
            
    try {
                IvUserDetails ud
    =new IvUserDetails();
                ud.setQq(transientInstance.getIvUserDetails().getQq());

                transientInstance.setIvUserDetails(ud);
                getHibernateTemplate().save(transientInstance);
                log.debug(
    "save successful");
            } 
    catch (RuntimeException re) {
                log.error(
    "save failed", re);
                
    throw re;
            }
            
    return transientInstance;
        }
    這樣一來(lái)問題解決了,順利執(zhí)行了兩條插入語(yǔ)句。
           如果朋友知道具體原因的話希望給我留言了,同時(shí)也希望該記錄能幫助碰到此類問題的朋友。
    posted @ 2010-06-22 11:20 你假笨 閱讀(1571) | 評(píng)論 (0)編輯 收藏
             歡迎光臨筆者博客http://www.lovestblog.cn
            最近兩天本人在為本博實(shí)現(xiàn)rss發(fā)布和訂閱,本來(lái)是想在前端實(shí)現(xiàn)xml的生成和修改,因?yàn)橛胊s3的E4X操作xml比較方便,但是后面發(fā)現(xiàn)不能為元素設(shè)置CDATA值,于是只好作罷,便只能依靠后臺(tái)的java來(lái)實(shí)現(xiàn)此功能了,當(dāng)然操作xml的話,我首先想到了dom4j,dom4j操作xml還是比較方便的,即可以輕松實(shí)現(xiàn)我們的CDATA設(shè)置,也可以為我們?nèi)我馕恢貌迦朐靥峁┝藢?shí)現(xiàn),對(duì)于在指定位置新增節(jié)點(diǎn)開始我有點(diǎn)蒙了,后面通過網(wǎng)上搜索資源加之自己的一些理解,而實(shí)現(xiàn)了此功能,下面展示了部分代碼供今后參考吧:
    1. public static int createXMLFile(String filename,List list){   
                 
      /** 返回操作結(jié)果, 0表失敗, 1表成功 */  
                 
      int returnValue = 0;    
                 Document document 
      = DocumentHelper.createDocument();   
                 Element rssElement 
      = document.addElement("rss");   
                 rssElement.addAttribute(
      "version""2.0");     
                 Element channelElement 
      = rssElement.addElement("channel");   
                 Element titleElement 
      = channelElement.addElement("title");   
                 titleElement.setText(
      "你假笨(nijiaben)心情技術(shù)博客");    
                    
                 Element linkElement 
      = channelElement.addElement("link");   
                 linkElement.setText(
      "http://www.lovestblog.cn");   
                    
                 Element descriptionElement 
      = channelElement.addElement("description");   
                 descriptionElement.setText(
      "專注于Java,Flex技術(shù)開發(fā)研究");   
                    
                 Element languageElement 
      = channelElement.addElement("language");   
                 languageElement.setText(
      "zh-cn");   
                    
                 Element lastBuildDateElement 
      = channelElement.addElement("lastBuildDate");   
                 lastBuildDateElement.setText(
      new java.text.SimpleDateFormat("yyyy-mm-dd hh:mm:ss",Locale.CHINA).format(((ArticleInfo)(list.get(0))).getCreateTime()));             
                          
                 
      for(int i=list.size()-1;i>0;i--){   
                     ArticleInfo ainfo
      =(ArticleInfo)(list.get(i));   
                     Element itemElement 
      = channelElement.addElement("item");   
                     Element title1Element 
      = itemElement.addElement("title");   
                     title1Element.setText(ainfo.getTitle());   
                     Element description1Element 
      = itemElement.addElement("description");   
                     
      int maxLen=5000;   
                     
      if(ainfo.getRssContent().length()<5000){   
                         maxLen
      =ainfo.getRssContent().length();   
                     }
         
                     description1Element.addCDATA(ainfo.getRssContent().substring(
      0, maxLen));          
                     Element pubDate
      =itemElement.addElement("pubDate");   
                     pubDate.setText(
      new java.text.SimpleDateFormat("yyyy-mm-dd hh:mm:ss",Locale.CHINA).format(ainfo.getCreateTime()));                     
                     Element link1Element
      =itemElement.addElement("link");   
                     link1Element.setText(
      "http://www.lovestblog.cn");   
                 }
         
                 
      try{   
                     
      /** 將document中的內(nèi)容寫入文件中 */  
                     XMLWriter writer 
      = new XMLWriter(new FileOutputStream(path+filename));   
                     writer.write(document);   
                     writer.close();   
                     
      /** 執(zhí)行成功,需返回1 */  
                     returnValue 
      = 1;   
                 }
      catch(Exception ex){   
                     ex.printStackTrace();   
                 }
         
                 
      return returnValue;   
              }
        
    posted @ 2010-04-01 12:14 你假笨 閱讀(3086) | 評(píng)論 (1)編輯 收藏

              本文最新發(fā)布于http://www.lovestblog.cn,歡迎轉(zhuǎn)載該文,但請(qǐng)注明文章出處,謝謝合作。 

              mysql的from從句用來(lái)指定參與查詢的表,當(dāng)然也可以是生成的中間表,在表前我們有時(shí)需要指定數(shù)據(jù)庫(kù),這主要是用在我們需要訪問當(dāng)前數(shù)據(jù)庫(kù)之外的數(shù)據(jù)庫(kù)中的表的情況,在這中情況下我們采用"."操作符來(lái)進(jìn)行,如userdb.user,其實(shí)userdb為數(shù)據(jù)庫(kù)名,user為表名,這是對(duì)mysql數(shù)據(jù)庫(kù)而言的,對(duì)于DB2和Oracle就不是通過指定數(shù)據(jù)庫(kù)名了,而是指定sql用戶了,這就是說(shuō)不同sql用戶可以建立相同名字的表,但是同一個(gè)sql用戶只能建立唯一名字的表。這就是它們?cè)谶@表規(guī)范上面的區(qū)別。對(duì)于列規(guī)范,mysql可以在需要查詢的列則可以采用如下形式進(jìn)行訪問:“數(shù)據(jù)庫(kù)名.表名.列名”。對(duì)于多個(gè)表的規(guī)范,也就是涉及查詢多個(gè)表的情況下,執(zhí)行的過程是采用笛卡爾積的形式進(jìn)行的。也就是說(shuō)生成的中間表的列數(shù)為兩個(gè)表中列數(shù)的總和,而行的總數(shù)等于一個(gè)表中的行的數(shù)量與另外一個(gè)表中行的數(shù)量的乘積。
           對(duì)于from從句中使用假名的情況,比如select u.id,name,age,a.account from utb as u,atb as a where u.id=a.user_id,在我們使用假名之后,那么在該sql語(yǔ)句的任何地方都只能使用假名,不能使用真實(shí)的表名,同時(shí)上面的as關(guān)鍵字也是可以省略的,也就是說(shuō)對(duì)于上面的語(yǔ)句不能用atb來(lái)取代a,utb來(lái)取代u了。雖然from從句不是我們指定的第一條語(yǔ)句,但是絕對(duì)是第一個(gè)被處理的語(yǔ)句,所以在聲明假名前使用假名不會(huì)導(dǎo)致錯(cuò)誤。如果一條from從句引用到兩個(gè)有著相同名稱的表,則必須使用假名。如:

    1select p.playerno
    2from players as p,players as par
    3where par.fn="jp" and par.ln="l" and p.birth_date<par.birth_date


           對(duì)于多個(gè)表間的連接處理可能會(huì)導(dǎo)致有相同的結(jié)果,即有重復(fù)的結(jié)果,sql并不會(huì)自動(dòng)從最終結(jié)果中刪除重復(fù)的行,這是如果我們不希望在結(jié)果中出現(xiàn)重復(fù)的行,那么我們可以在select后直接指定distinct。如:

    1select distinct T.playerno 
    2from teams as T,penalties as pen 
    3where T.playerno=pen.playerno。

     

            接下來(lái)說(shuō)說(shuō)連接哈,對(duì)于內(nèi)連接,如果是兩個(gè)表的話,就取兩個(gè)表的一個(gè)交集,如果是左外連接的話,那就是左邊的表全取,右邊沒有的用null替代,弱國(guó)是右外連接的話,那就是右邊的表全取,左邊沒有的用null表示。下面看看一個(gè)具體的例子:

    1--表stu        --表exam 
    2id name        id grade 
    31, Jack         156 
    42, Tom         276
    53, Kity         1189
    64, nono 

     

    內(nèi)連接 (顯示兩表id匹配的)

    1select stu.id,exam.id,stu.name, exam.grade from stu (inner) join exam on stu.id=exam.id 
    2-------------------------------- 
    31 1 Jack 56 
    42 2 Tom 76 

     

    左連接(顯示join 左邊的表的所有數(shù)據(jù),exam只有兩條記錄,所以stu.id,grade 都用NULL 顯示)

    1select stu.id,exam.id,stu.name, exam.grade from stu left (outer) join exam on stu.id=exam.id 
    21 1 Jack 56 
    32 2 Tom 76 
    43 NULL Kity NULL 
    54 NULL nono NULL 

     

    右連接(與作連接相反,顯示join右邊表的所有數(shù)據(jù))

    1select stu.id,exam.id,stu.name, exam.grade from stu right join exam on stu.id=exam.id 
    21 1 Jack 56 
    32 2 Tom 76 
    4NULL 11 NULL 89 

     

    內(nèi)連接取交集,外連接分左和右,
    左連接左邊的全取,
    右連接右邊的全取

          對(duì)于連接的列的名稱相同的話,那么可以使用using來(lái)替代條件,如上面的內(nèi)連接可以這樣改寫:
        

    1  select stu.id,exam.id,stu.name, exam.grade from stu inner join exam using(id)。

          對(duì)于左外連接使用的情況一般是當(dāng)左表的連接列中存在未出現(xiàn)在右表的連接列中的值時(shí),左外連接才有用。
          還有個(gè)全外連接的,也就是說(shuō)只要在兩個(gè)表中出現(xiàn)的記錄都會(huì)在中間表中出現(xiàn),當(dāng)右表有而左表沒有或當(dāng)左表有而右表沒有的時(shí)候用null表示。具體語(yǔ)法如下:select stu.id,exam.id,stu.name, exam.grade from stu full join exam using(id)。
          交叉連接:就是顯示求表的笛卡爾積,select * from teams cross join penalties.這句完全等價(jià)于select teams.*,penalties.* from teams,penalties.
          聯(lián)合連接:select * from teams union join penalties,這個(gè)其實(shí)很容易理解,產(chǎn)生結(jié)果所包含的列為兩個(gè)表所有的列和,對(duì)于數(shù)據(jù)的列出,首先列出左表的數(shù)據(jù),對(duì)于屬于右表的列,用null表示,接下來(lái)列出右表的數(shù)據(jù),對(duì)于屬于左表的列用null表示。
           自然連接:select * from teams nature inner join penalties where division='first';此句完全等同與select t.playerno,t.teamno,t.division,pen.paymentno,pen.payment_date,pen.amount from teams  as t inner join penalties as pen on t.playerno=pen.playerno where dividion='first'.相比就知道,我們無(wú)須顯示指出必須要連接到哪些列,sql會(huì)自動(dòng)查找兩表中是否有相同名稱的列,且假設(shè)他們必須在連接條件中使用。此處的on或using從句是多余的,因此不允許使用。

           下面看個(gè)例子創(chuàng)建一個(gè)稱為towns的虛擬表:

    1select *
    2from (select 'Stratford' as town,4 as number 
    3       union
    4       select 'Plymouth',6
    5       union
    6       select 'Inglewood',1                 
    7       union
    8       select 'Douglas',2) as towns
    9order by town;


    結(jié)果為:

    1town             number
    2----------------------
    3Douglas              2
    4Inglewood           1
    5Plymouth            6
    6Stratford            4


     

    posted @ 2009-09-24 15:51 你假笨 閱讀(2023) | 評(píng)論 (0)編輯 收藏
          本文最先發(fā)布于http://www.lovestblog.cn,請(qǐng)轉(zhuǎn)載的該文者注明文章出處,謝謝合作。
         下面簡(jiǎn)單介紹幾種標(biāo)量函數(shù),也是常用的,我們可以通過類似select abs(-123);的語(yǔ)句來(lái)看到我們標(biāo)量函數(shù)的效果。
          abs:該函數(shù)返回一個(gè)數(shù)值表達(dá)式的絕對(duì)值。如abs(-123);

         adddate:該函數(shù)將一個(gè)時(shí)間間隔(參數(shù)2)添加到時(shí)戳或時(shí)戳表達(dá)式(參數(shù)1)中,與此函數(shù)同功能的還有date_add。如adddate('2009-01-01',4);結(jié)果為2009-01-05。adddate(2009-01-01,interval 5 month);結(jié)果為2009-06-01。adddate(timestamp('2009-01-01'),interval 5 month);結(jié)果為2009-06-01 00:00:00。adddate('2009-01-01 12:00:00',interval 5 day);結(jié)果為2009-01-06 12:00:00。

          addtime:把兩個(gè)時(shí)間表達(dá)式加起來(lái)。如addtime('100:00:00','200:02:04');結(jié)果為300:02:04。

          ascii:該函數(shù)返回一個(gè)字符串表達(dá)式的第一個(gè)字符的ASCII值。

          bin:該函數(shù)將參數(shù)的數(shù)值轉(zhuǎn)換為二進(jìn)制值。

          bit_count:該函數(shù)顯示表示參數(shù)的值的位數(shù)。如bit_count(3)結(jié)果為2。

          bit_length:該函數(shù)返回字符串值的位長(zhǎng)度。如bit_length(bin(2));結(jié)果為16

          ceiling:該函數(shù)返回大于或等于參數(shù)值的最大整數(shù)。如ceiling(11.11);->12。ceicling(-11.11);->-11

          char:該函數(shù)返回?cái)?shù)值參數(shù)的字符串字符,與此函數(shù)同功能的還有chr函數(shù)。如char(82)+char(105)+char(99)+char(107);->'Rich'

          character_length:該函數(shù)返回一個(gè)字符串表達(dá)式的長(zhǎng)度,此方法同功能的還有char_length函數(shù)。

          charset:該函數(shù)返回字符串參數(shù)的字符集的名稱。

          coalesce:該函數(shù)接受多個(gè)參數(shù),返回第一個(gè)非null值的參數(shù)的值。如coalesce(null,null,'ljp');->'ljp';

          concat:該函數(shù)合并兩個(gè)字符串的值。

          conv:該函數(shù)將一基數(shù)為參數(shù)2的值(參數(shù)1)轉(zhuǎn)換為另一個(gè)以參數(shù)3為基數(shù)的值。如conv(1110,10,16)表示將以10進(jìn)制的數(shù)1110轉(zhuǎn)換成16進(jìn)制值為456。后面兩個(gè)參數(shù)必須介于2~36之間,否則結(jié)果為null,此外參數(shù)1的值應(yīng)該匹配參數(shù)2的基數(shù),否則結(jié)果為0。

          convert:該函數(shù)轉(zhuǎn)換參數(shù)1的數(shù)據(jù)類型為參數(shù)2指定的類型。參數(shù)2必須是一種數(shù)據(jù)類型,包括binary,char,date,datetime,time,signed,signed integer,unsigned,unsigned integer,varchar。如convert('12.56',unsigned integer);->13。

          database:該函數(shù)顯示當(dāng)前數(shù)據(jù)庫(kù)的名稱。

          date:該函數(shù)將參數(shù)變換為一個(gè)日期值。如date('2009-01-01 12:00:00');->'2009-01-01'。

          datediff:該函數(shù)計(jì)算兩個(gè)日期或時(shí)間戳表達(dá)式間的天數(shù)。第一個(gè)參數(shù)減去第二個(gè)參數(shù)。

          date_sub:該函數(shù)從一個(gè)日期或時(shí)間戳表達(dá)式(參數(shù)一)中減去一個(gè)時(shí)間間隔(參數(shù)2),與才函數(shù)同功能的還有subdate函數(shù)。

          day:該函數(shù)從一個(gè)日期或時(shí)間戳表達(dá)式中返回月的天數(shù),結(jié)果總是介于1~31之間的整數(shù),與此函數(shù)同功能的還有dayofmonth。

          dayname:該函數(shù)從一個(gè)日期或時(shí)間戳表達(dá)式中返回一周中某天的名稱。

          dayofweek:該函數(shù)返回一個(gè)日期或時(shí)間戳表達(dá)式中返回某周的天數(shù)的序號(hào)。該結(jié)果總是介于1~7之間的整數(shù)。

          dayofyear:該函數(shù)返回一個(gè)日期或時(shí)間戳表達(dá)式中返回一年中某日的序號(hào)。

          default:該函數(shù)返回參數(shù)指定的某列的默認(rèn)值。

          floor:該函數(shù)返回小于或等于參數(shù)值的最小整數(shù),與ceiling相對(duì)。

          exp:該函數(shù)返回e的x次幕的結(jié)果。

          format:該函數(shù)將一個(gè)數(shù)值的格式設(shè)置為nn,nnn,nnn.nnn的格式。第二個(gè)參數(shù)表示小數(shù)點(diǎn)后的數(shù)字個(gè)數(shù)。

          greatest:該函數(shù)返回一系列參數(shù)中的最大值,和least相對(duì)。

          hex:如果參數(shù)為數(shù)字,那么就返回該數(shù)字的十六進(jìn)制表示;如果是字符串,那么將返回每個(gè)字符對(duì)應(yīng)的ASCII碼。

          if:如果第一個(gè)參數(shù)值為true,那么函數(shù)返回第二個(gè)參數(shù)的值,否則返回第三個(gè)參數(shù)的值。如if((1>2),"ljp","st");將返回st。

          ifnull:如果參數(shù)1的值為null,那么返回參數(shù)2的值,否則返回參數(shù)1的值。如ifnull(null,"ljp");返回"ljp"。

          insert:參數(shù)4的值放在參數(shù)1中由參數(shù)2指定的位置,參數(shù)3表示參數(shù)1中從參數(shù)2指定的位置開始接下來(lái)的幾個(gè)字符將被參數(shù)4取代。如insert('abcdefgh',4,3,'zzz');->'abczzzgh'。insert('abcdefgh',,4,2,'zzz');->'abczzzfgh'。insert('abcdefgh',4,0,'zzz');->'abczzzdefgh'。insert('abcdefgh',4,-1,'zzz');->'abczzz'。insert('abcdefgh',1,5,'zzz');->'zzzfgh'。

          instr:該函數(shù)返回參數(shù)1內(nèi)參數(shù)2的起始位置。如果為找到,則返回0。如instr('12345',4);->4。

          interval:該函數(shù)第一個(gè)參數(shù)指定要插入的值,接下來(lái)的參數(shù)組成一個(gè)升序序列,看第一個(gè)參數(shù)該插入哪個(gè)位置。該函數(shù)就是返回該位置。如interval(5,0,1,2,3,6,7);->4表示要把5放在第四個(gè)位置(此位置上值為3)之后。

          isnull:如果參數(shù)值為null,那么返回1,否則返回0。

          last_day:該函數(shù)返回參數(shù)指定的日期或時(shí)間戳表達(dá)式中月的最后一天,如last_day('2009-01-09');->'2009-01-31'。

          lcase:該函數(shù)將參數(shù)的值的所有大寫字母轉(zhuǎn)換為小寫字母,與lower同義,與ucase相對(duì)。

          left:該函數(shù)返回一個(gè)字符串值參數(shù)1的左側(cè)部分,該部分的長(zhǎng)度由第二個(gè)參數(shù)指定。如left("hello world",3);->'hel'。

          length:該函數(shù)返回一個(gè)字符串值的字節(jié)長(zhǎng)度。如length(null);->null。

          ln:該函數(shù)返回參數(shù)的自然對(duì)數(shù),與log同義。

          localtime:該函數(shù)返回系統(tǒng)日期和時(shí)間,localtimestamp與只同義。

          locate:該函數(shù)返回參數(shù)1在參數(shù)2內(nèi)的起點(diǎn)位置。如果參數(shù)1在參數(shù)2內(nèi)未出現(xiàn),則返回0。參數(shù)3表示開始搜索的位置。注意instr函數(shù)的區(qū)別,instr函數(shù)是返回參數(shù)1內(nèi)參數(shù)2的開始位置。

          log2:返回參數(shù)以2為底的對(duì)數(shù)。如log2(64);->6

          log10:返回參數(shù)以10為底的對(duì)數(shù)。

          lpad:參數(shù)3的值填充在參數(shù)1的左側(cè),直到該值的總長(zhǎng)度等于參數(shù)2的長(zhǎng)度。如果最大長(zhǎng)度小于參數(shù)1的長(zhǎng)度,則參數(shù)1在左側(cè)被截取。如lpad('data',6,'base');->'badata'。lpad('data',2,'base');->'da'。

          ltrim:該函數(shù)刪除出現(xiàn)在參數(shù)前的所有空白,rtrim表示刪除參數(shù)末尾的所以空白。

          makedate:參數(shù)2表示天數(shù),他們被添加到參數(shù)1中。如makedate(2009,10);->'2009-01-10'。

          maketime:三參數(shù)分別表示小時(shí),分鐘,秒鐘。其中分鐘和秒鐘必須在0~59之間,否則會(huì)返回null。

          mid:該函數(shù)提取參數(shù)1中的部分字符串值,參數(shù)2標(biāo)識(shí)開始位置,參數(shù)3標(biāo)識(shí)字符數(shù)。如mid('database',5);->'base'。mid('database',5,2);->'ba'。mid('database',-6);-> 'tabase'。mid('database',-6,3);->'tab'。

          minute:該函數(shù)從一個(gè)時(shí)間或時(shí)間戳表達(dá)式中返回分鐘數(shù)。

          mod:該函數(shù)返回兩參數(shù)相除的余數(shù)。如mod(15.4,4,4);->2.2

          month:返回時(shí)間戳中的月份數(shù),值介于1~12之間。

          monthname:該函數(shù)從一個(gè)日期或時(shí)間戳表達(dá)式中返回月的名稱。如monthname('2009-01-01');->‘April’。

          now:返回系統(tǒng)日期和時(shí)間。

          nullif:如果參數(shù)1的值等于參數(shù)2的值,那么函數(shù)返回null。否則返回參數(shù)1的值。

          oct:該函數(shù)返回八進(jìn)制參數(shù)1的十進(jìn)制數(shù)。如oct(8);->10

          ord:該函數(shù)返回參數(shù)指定的字符串表達(dá)式的第一個(gè)字符的字符集位置。如ord('Das');->68。

          period_add:該函數(shù)將月數(shù)添加到一個(gè)指定的日期,日期格式必須為YYYYMM或YYMM。結(jié)果格式為YYYYMM。如period_add('200901',3);->200904。

           period_diff:該函數(shù)返回兩個(gè)日期間的月數(shù)。如period_diff('200908','200901');->7

           PI:返回圓周率。

           power:返回參數(shù)1的參數(shù)2次冪。

           quarter:該函數(shù)從一個(gè)日期或時(shí)間戳表達(dá)式中返回季度值。結(jié)果的值總是介于1~4之間。不過和我們?nèi)粘I钪械募径炔煌?~3月為1,4~6月為2,7~9月為3,10~12月為4。

           rand:該函數(shù)返回0.0和1.0之間的一個(gè)隨機(jī)數(shù)。參數(shù)表示下一個(gè)隨機(jī)值的計(jì)算起點(diǎn)。使用相同的參數(shù)值重復(fù)調(diào)用該函數(shù),結(jié)果總是相同的。如cast(rand()*1000 as unsigned integer);

           repeat:該函數(shù)將參數(shù)1的值重復(fù)參數(shù)2給定的次數(shù)。

           replace:該函數(shù)使參數(shù)1指定的字符串中由參數(shù)2指定的值替換為參數(shù)3指定的值。如replace('data','a','e');->'dete'。

           reverse:該函數(shù)顛倒一個(gè)字符串值中的字符的順序。

           right:該函數(shù)返回參數(shù)1的右側(cè)部分。該部分長(zhǎng)度由第二個(gè)參數(shù)指定。

           round:該函數(shù)將一個(gè)數(shù)字的精度舍入到指定的位數(shù)。如round(123.4,-1);->100;round(183.4,-2);->200。

           rpad:將參數(shù)3的值填充到參數(shù)1的右側(cè),知道值的總長(zhǎng)度等于參數(shù)2指定的長(zhǎng)度,與lpad相對(duì)。rpad('data',2,'base')->'da'。

           second:該函數(shù)返回一個(gè)時(shí)間或時(shí)間戳表達(dá)式中的秒數(shù)。

           sec_to_time:該函數(shù)將秒數(shù)變換為時(shí)間。如sec_to_time((24*60*60)-1);->23:59:59

           sign:該函數(shù)返回一個(gè)數(shù)值的字符。sign(50);->1;sign(0)->0;sign(-50)->-1;

           space:該函數(shù)生成一個(gè)空格行,空格個(gè)數(shù)為參數(shù)指定的值。

           sqrt:返回參數(shù)的平方根值。

           strcmp:該函數(shù)比較兩個(gè)字符串表達(dá)式的值。如果參數(shù)值相等,那么結(jié)果為0,如果參數(shù)1的值較小,那么返回-1,否則結(jié)果為1。

           substring:該函數(shù)從參數(shù)1中減去部分字符串值,參數(shù)2給出起始點(diǎn),參數(shù)3給出子付數(shù)。如substring('database',5,2);->'ba'。

           substring_index:該函數(shù)查找參數(shù)2表示的值在參數(shù)1中的第參數(shù)3此出現(xiàn)。如果參數(shù)3為正表示從左側(cè)查找,返回從左側(cè)開始找到的該次出現(xiàn)。如果參數(shù)3為負(fù),則從右側(cè)開始查找。如substring_index('database','a',3);->'datab';substring_index('database','a',-3);->'tabase';substring_index('database','data',1);->'';substring_index('database','data',-1);->'base'  
       
           subtime:該函數(shù)對(duì)兩個(gè)時(shí)間表達(dá)式執(zhí)行相減操作并返回一個(gè)新時(shí)間,timediff與此函數(shù)功能相似。

           time:該函數(shù)返回一個(gè)時(shí)間或時(shí)間戳表達(dá)式的時(shí)間部分。如time('12:13');->12:13:00

           time_to_sec:該函數(shù)將時(shí)間變換為秒數(shù)。如time_to_sec('00:16:40');->1000

           timestampdiff:該函數(shù)計(jì)算兩個(gè)日期或時(shí)間戳表達(dá)式間的時(shí)間。參數(shù)1表示時(shí)間間隔單元,如day,month,year,quarter,week,hour,minute,second,frac_second,參數(shù)2和參數(shù)3形成兩個(gè)表達(dá)式。如timestampdiff(day,'2009-01-01','2009-01-04');->4.

           timestamp:該函數(shù)將參數(shù)1變換為一個(gè)時(shí)間戳,如果指定了參數(shù)2,則它應(yīng)該是一個(gè)時(shí)間表達(dá)式,且會(huì)被添加到參數(shù)1的值中。

           timestampadd:該函數(shù)將時(shí)間間隔添加到一個(gè)日期或時(shí)間戳表達(dá)式。參數(shù)1表示時(shí)間間隔的單元,參數(shù)2表示天數(shù)或月數(shù)等,參數(shù)3表示時(shí)間間隔添加到的表達(dá)式。如timestampadd(DAY,2,'2009-01-01');->'2009-01-03';timestampadd(MONTH,2,'2009-01-01');->"2009-03-01"。

           trim:該函數(shù)刪除參數(shù)1表示的字符串值中開始和最后的所有空格。

           truncate:該函數(shù)將數(shù)字截?cái)嗟街付ǖ男?shù)位數(shù),注意和round的區(qū)別,round是四舍五入,而truncate是截?cái)唷H鐃runcate(123.45,-1);->120。truncate(123.375,1);->123.3。

           unhex:與hex相對(duì),將十六進(jìn)制表示的參數(shù)轉(zhuǎn)換為相應(yīng)的字符。如unhex(hex('hello'))'->hello

           ucase:類似upper,都是將參數(shù)中的所有小寫字母轉(zhuǎn)換為大寫字母。

           week:該函數(shù)從一個(gè)日期或時(shí)間戳表達(dá)式中返回周數(shù),類似的函數(shù)還有weekofyear。結(jié)果介于1~53之間的一個(gè)整數(shù)。如week('2009-06-07');->23

           weekday:該函數(shù)返回一周中的天數(shù)。結(jié)果為介于0~6之間的數(shù)。0表示星期一。

           year:該函數(shù)從一個(gè)日期或時(shí)間戳表達(dá)式中返回年數(shù)。
           yearweek:如果指定參數(shù)1,則該函數(shù)從一個(gè)時(shí)間戳或日期表達(dá)式中返回格式為YYYYWW的年份及周數(shù)。周數(shù)的范圍為01~52之間。如yearweek('2009-07-06');->200927
    posted @ 2009-09-23 16:54 你假笨 閱讀(1476) | 評(píng)論 (1)編輯 收藏
            (為了方便java學(xué)習(xí)者使用OsWorkflow,特用flex設(shè)計(jì)了此設(shè)計(jì)器,歡迎大家下載使用。亦歡迎大家光臨我的個(gè)人博客http://www.lovestblog.cn)前兩天和一網(wǎng)友聊天的時(shí)候,他強(qiáng)烈建議我把這個(gè)工作流設(shè)計(jì)器好好完善下,本來(lái)學(xué)校項(xiàng)目的需求基本已經(jīng)滿足了,但是離完善實(shí)在差距太遠(yuǎn),于是花了兩天時(shí)間在原有基礎(chǔ)上進(jìn)行了下改進(jìn),現(xiàn)在得工作流設(shè)計(jì)器比以前的版本多了幾個(gè)功能:
    1. 導(dǎo)出文件請(qǐng)選擇文件-->>導(dǎo)出選項(xiàng),導(dǎo)出文件保存時(shí)請(qǐng)您務(wù)必加上xml的后綴
    2. 鼠標(biāo)移到直線上的時(shí)候,直線會(huì)初始化顯示為綠色,按住鼠標(biāo)不放,拖動(dòng)鼠標(biāo),將會(huì)在直線上出現(xiàn)一個(gè)拐點(diǎn),該拐點(diǎn)可以隨便拖動(dòng),雙擊拐點(diǎn)會(huì)自動(dòng)刪除該拐點(diǎn),也可用框選選中拐點(diǎn)進(jìn)行刪除,選中的拐點(diǎn),初始顏色為藍(lán)色,您可以自由設(shè)置,移開時(shí)直線會(huì)恢復(fù)為粉紅色
    3. 可用框選選中組件進(jìn)行刪除,如果為半透明狀態(tài),則表明為選中,您同時(shí)可以按住ctrl鍵,選中其他沒有被選中的組件,從而進(jìn)行進(jìn)行加選
    4. 如果您本選中了某組件,然后按住ctrl鍵再將其框選,則該組件會(huì)被取消選中
    5. 點(diǎn)擊鼠標(biāo)右鍵有備選菜單進(jìn)行操作
    6. 下面的Outline是臨時(shí)生成的xml文件,您可以在不導(dǎo)出文件的情況下查看現(xiàn)有的xml文件
    7. 選擇子元素步驟操作之后,只有當(dāng)鼠標(biāo)在開始節(jié)點(diǎn)或步驟節(jié)點(diǎn)下面的action列表中點(diǎn)擊時(shí)才會(huì)新增一個(gè)action操作
    8. 合并節(jié)點(diǎn)只能有一個(gè)無(wú)條件連接進(jìn)行連出,合分支節(jié)點(diǎn)只能連出無(wú)條件連接,且可多個(gè)

    9.根據(jù)導(dǎo)入的文件生成得流程圖不具備定位的功能,因?yàn)槲矣X得是多余的,只要它們之間的關(guān)系明確得話,那你再在界面上進(jìn)行拖拉成你喜歡得樣式就可以了,所以當(dāng)你導(dǎo)入文件的時(shí)候,看到的會(huì)是每個(gè)節(jié)點(diǎn)隨機(jī)選擇位置。

         以上是我在此版本中進(jìn)行的系統(tǒng)說(shuō)明,請(qǐng)見關(guān)于--》系統(tǒng)說(shuō)明。

    再您下載我附件的同時(shí),請(qǐng)先到http://get.adobe.com/cn/air/處下載AdobeAIRInstaller.exe文件進(jìn)行安裝,使您系統(tǒng)能進(jìn)行AIR文件的安裝,附件為AIR格式文件。
    /Files/nijiaben/OsWorkflow.rar
    posted @ 2009-09-05 18:28 你假笨 閱讀(1933) | 評(píng)論 (1)編輯 收藏
                歡迎大家提出意見,多余的話就不多說(shuō)了,花了10天的作品,辛苦啊由于有400多k,所以大家在看到下面效果前,先給大家?guī)讖埥貓D哈,如果感興趣再去搗鼓一下那東西呵。也歡迎各位到我個(gè)人博客上留言哈,http://www.lovestblog.cn



    這里好像不能插入flash,如果大家有興趣的話,可以去http://www.lovestblog.cn/articlePicture/84/84.1.swf體驗(yàn)下真實(shí)的效果。
    posted @ 2009-07-31 23:52 你假笨 閱讀(6759) | 評(píng)論 (44)編輯 收藏
            這個(gè)暑假本來(lái)打算去廣州一公司實(shí)習(xí)的,結(jié)果接到老師的一個(gè)項(xiàng)目,是關(guān)于工作流的,實(shí)現(xiàn)一個(gè)文件審批的流程,起初也不知道是怎么回事,老師也有些事情,就拋下一句話“去下載OSWorkflow的客戶端下來(lái)看看”,結(jié)果下載下來(lái)才知道是怎么回事,要求用Flex實(shí)現(xiàn)它,我的媽呀,這個(gè)可是一個(gè)不小的工程,還得我一個(gè)人完成,上面這個(gè)項(xiàng)目也批下來(lái)了,錢都撥下來(lái)了,不完成不行啊,巧合的是自己這個(gè)暑假又有一個(gè)培訓(xùn),根本沒什么時(shí)間去做呀,就在前幾天突然決定暫時(shí)放棄培訓(xùn),先把這個(gè)完成再說(shuō),在做的時(shí)候沒什么底,不知道自己能不能完成,因?yàn)楦杏X很多東西我都不會(huì)。不管怎樣還是要試一下不,我就喜歡嘗試下,往往在嘗試中能發(fā)現(xiàn)點(diǎn)什么,這不從19號(hào)開始就衣食住行都在學(xué)校實(shí)驗(yàn)室了,到今天界面上的功能基本實(shí)現(xiàn)了大部分了,至少能拖組件,然后在組件間能按照一定的要求進(jìn)行連接,比如說(shuō)從合并節(jié)點(diǎn)出來(lái)的只能是無(wú)條件連接到節(jié)點(diǎn)或這操作,每個(gè)操作最多只能有一個(gè)非條件連接,連線的終點(diǎn)只能是節(jié)點(diǎn)等等,我沒有研究過OsWorkflow的源碼,但是我從提供給我的客戶端以及生成的xml文件推斷出一些規(guī)則,于是經(jīng)過不久的思考就開始動(dòng)工了,慢慢的雛形也就出來(lái)了,當(dāng)中碰到了不少問題,當(dāng)然也慢慢解決了,等完成之后再把代碼優(yōu)化下,到時(shí)覺得可以的話,可以開源,上次我那博客http://www.lovestblog.cn本來(lái)也打算開源的,但是確實(shí)有點(diǎn)擔(dān)心,怕放上來(lái),被高人們唾罵,怕承受不了巨大的打擊,就還是先放放了,再者也沒時(shí)間去優(yōu)化代碼,所以等有時(shí)間了再整理下再拿出來(lái)挨批了,呵呵,好了說(shuō)了那么多廢話了,還是把這個(gè)工作流的一個(gè)截圖拿出來(lái)曬曬吧,等全部完成之后在拿出來(lái),希望能聽到大家寶貴的意見。
    posted @ 2009-07-24 23:30 你假笨 閱讀(2160) | 評(píng)論 (2)編輯 收藏
            本文最先發(fā)布于本人個(gè)人博客http://www.lovestblog.cn
            下面簡(jiǎn)單的說(shuō)說(shuō)歸并排序,所謂歸并排序就是說(shuō)把輸入數(shù)組分成兩組當(dāng)然也可以大于2組,一般我們是等量的分成2組,通過遞歸我們可以把長(zhǎng)度為n的數(shù)組分成n個(gè)數(shù)組,我們通過一定的關(guān)鍵字比較把兩兩結(jié)合成一個(gè)有序的數(shù)組,然后回溯到原數(shù)組大小的有序數(shù)組,具體的我就不多說(shuō)了,因?yàn)楸容^簡(jiǎn)單,到網(wǎng)上可以找些相關(guān)文章看看什么是歸并排序,歸并排序算法可以再O(nlogn)的時(shí)間內(nèi)對(duì)長(zhǎng)度為n的序列完成排序,至于合并兩個(gè)有序數(shù)組,假如這兩個(gè)數(shù)組的長(zhǎng)度分別為m和n,那么我們只需要O(n+m)的時(shí)間久可以完成對(duì)這兩個(gè)有序數(shù)組的合并,下面還是代碼說(shuō)明之:
    package org.rjb.Sort;
    /**
     * 歸并排序(升序排列)
     * 
    @author ljp
     *
     
    */

    public class MergeSort {
        
    /**
         * 對(duì)原始數(shù)組進(jìn)行平等劃分為兩個(gè)子數(shù)組
         * 
    @param nums
         
    */

        
    public static void sort(int[] nums){
            
    int n=nums.length;
            
    if(n<=1)
                
    return;
            
    int nums1[]=new int[n/2];
            
    int nums2[]=new int[n-n/2];
            
    for(int i=0,j=nums1.length;j<nums.length;i++,j++){
                
    if(i<nums1.length){
                    nums1[i]
    =nums[i];
                }

                nums2[i]
    =nums[j];
            }

            
    //遞歸對(duì)子數(shù)組進(jìn)行劃分
            sort(nums1);
            sort(nums2);
            
    //把子數(shù)組排序后的結(jié)果進(jìn)行合并
            merge(nums,nums1,nums2);
        }

        
    /**
         * 合并兩個(gè)有序的子數(shù)組為一個(gè)有序的數(shù)組
         * 
    @param nums 合并之后的數(shù)組
         * 
    @param num1 有序的子數(shù)組
         * 
    @param num2 有序的子數(shù)組
         
    */

        
    public static void merge(int[] nums,int num1[],int num2[]){
            
    int n1=num1.length-1;
            
    int n2=num2.length-1;
            
    int k=0;
            
    int k1=0,k2=0;
            
    while(k1<=n1||k2<=n2){
                
    int e=0;
                
    if(k1>n1){//如果第一個(gè)數(shù)組已經(jīng)全部比較完了,那么我們只要直接復(fù)制第二個(gè)數(shù)組的條目到合并數(shù)組中即可
                    e=num2[k2++];
                }
    else if(k2>n2){//如果第二個(gè)數(shù)組已經(jīng)全部比較完了,那么我們只要直接復(fù)制第一個(gè)數(shù)組的條目到合并數(shù)組中即可
                    e=num1[k1++];
                }
    else if(num1[k1]>num2[k2]){//把比較的兩個(gè)條目中關(guān)鍵值小的放到合并數(shù)組中
                    e=num2[k2++];
                }
    else{
                    e
    =num1[k1++];
                }

                nums[k
    ++]=e;
            }

        }

        
    /**
         * 主函數(shù)
         * 
    @param args
         
    */

        
    public static void main(String args[]){
            
    int[] nums={10,2,3,7,4,9,1};
            sort(nums);
            
    for(int i=0;i<nums.length;i++){
                System.out.print(nums[i]
    +" ");
            }
    System.out.println();
        }

    }

    posted @ 2009-05-29 16:55 你假笨 閱讀(1221) | 評(píng)論 (0)編輯 收藏
         摘要:        本文最先發(fā)布在我的個(gè)人博客http://www.lovestblog.cn         文字轉(zhuǎn)載自http://jaskell.blogbus.com/logs/3272503.html,代碼是自己寫的一個(gè)測(cè)試類。   &nbs...  閱讀全文
    posted @ 2009-05-28 22:14 你假笨 閱讀(1255) | 評(píng)論 (0)編輯 收藏
    僅列出標(biāo)題  下一頁(yè)
    主站蜘蛛池模板: 日韩免费无码一区二区三区| 亚洲网站在线免费观看| 中文毛片无遮挡高清免费| AAA日本高清在线播放免费观看| 日本高清色本免费现在观看| 亚洲色欲色欱wwW在线| 天天干在线免费视频| 综合自拍亚洲综合图不卡区| a级毛片免费网站| 国产精品免费视频网站| 亚洲日本香蕉视频观看视频| 国内精品免费在线观看| 久久久综合亚洲色一区二区三区| 免费网站看av片| 亚洲黄色三级视频| 69天堂人成无码麻豆免费视频| 久久狠狠爱亚洲综合影院| 最近最好的中文字幕2019免费 | 无码专区AAAAAA免费视频| 亚洲国产综合专区在线电影| 99久久免费观看| 亚洲六月丁香六月婷婷蜜芽| 日韩人妻一区二区三区免费| 亚洲成a人片在线观看中文app | 野花香在线视频免费观看大全| 亚洲爆乳精品无码一区二区三区 | 日韩精品极品视频在线观看免费| 亚洲影院在线观看| 四虎成年永久免费网站| 欧洲 亚洲 国产图片综合| 久草视频免费在线观看| 国产AV旡码专区亚洲AV苍井空| 国产精品免费视频网站| xxxxx做受大片视频免费| 亚洲av无码乱码国产精品| 四虎免费影院ww4164h| 亚洲久热无码av中文字幕| 亚洲国产综合久久天堂| 大地资源网高清在线观看免费 | 黄色网页免费观看| 亚洲AV永久无码精品一百度影院 |