??xml version="1.0" encoding="utf-8" standalone="yes"?>日韩国产一区,日韩和的一区二在线,青春草在线观看http://www.aygfsteel.com/Hafeyang/category/38768.html长于前端开发。乐意分享?/description>zh-cnMon, 25 Oct 2010 12:51:00 GMTMon, 25 Oct 2010 12:51:00 GMT60javassist:增强型的java反射工具,获取Ҏ(gu)参数?获取Ҏ(gu)参数标注?/title><link>http://www.aygfsteel.com/Hafeyang/archive/2010/10/25/using_powerful_java_reflect_tool_javassist_to_getParameterAnnotations_and_getParameterNames.html</link><dc:creator>阌?/dc:creator><author>阌?/author><pubDate>Mon, 25 Oct 2010 09:53:00 GMT</pubDate><guid>http://www.aygfsteel.com/Hafeyang/archive/2010/10/25/using_powerful_java_reflect_tool_javassist_to_getParameterAnnotations_and_getParameterNames.html</guid><wfw:comment>http://www.aygfsteel.com/Hafeyang/comments/336114.html</wfw:comment><comments>http://www.aygfsteel.com/Hafeyang/archive/2010/10/25/using_powerful_java_reflect_tool_javassist_to_getParameterAnnotations_and_getParameterNames.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Hafeyang/comments/commentRss/336114.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Hafeyang/services/trackbacks/336114.html</trackback:ping><description><![CDATA[<p>java的反是不能获取Ҏ(gu)的参数名的。比如:(x)<br /> <br /> </p> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #0000ff">public</span><span style="color: #000000"> String concatString(String <strong style="color: red">param1</strong>,String <strong style="color: red">param2</strong>){<br />         </span><span style="color: #0000ff">return</span><span style="color: #000000"> param1</span><span style="color: #000000">+</span><span style="color: #000000">param2;<br />     }</span></div> <br /> 惌?param1",?param2"q个参数名,貌似是不行的。借助W三方包<a target="_blank">javaassist</a>可以获得?br /> <br /> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080"> 1</span> <span style="color: #000000">    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> main(String[] args) {<br /> </span><span style="color: #008080"> 2</span> <span style="color: #000000">        Class clazz </span><span style="color: #000000">=</span><span style="color: #000000"> <br /> </span><span style="color: #008080"> 3</span> <span style="color: #000000">MyClass.</span><span style="color: #0000ff">class</span><span style="color: #000000">;<br /> </span><span style="color: #008080"> 4</span> <span style="color: #000000">        </span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br /> </span><span style="color: #008080"> 5</span> <span style="color: #000000">            ClassPool pool </span><span style="color: #000000">=</span><span style="color: #000000"> ClassPool.getDefault();  <br /> </span><span style="color: #008080"> 6</span> <span style="color: #000000">            CtClass cc </span><span style="color: #000000">=</span><span style="color: #000000"> pool.get(clazz.getName());  <br /> </span><span style="color: #008080"> 7</span> <span style="color: #000000">            CtMethod cm </span><span style="color: #000000">=</span><span style="color: #000000"> cc.getDeclaredMethod(</span><span style="color: #000000">"concatString</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> </span><span style="color: #008080"> 8</span> <span style="color: #000000">            <br /> </span><span style="color: #008080"> 9</span> <span style="color: #000000">            </span><span style="color: #008000">//</span><span style="color: #008000">使用javaassist的反方法获取方法的参数?/span><span style="color: #008000"><br /> </span><span style="color: #008080">10</span> <span style="color: #000000">            MethodInfo methodInfo </span><span style="color: #000000">=</span><span style="color: #000000"> cm.getMethodInfo();  <br /> </span><span style="color: #008080">11</span> <span style="color: #000000">            CodeAttribute codeAttribute </span><span style="color: #000000">=</span><span style="color: #000000"> methodInfo.getCodeAttribute();  <br /> </span><span style="color: #008080">12</span> <span style="color: #000000">            LocalVariableAttribute attr </span><span style="color: #000000">=</span><span style="color: #000000"> (LocalVariableAttribute) codeAttribute.getAttribute(LocalVariableAttribute.tag);  <br /> </span><span style="color: #008080">13</span> <span style="color: #000000">            </span><span style="color: #0000ff">if</span><span style="color: #000000"> (attr </span><span style="color: #000000">==</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">)  {<br /> </span><span style="color: #008080">14</span> <span style="color: #000000">                </span><span style="color: #008000">//</span><span style="color: #008000">exception</span><span style="color: #008000"><br /> </span><span style="color: #008080">15</span> <span style="color: #000000">            }<br /> </span><span style="color: #008080">16</span> <span style="color: #000000">            String[] paramNames </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #0000ff">new</span><span style="color: #000000"> String[cm.getParameterTypes().length];  <br /> </span><span style="color: #008080">17</span> <span style="color: #000000">            </span><span style="color: #0000ff">int</span><span style="color: #000000"> pos </span><span style="color: #000000">=</span><span style="color: #000000"> Modifier.isStatic(cm.getModifiers()) </span><span style="color: #000000">?</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000"> : </span><span style="color: #000000">1</span><span style="color: #000000">;  <br /> </span><span style="color: #008080">18</span> <span style="color: #000000">            </span><span style="color: #0000ff">for</span><span style="color: #000000"> (</span><span style="color: #0000ff">int</span><span style="color: #000000"> i </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">; i </span><span style="color: #000000"><</span><span style="color: #000000"> paramNames.length; i</span><span style="color: #000000">++</span><span style="color: #000000">)  <br /> </span><span style="color: #008080">19</span> <span style="color: #000000">                paramNames[i] </span><span style="color: #000000">=</span><span style="color: #000000"> attr.variableName(i </span><span style="color: #000000">+</span><span style="color: #000000"> pos);      <br /> </span><span style="color: #008080">20</span> <span style="color: #000000">            </span><span style="color: #008000">//</span><span style="color: #008000">paramNames卛_数名</span><span style="color: #008000"><br /> </span><span style="color: #008080">21</span> <span style="color: #000000">            </span><span style="color: #0000ff">for</span><span style="color: #000000"> (</span><span style="color: #0000ff">int</span><span style="color: #000000"> i </span><span style="color: #000000">=</span><span style="color: #000000"> </span><span style="color: #000000">0</span><span style="color: #000000">; i </span><span style="color: #000000"><</span><span style="color: #000000"> paramNames.length; i</span><span style="color: #000000">++</span><span style="color: #000000">) {<br /> </span><span style="color: #008080">22</span> <span style="color: #000000">                System.out.println(paramNames[i]);<br /> </span><span style="color: #008080">23</span> <span style="color: #000000">            }<br /> </span><span style="color: #008080">24</span> <span style="color: #000000">            <br /> </span><span style="color: #008080">25</span> <span style="color: #000000">        } </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (NotFoundException e) {<br /> </span><span style="color: #008080">26</span> <span style="color: #000000">            e.printStackTrace();<br /> </span><span style="color: #008080">27</span> <span style="color: #000000">        } <br /> </span><span style="color: #008080">28</span> <span style="color: #000000">    }</span></div> <br /> <br /> W一ơ用觉得这个东西蛮奇的。今天我在用反射获取标注值时Q发C用jdk本n的反貌g获取不到。我又想CjavassistQ他果然没让我失望?br /> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080"> 1</span> <span style="color: #000000">    </span><span style="color: #0000ff">public</span><span style="color: #000000"> String datefomat(@DateFormat(</span><span style="color: #000000">"</span><span style="color: #000000">yyyy-MM-dd HH</span><span style="color: #000000">"</span><span style="color: #000000">)Date date1){<br /> </span><span style="color: #008080"> 2</span> <span style="color: #000000">        </span><span style="color: #0000ff">return</span><span style="color: #000000"> date1.toString();<br /> </span><span style="color: #008080"> 3</span> <span style="color: #000000">    }<br /> </span><span style="color: #008080"> 4</span> <span style="color: #000000">    <br /> </span><span style="color: #008080"> 5</span> <span style="color: #000000">    </span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">static</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> main(String[] args) {<br /> </span><span style="color: #008080"> 6</span> <span style="color: #000000">        Class clazz </span><span style="color: #000000">=</span><span style="color: #000000">MyClass.</span><span style="color: #0000ff">class</span><span style="color: #000000">;<br /> </span><span style="color: #008080"> 7</span> <span style="color: #000000">        </span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br /> </span><span style="color: #008080"> 8</span> <span style="color: #000000">            </span><span style="color: #008000">//</span><span style="color: #008000">使用jdk原生的反方?/span><span style="color: #008000"><br /> </span><span style="color: #008080"> 9</span> <span style="color: #000000">            Method m </span><span style="color: #000000">=</span><span style="color: #000000"> clazz.getDeclaredMethod(</span><span style="color: #000000">"</span><span style="color: #000000">datefomat</span><span style="color: #000000">"</span><span style="color: #000000">, </span><span style="color: #0000ff">new</span><span style="color: #000000"> Class[]{Date.</span><span style="color: #0000ff">class</span><span style="color: #000000">});<br /> </span><span style="color: #008080">10</span> <span style="color: #000000">            Annotation[][] annotations </span><span style="color: #000000">=</span><span style="color: #000000"> m.getParameterAnnotations();<br /> </span><span style="color: #008080">11</span> <span style="color: #000000">            System.out.println(annotations[</span><span style="color: #000000">0</span><span style="color: #000000">]);<br /> </span><span style="color: #008080">12</span> <span style="color: #008000">//</span><span style="color: #008000">            Annotation anno = annotations[0][0]; </span><span style="color: #008000">//</span><span style="color: #008000"> index outof range  exception</span><span style="color: #008000"><br /> </span><span style="color: #008080">13</span> <span style="color: #000000">        } </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (SecurityException e) {<br /> </span><span style="color: #008080">14</span> <span style="color: #000000">            e.printStackTrace();<br /> </span><span style="color: #008080">15</span> <span style="color: #000000">        } </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (NoSuchMethodException e) {<br /> </span><span style="color: #008080">16</span> <span style="color: #000000">            e.printStackTrace();<br /> </span><span style="color: #008080">17</span> <span style="color: #000000">        }<br /> </span><span style="color: #008080">18</span> <span style="color: #000000">        <br /> </span><span style="color: #008080">19</span> <span style="color: #000000">        </span><span style="color: #0000ff">try</span><span style="color: #000000"> {<br /> </span><span style="color: #008080">20</span> <span style="color: #000000">            ClassPool pool </span><span style="color: #000000">=</span><span style="color: #000000"> ClassPool.getDefault();  <br /> </span><span style="color: #008080">21</span> <span style="color: #000000">            CtClass cc </span><span style="color: #000000">=</span><span style="color: #000000"> pool.get(clazz.getName());  <br /> </span><span style="color: #008080">22</span> <span style="color: #000000">            CtMethod cm </span><span style="color: #000000">=</span><span style="color: #000000"> cc.getDeclaredMethod(</span><span style="color: #000000">"</span><span style="color: #000000">datefomat</span><span style="color: #000000">"</span><span style="color: #000000">);<br /> </span><span style="color: #008080">23</span> <span style="color: #000000">            <br /> </span><span style="color: #008080">24</span> <span style="color: #000000">            </span><span style="color: #008000">//</span><span style="color: #008000">使用javassist的反方法可以获得参数标注?/span><span style="color: #008000"><br /> </span><span style="color: #008080">25</span> <span style="color: #000000">            Object[][] annotations </span><span style="color: #000000">=</span><span style="color: #000000"> cm.getParameterAnnotations();<br /> </span><span style="color: #008080">26</span> <span style="color: #000000">            DateFormat myAnno </span><span style="color: #000000">=</span><span style="color: #000000">(DateFormat) annotations[</span><span style="color: #000000">0</span><span style="color: #000000">][</span><span style="color: #000000">0</span><span style="color: #000000">];<br /> </span><span style="color: #008080">27</span> <span style="color: #000000">            System.out.println(myAnno.value());<br /> </span><span style="color: #008080">28</span> <span style="color: #000000">            <br /> </span><span style="color: #008080">29</span> <span style="color: #000000">            <br /> </span><span style="color: #008080">30</span> <span style="color: #000000">            <br /> </span><span style="color: #008080">31</span> <span style="color: #000000">            <br /> </span><span style="color: #008080">32</span> <span style="color: #000000">        } </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (NotFoundException e) {<br /> </span><span style="color: #008080">33</span> <span style="color: #000000">            e.printStackTrace();<br /> </span><span style="color: #008080">34</span> <span style="color: #000000">        } </span><span style="color: #0000ff">catch</span><span style="color: #000000"> (ClassNotFoundException e) {<br /> </span><span style="color: #008080">35</span> <span style="color: #000000">            e.printStackTrace();<br /> </span><span style="color: #008080">36</span> <span style="color: #000000">        }<br /> </span><span style="color: #008080">37</span> <span style="color: #000000">        <br /> </span><span style="color: #008080">38</span> <span style="color: #000000">        <br /> </span><span style="color: #008080">39</span> <span style="color: #000000">        <br /> </span><span style="color: #008080">40</span> <span style="color: #000000">    }</span></div> <br /> Annotation的定义:(x)<br /> <div style="border-bottom: #cccccc 1px solid; border-left: #cccccc 1px solid; padding-bottom: 4px; background-color: #eeeeee; padding-left: 4px; width: 98%; padding-right: 5px; font-size: 13px; word-break: break-all; border-top: #cccccc 1px solid; border-right: #cccccc 1px solid; padding-top: 4px"><span style="color: #008080"> 1</span> <span style="color: #0000ff">package</span><span style="color: #000000"> ;<br /> </span><span style="color: #008080"> 2</span> <span style="color: #000000"><br /> </span><span style="color: #008080"> 3</span> <span style="color: #0000ff">import</span><span style="color: #000000"> java.lang.annotation.ElementType;<br /> </span><span style="color: #008080"> 4</span> <span style="color: #0000ff">import</span><span style="color: #000000"> java.lang.annotation.Target;<br /> </span><span style="color: #008080"> 5</span> <span style="color: #000000"><br /> </span><span style="color: #008080"> 6</span> <span style="color: #000000">@Target(ElementType.PARAMETER)   <br /> </span><span style="color: #008080"> 7</span> <span style="color: #0000ff">public</span><span style="color: #000000"> @</span><span style="color: #0000ff">interface</span><span style="color: #000000"> DateFormat {<br /> </span><span style="color: #008080"> 8</span> <span style="color: #000000">    String value() </span><span style="color: #0000ff">default</span><span style="color: #000000"> </span><span style="color: #000000">"</span><span style="color: #000000">yyyy-MM-dd</span><span style="color: #000000">"</span><span style="color: #000000">;<br /> </span><span style="color: #008080"> 9</span> <span style="color: #000000">}<br /> </span><span style="color: #008080">10</span> </div> <br /> <br /> 问题是解决了。回头想惻I不知道ؓ(f)什么jdk提供的getParameterAnnotationsҎ(gu)׃?bug? I do not know) 我的jdk版本?.5.0_17-b04?br /> <img src ="http://www.aygfsteel.com/Hafeyang/aggbug/336114.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Hafeyang/" target="_blank">阌?/a> 2010-10-25 17:53 <a href="http://www.aygfsteel.com/Hafeyang/archive/2010/10/25/using_powerful_java_reflect_tool_javassist_to_getParameterAnnotations_and_getParameterNames.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>企业Ub/s应用pȝ采用怎样的javascript框架http://www.aygfsteel.com/Hafeyang/archive/2009/04/12/265142.html阌?/dc:creator>阌?/author>Sun, 12 Apr 2009 09:25:00 GMThttp://www.aygfsteel.com/Hafeyang/archive/2009/04/12/265142.htmlhttp://www.aygfsteel.com/Hafeyang/comments/265142.htmlhttp://www.aygfsteel.com/Hafeyang/archive/2009/04/12/265142.html#Feedback6http://www.aygfsteel.com/Hafeyang/comments/commentRss/265142.htmlhttp://www.aygfsteel.com/Hafeyang/services/trackbacks/265142.html在过ȝ很长的一D|_(d)我都从事b/s应用pȝ开发,我要做的事情是怎样做界面规范以保证UI风格l一Q同时保证开发的高效性。具体而言Q我要做的工作需要把css写好Q开发者做界面时能方便的写html和样式。可更多的经历我都花在javascript上?/p>

问题一Q要不要采用javascript框架Q?/p>

我刚到公司的时候,我们的技术架构师是不同意使用javascript 框架。理由很多,javascript 没有得到应有的重视是主要的原因,他一直强调我们做的是应用pȝ。所以他只在|上扑ֈ几个js攑֜目下面Q然后页面上很ؕQ要写一颗树(wi)展现真是ȝ(ch)又麻?ch)。而且大家的javascript水^都很一般,基本只是E微了解一炏V用的最多的q是数据校验Q写的方法还是document.form1.formname,document.add['id']之类的写法。这让我q个天天x界面的技术h?冒昧自称技术h员,其实只是在界面层上有点研I而已)真是抓狂。很讽刺的是Qؓ(f)了用一个小H口弹出错误信息Q把jqeury+ui搬出来。整个项目也只有q么一个地方用到jquery,d的时候jquery的h气正在攀升。我来了之后Q由于自p分小Q在技术上说不上话Q后来大家界面上开发的时候遇到这个那个问题解决不了的时候,大家慢慢的认识到了我的h(hun)倹{新的项目领D我负责界面规范这块,公司也想把这个项目做成一个品。经q很多次“力荐”,我终于说服了大家Q我们不能再"IE only" 了?/p>

我认Z用的理由Q?一Q我们要有兼容各U浏览器的能力,现在新的览器大战正在打响,来的浏览器市场q很难说。在cssq方?我借鉴了ext 的兼Ҏ(gu)想Q在body标签上加上class "IE IE6",q样我们不要使用hack dҎ(gu)览器了。对于javascript上,基本上只有IE和非IE的差别了。主的javascript框架都提供了很好的浏览器支持。二Q用javascript框架的目的是提高开发效率。这与主的javascript不谋而合。三Qweb应用正在飞速发展,界面层应用越来越复杂Qjavascript不在一个校验数据的脚本了,ajax的应用能很好的提升用户体验,有些场合使用ajaxQ用h作更加方ѝD个很单的例子Q很多的记录需要排序,虽然在数据上来看Q只要改变排序D解决问题Q但在界面上Q难道要用户d写排序|q样用户?x)觉得很难操作,而用上sortableQ这个问题不仅简单,而且操作h不知道清晰多。我们从传统的c/s走到b/s不仅是因为b/s 不需要安装,升Ҏ(gu)。还是因为b/sh更前的表现力?/p>

当然Q反对用javascript框架的理׃很尖锐。一Q开发h员的水^很难以掌握现有的javascript框架。二Q大家坚持认为,其实现在用的javascript的地方还不是很多。从需求上屈指可敎ͼtree,borderlayout,grid,calendar?/p>

Ҏ(gu)Q我提出的想法就是,大家如果觉得难以使用的话Q我在javascript框架上做一ơ封装,降低使用隑ֺ。第二个理由更好_(d)虽然现在使用的地方就那么几个Q那好,你能拿出更好的方案么。曾l架构师_(d)我们希望每一个界面控仉是单独的Q能单独使用。当然现在的Ljavascript 都是q样的。这P我就在大家仍用怀疑的眼光注视我的时候开始了javascript框架之旅?/p>

问题二:(x)用哪个javascript框架Q?/p>

q个问题不是在讨论或者争执哪个好哪个不好Q未免大家再又争执,我让他们自己找javascript框架Q甚臛_以把他们最熟?zhn)的拿出来使用。大伙都说没有时_(d)q样我也不担心有后话了?/p>

我把目前L的javascript分ؓ(f)三类?/p>

诸如Qprototype/jquery/mootoolsq样的javascript框架Q只能是javascript工具。他的优势就是扩展性强Q社区支持很好,其是jquery

W二cd是:(x)yui/ext/dojo/qooxdooq样的框架。他们是一套全pd的纯客户端的ui解决Ҏ(gu)Q用方便,能满x们的需要。缺Ҏ(gu)入口很高Q适用于做富客L(fng)。虽然我们现在的应用q是很多Q但是还没有到那个地步?

q有一cd是与服务器端技术结合的ajax框架Q他只能叫ajax框架,他基本只做数据交换。事实上只要做一个简单的servlet(j2ee)或者HttpHanlder(.Net)再在客户端加以封装,使用h也是很方便的。所以这cajax框架我认Z需要考虑?

在我看来Qƈ不是那个框架l对的好坏,而是什么样的框架能最好的满你的需求?

Z人阅历上来讲Q三cȝ多个框架我都知道一二。但是我最喜欢jquery,所以用了jquery了,他的好处是轻量U,扩展性强Q现有的插g以满需要。代码非常简介而且执行效率高。于是我找了一大堆jquery插g。再自己装城稍微简单的Ҏ(gu)。本着不重复发明轮子的原则。很多的界面问题都能解决了?

问题三:(x)真的是那样么Q?

时至2009,目完了Q到了需要再ơ封装城产品的时候,ȝ(ch)也就来了。我发现虽然jquery插g很多Q很全,但是׃是百花齐放,我就不想修改里面的代码。慢慢的使用发现很多插g不是很稳定,像jstree,jquery ui ׃先前用的版本比较低,D很有的bug自己写一些修正。现在回q头来看那时候做的东西,发现新的版本已经修复了这些功能。而换上新版本的jqueryQ变化还是蛮多,比如jquery.browser׃推荐使用了,怎么办?

来?

本文是在用jquery之后Q发现维护工作量也不的背景下写下来的。我不知道是不是我当初选择jquery是错误的。是不是应该选择ext 之类的有着更强表现能力Q更E_的框架么Q现在的代码q是不是那么理想。由于很多的历史原因Q大家还在用ecside Qjscalendar。用ecside是因为历史原因。用jscalendar是因为jqueryq没有一个日历控件能支持旉的。我一个h的精力有限,而且我很多的旉都在写项目代?说到底还是领g重视)。我担心我当时做的决定会(x)对将来造成负面影响?

冒昧发在首页上,真诚的希望大家提q看法Q在企业U应用系l上界面层应该怎样做,文中的有些观点如有不对的地方q请大家指教



]]>
Sql server 2000 jdbc 查询分页解决Ҏ(gu)http://www.aygfsteel.com/Hafeyang/archive/2009/04/03/263787.html阌?/dc:creator>阌?/author>Fri, 03 Apr 2009 08:55:00 GMThttp://www.aygfsteel.com/Hafeyang/archive/2009/04/03/263787.htmlhttp://www.aygfsteel.com/Hafeyang/comments/263787.htmlhttp://www.aygfsteel.com/Hafeyang/archive/2009/04/03/263787.html#Feedback0http://www.aygfsteel.com/Hafeyang/comments/commentRss/263787.htmlhttp://www.aygfsteel.com/Hafeyang/services/trackbacks/263787.html(今天看自qblog,发现上次更新已经?-20,坚持每周更新blog! )

之所以要把sql server 2000 jdbc 分页单独来说_(d)又两个地方还是值得一提,一者是sql server 2000要实现数据库分页是比较麻?ch)的事情。二者是jdbc查询出多个ResultSet 的取法?/p>

先在目的classpath中添加msbase.jar,mssqlserver.jar,msutil.jar 怎么来的׃多废话了。需要说的是我最先用的sql server 2005 jdbc驱动sqljdbc.jar攑ֈ目中,后来的程序是报错的。回头想惻I报错有理Qsql server 2005 已经支持rownum 分页了?/p>

先说说sql server 2000的分늚实现Q目前实现方法大概是那三U。我个hq是喜欢使用存储q程,原因是用非常方便,至于使用的存储过E,q里q是攑և来看看,估计大家用的都大同小异?/p>

IF NOT EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N'[dbo].[Pr_QueryByPage]') AND OBJECTPROPERTY(id,N'IsProcedure') = 1)
BEGIN
EXEC dbo.sp_executesql @statement = N'create     procedure   [dbo].[Pr_QueryByPage]   
@sqlstr   nvarchar(4000),   --查询sql  
@currentpage   int, --W页记录条数  
@pagesize   int --每页昄记录 
as   
set   nocount   on   
declare   @P1   int, --P1是游标的ID  
@rowcount   int   
exec   sp_cursoropen   @P1   output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount   output   
select   ceiling(1.0*@rowcount/@pagesize)   as TotalPage,@rowcount as [RowCount] 
set   @currentpage=(@currentpage-1)*@pagesize+1   
exec   sp_cursorfetch   @P1,16,@currentpage,@pagesize     
exec   sp_cursorclose   @P1   
set   nocount   off  ' 
END
GO

q个存储q程的实玎ͼ使用了三个系l存储过Esp_cursoropen ,sp_cursorfetch ,sp_cursorclose 从字面上的意思大概是他叫l果集用游标打开Q然后读取其中的@pageSize条记录,所以单从查询上来讲Q性能是不?qing)用select top 之类的实现?/p>

 

使用h非常Ҏ(gu)Qexec Pr_QueryByPage 'select * from yourtable',1,10  可以了ȝ(ch)的是他返回的是三张表。第一张表是查询的表,但是没有记录。第二个表一行两列,W一个列是总页敎ͼW二个列是总记录条数。第三张表才是需要的数据。这造成了取的时候有点小ȝ(ch)Q因Z前只知道Q在.net中可以直接fill(DataSet)Q然后DataSet里面可取DataTable。但是在jdbc里面我映像中ResultSet 只能容一张表。后来找了一些资料,原来PreparedStatement,CallableStatement,Statement都支持查询返回多个ResultSet Q好了,非常好?下面是我使用CallableStatemnt取到的结果集?/p>

 

CallableStatement cs = conn.prepareCall("exec Pr_QueryByPage 'select * from ckdmzd',1,10");
            ResultSet rs = null;
            /**
             * execute returns :
             *     true : returns ResultSet(s)
             *  false: returns rows affected
             */
            boolean hasResultSet = cs.execute();
            if(hasResultSet){
                /**
                 * skip the first ResultSet
                 */
                rs=cs.getResultSet();
                /**
                 * second ResultSet : pageCount & recordCount
                 */
                if(cs.getMoreResults()){
                    rs=cs.getResultSet();
                    while(rs.next()){
                        String pageCount=rs.getString(1);
                        String recordCount=rs.getString(2);
                    }
                }
                /**
                 * the thrid one is the paged result
                 */
                if(cs.getMoreResults()){
                    rs=cs.getResultSet();
                    while(rs.next()){
                        // do somthing with ResultSet
                    }
                }
            }

q样实C分页Q网上很多h试了,q个Ҏ(gu)的性能不及(qing)别的Ҏ(gu)Q这里我要指出的是,别的Ҏ(gu)是不能返回ȝ记录条数的。而要知道ȝ记录条数Q通常需要select count(*) from ( your sql) q两ơ查询叫h的时间未必会(x)?/p>

ȝ

使用上述Ҏ(gu)实现sql server 2000 jdbc 分页Q用方便,性能q说的过厅R我不知道sql server 2005 的查询性能是否又提升?/p>

]]>
վ֩ģ壺 ɽ| | ƽ| | ̫| ϳ| Ϫ| | ʲ| | û| ԭ| | | Դ| ϻ| | | | | | ͨ| ̽| Ȫ| | Ȫ| »Ȱ| ÷| | | | | ޻| | | | | | | | ض|