﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-坚持</title><link>http://www.blogjava.net/chenxiaojun/</link><description>期待自己好还要更好，不断突破的坚持态度</description><language>zh-cn</language><lastBuildDate>Sun, 05 Apr 2026 17:19:59 GMT</lastBuildDate><pubDate>Sun, 05 Apr 2026 17:19:59 GMT</pubDate><ttl>60</ttl><item><title>国际：十个习惯让你精通新的开发技术(CSDN)</title><link>http://www.blogjava.net/chenxiaojun/archive/2008/04/29/197291.html</link><dc:creator>啊啊</dc:creator><author>啊啊</author><pubDate>Tue, 29 Apr 2008 07:52:00 GMT</pubDate><guid>http://www.blogjava.net/chenxiaojun/archive/2008/04/29/197291.html</guid><wfw:comment>http://www.blogjava.net/chenxiaojun/comments/197291.html</wfw:comment><comments>http://www.blogjava.net/chenxiaojun/archive/2008/04/29/197291.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenxiaojun/comments/commentRss/197291.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenxiaojun/services/trackbacks/197291.html</trackback:ping><description><![CDATA[<p>这篇文章，是从我的《高效开发人员的五个特征》一文中抽出的一个观点。从我自身的事业和习惯中，我考虑了很多方式怎么样才能有效地学习。</p>
<p>1. 要看书。在成千上万的编程图书中，可能很大一部分根本毫无用处。但是仍然有很多图书对你的(编程)能力有很大的提升。我一直坚持，相比在网络上查找很多有用信息，在同类图书中查找要来得更容易更快捷。阅读技术图书可心更好地抓住核心内容。对于理论，架构和设计等方面来说，图书也一样很有帮助。只不过要找到高质量的、权威的信息，就不如网络上可供查找的范围广。</p>
<p>2. 读代码。这也是我很喜欢的一种方式。如果我并没有几年的专业编程工作经验，在学习之初我并不会去读很多复杂的代码。如果我要是早些开始学习，我将是一个比现在更好的程序员。但是，开始时我会从一些开源项目里，去学习那些源代码(当然，这些代码不能与我的工作有关，也不是我自己写的)。要从自己会使用到的，或者自己感兴趣的程序开始这项工作。我是从 Paint.net 这个网站里开始学习的，而且已经积累了很多关于 .NET 的编程技术。</p>
<p>读别人的代码可以为你提供更多不同的工作思路，这比你完全凭自己思考得到的工作方式要多。</p>
<p>3. 写代码。谨记，要写大量的代码。从根本上来讲，最好的学习方法就是实践。如果不写代码，你根本不能把(某种语言中)内在的东西学习透彻。学习之初，可以从一些技术指南和图书中照搬一些尽量简单的程序。当然，这种照搬是要自己完全手工输入，而不是复制和粘贴，这两种之间的效果差别是很大的。这种方法的主旨就在于，使知识内在化，并思考其用法，而不是盲目照抄。学习过程中，要时常查找新的 API 调用方法，这其实是简单的事情。</p>
<p>最重要的是，要写一个你自己的程序，不管它是一个简单的游戏，或者是一个参与开源项目的程序，还是一个公为你自己使用的简单插件。用不同的方式来写程序，尽量尝试使用新的技术，新的技巧，新的设计方式。一定要让现在的项目比以往的项目更好。想要成一个优秀的开发者，这一点是核心。</p>
<p>4. 与其他开发者交流。像 Apple，微软，Google 等大公司一样的新闻描述的一样，(与其他开发者交流)可以让你解决一些复杂的问题。虽然这并不能让你感觉到自己已经成一个团队或是社区的成员，但是这种方法可以让你接触到更多不同的想法。</p>
<p>不同类型的项目要求不同的设计方法，代码技术，开发流程和设计思想。如果你工作在一个小团队里，你不必与太多的人接触，只要在用户群会议中找到一些人(来讨论)即可。如果这样还不行的话，参与到在线论坛中与其他人讨论(这时你需要更努力地寻找高质量的讨论内容)。</p>
<p>6. 教会别人。相对于仅仅读代码之类的工作，教其他人学习可以让你更深入地学习某个技术，这种方法有着非凡的效果。教会别人某个技术，同样也会让你更专注于这种技术，并且可以比别人更深层次地理解它。同样你也会面对一些问题。</p>
<p>&#8220;如果你不能向一个六岁的儿童解析清楚一个概念，那么其实是你并没有完全理解它。&#8221;Albert Einstein说。</p>
<p>教学场景可以是无穷无尽的：与工作搭档一对一交流，休息碰面，非正式周会，学习茶会，教室，讨论发表会，等等。每周在相同理念开发者之间举办一次30分钟的非正式会议怎么样？每周，让几个人来就他们想要更深入了解话题，向大家传授这些技术知识，并且展开讨论。如果你知道你将要向团队成员们传授正学学习的知识，你是不是更想要了解这项技术的每个细节呢？</p>
<p>6. 收听网络电台。如果你有空闲的时间，可以订阅网络电台节目。我现在最喜欢的编程节目就是 .Net Rocks。这个节目还会做一些视频节目，叫做 dnrTV 。这样会让你即时捕捉到最新最好的技术。一个人是不能学习到所有知识的，而网络电台刚是一个学习了解广泛知识的途径。</p>
<p>7. 阅读博客。博客远远比阅读者要多，但是其中有一些却是极其优秀的。我这里不并不是要推荐博客，因为网络上已经有了足够多的博客。这是与真正在开发你所喜欢和使用的软件的开者联系的好方法。</p>
<p>8. 学习新的语言。即使你已经在 C(++,#) / JAVA 等语言上有很好的造诣，仍然有很多其他可以解决问题的编程语言。学习新的语言，是对你已有思维方式的挑战。这不仅仅是另一种语言，更是对思维的重新架构。的确，所有的语言最后都会被编译成汇编程序，但是这并不意味着高级语言毫无价值。</p>
<p>9. 学习不正确的方式。除了要学习应该怎么做，还要学习不应该怎么做。经常阅读 Dailywtf.com ，学习你并不知道的经验与教训。学习适当的面向对象设计方式，代码写作方式，和必须要写的代码等，是很好的方式，但是如果不细心的话也容易养成不良习惯。学习认识不正确的思路是负责项目开发至关重要的一环。</p>
<p>维基百科对很多觉的不正确方式有十分透彻的分类。</p>
<p>10. 要谦虚。</p>
<p>学习，意味着：<br />
用更好的知识代替不完美的知识<br />
增长你所不知道的知识</p>
<p>只有承认自己有所不足，才能有学习的动力。归根到底，就是谦虚，不对吗？如果你开始认为你已经掌握了所有需要的知识，那么你就危险了。真正的学习是如饥似渴地追逐知识并使其内在化，这需要很大的努力。我们都知道这一点，但是要必须时常不断地提醒自己。</p>
<img src ="http://www.blogjava.net/chenxiaojun/aggbug/197291.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenxiaojun/" target="_blank">啊啊</a> 2008-04-29 15:52 <a href="http://www.blogjava.net/chenxiaojun/archive/2008/04/29/197291.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>云计算到底指什么？</title><link>http://www.blogjava.net/chenxiaojun/archive/2008/04/29/197290.html</link><dc:creator>啊啊</dc:creator><author>啊啊</author><pubDate>Tue, 29 Apr 2008 07:49:00 GMT</pubDate><guid>http://www.blogjava.net/chenxiaojun/archive/2008/04/29/197290.html</guid><wfw:comment>http://www.blogjava.net/chenxiaojun/comments/197290.html</wfw:comment><comments>http://www.blogjava.net/chenxiaojun/archive/2008/04/29/197290.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenxiaojun/comments/commentRss/197290.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenxiaojun/services/trackbacks/197290.html</trackback:ping><description><![CDATA[云计算的基本原理是，通过使计算分布在大量的分布式计算机上，而非本地计算机或远程服务器中，企业数据中心的运行将更与互联网相似。这使得企业能够将资源切换到需要的应用上，根据需求访问计算机和存储系统。 在未来，只需要一台笔记本或者一个手机，就可以通过网络服务来实现我们需要的一切，甚至包括超级计算这样的任务。从这个角度而言，最终用户才是云计算的真正拥有者
<img src ="http://www.blogjava.net/chenxiaojun/aggbug/197290.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenxiaojun/" target="_blank">啊啊</a> 2008-04-29 15:49 <a href="http://www.blogjava.net/chenxiaojun/archive/2008/04/29/197290.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>精通语言不等于是一个好的软件开发人员(CSDN)</title><link>http://www.blogjava.net/chenxiaojun/archive/2008/04/29/197288.html</link><dc:creator>啊啊</dc:creator><author>啊啊</author><pubDate>Tue, 29 Apr 2008 07:48:00 GMT</pubDate><guid>http://www.blogjava.net/chenxiaojun/archive/2008/04/29/197288.html</guid><wfw:comment>http://www.blogjava.net/chenxiaojun/comments/197288.html</wfw:comment><comments>http://www.blogjava.net/chenxiaojun/archive/2008/04/29/197288.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenxiaojun/comments/commentRss/197288.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenxiaojun/services/trackbacks/197288.html</trackback:ping><description><![CDATA[<p>公司软件部人不多，但几年来也曾经招聘过很多程序员，一个重要的发现就是，仅仅精通技术并不能很好的为公司工作，尤其是一些在领悟业务逻辑思路不是很敏锐，缺乏社会经验的人(譬如应届毕业生或一天到晚扎在技术里的人)。</p>
<p>　　因为公司小，没有专门的系统分析人员，只能靠程序员作需求分析，在客户满天描述需求时，很多技术精悍的人根本无法领悟关键，反过来抱怨客户愚昧，描述不清。很多时候还没有公司根本不懂编程的，但有较好工作经验的业务员领悟来得快。</p>
<p>　　为什么一个个曾被自己认定什么都不懂的业务员都自己做老板了，而自己还几年如一日的扎在电脑前敲代码，现在知道原因了吗。</p>
<p>　　作为一个程序员，研究和熟悉语言固然很重要，但除非你以后想做编程教学或更高级的纯技术研究，千万不要一门心思只玩弄技术，而忽略社会经验积累和学习。再高深的编程技术也只是为日常生活和工作服务的，也只是一个开发工具而已.</p>
<p>　　所以很多刚入门软件行业的人员，都计较于自己熟悉什么语言，计较于那个语言更高级，并以此为豪。</p>
<p>　　其实这是愚昧的，系统分析员也许没有这些人更精通某项语言，但是为什么系统分析员拥有更高的收入，为什么很多在这些人看起来一无所知的业务员却作了自己的老板上司。头脑和思维很重要哦，一味心思追求学这个语言那个语言，其实有点像古时的穷酸秀才，没有用的，结果只有到处求职。</p>
<p>　　会哪种语言不重要，重要的是如何将客户的零散无序的需求，迅速消化理解成程序逻辑，然后用自己熟悉的语言将其实现。</p>
<p>　　也许小公司作软件开发的时候，编程实现过程可能工作期更长，技术疑难问题也会出现的更多，但我们依然不能把编程实现过程看作是软件开发的重心，要知道这个过程只是一个&#8220;体力劳动&#8221;过程，即使解决了很多技术难题，那也是技巧性&#8220;小聪明&#8221;，不要以为你解决了这些问题，写了这些代码，就是公司的主心骨干了，大错特错哦。希望我这样讲不要引起大家的不满。</p>
<p>　　其实我的意思很简单，软件开发绝不是一个用语言编写代码的过程，所以软件开发人员也不能是仅仅精通某项语言的高手。</p>
<p>　　语言只是一个软件开发人员工作的工具，熟悉所用的工具是必要的，但是成天拿着工具研究是没有用的。</p>
<p>　　有经验的老渔翁能打到很多鱼，难道仅仅是会撒网，仅仅是苦练撒网的结果吗??</p>
<img src ="http://www.blogjava.net/chenxiaojun/aggbug/197288.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenxiaojun/" target="_blank">啊啊</a> 2008-04-29 15:48 <a href="http://www.blogjava.net/chenxiaojun/archive/2008/04/29/197288.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>职业生涯中12个最致命的想法(转自CSDN)</title><link>http://www.blogjava.net/chenxiaojun/archive/2008/04/29/197287.html</link><dc:creator>啊啊</dc:creator><author>啊啊</author><pubDate>Tue, 29 Apr 2008 07:45:00 GMT</pubDate><guid>http://www.blogjava.net/chenxiaojun/archive/2008/04/29/197287.html</guid><wfw:comment>http://www.blogjava.net/chenxiaojun/comments/197287.html</wfw:comment><comments>http://www.blogjava.net/chenxiaojun/archive/2008/04/29/197287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenxiaojun/comments/commentRss/197287.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenxiaojun/services/trackbacks/197287.html</trackback:ping><description><![CDATA[1、总觉得自己不够好 <br />
　　这种人虽然聪明、有历练，但是一旦被提拔，反而毫无自信，觉得自己不胜任。此外，他没有往上爬的野心，总觉得自己的职位已经太高，或许低一两级可能还比较适合。<br />
　　这种自我破坏与自我限制的行为，有时候是无意识的。但是，身为企业中、高级主管，这种无意识的行为却会让企业付出很大的代价。<br />
　　2、非黑即白看世界<br />
　　这种人眼中的世界非黑即白。他们相信，一切事物都应该像有标准答案的考试一样，客观地评定优劣。他们总是觉得自己在捍卫信念、坚持原则。但是，这些原则，别人可能完全不以为意。结果，这种人总是孤军奋战，常打败仗。<br />
　　3、无止境地追求卓越<br />
　　这种人要求自己是英雄，也严格要求别人达到他的水准。在工作上，他们要求自己与部属&#8220;更多、更快、更好&#8221;。结果，部属被拖得精疲力竭，纷纷&#8220;跳船求生&#8221;，留下来的人则更累。结果离职率节节升高，造成企业的负担。<br />
　　这种人适合独立工作，如果当主管，必须雇用一位专门人员，当他对部属要求太多时，大胆不讳地提醒他。<br />
　　4、无条件地回避冲突<br />
　　这种人一般会不惜一切代价，避免冲突。其实，不同意见与冲突，反而可以激发活力与创造力。一位本来应当为部属据理力争的主管，为了回避冲突，可能被部属或其他部门看扁。为了维持和平，他们压抑感情，结果，他们严重缺乏面对冲突、解决冲突的能力。到最后，这种解决冲突的无能，蔓延到婚姻、亲子、手足与友谊关系。<br />
　　5、强横压制反对者<br />
　　他们言行强硬，毫不留情，就像一部推土机，凡阻挡去路者，一律铲平，因为横冲直撞，攻击性过强，不懂得绕道的技巧，结果可能伤害到自己的事业生涯。<br />
　　6、天生喜欢引人侧目<br />
　　这种人为了某种理想，奋斗不懈。在稳定的社会或企业中，他们总是很快表明立场，觉得妥协就是屈辱，如果没有人注意他，他们会变本加厉，直到有人注意为止。<br />
　　7、过度自信，急于成功<br />
　　这种人过度自信，急于成功。他们不切实际，找工作时，不是龙头企业则免谈，否则就自立门户。进入大企业工作，他们大多自告奋勇，要求负责超过自己能力的工作。结果任务未达成，仍不会停止挥棒，反而想用更高的功绩来弥补之前的承诺，结果成了常败将军。<br />
　　这种人大多是心理上缺乏肯定，必须找出心理根源，才能停止不断想挥棒的行为。除此之外，也必须强制自己&#8220;不作为，不行动&#8221;。<br />
　　8、被困难&#8220;绳捆索绑&#8221;<br />
　　他们是典型的悲观论者，喜欢杞人忧天。采取行动之前，他会想像一切负面的结果，感到焦虑不安。这种人担任主管，会遇事拖延，按兵不动。因为太在意羞愧感，甚至担心部属会出状况，让他难堪。<br />
　　这种人必须训练自己，在考虑任何事情时，必须控制心中的恐惧，让自己变得更有行动力。职场中最有效地生存法！<br />
　　9、疏于换位思考<br />
　　这种人完全不了解人性，很难了解恐惧、爱、愤怒、贪婪及怜悯等情绪。他们在通电话时，通常连招呼都不打，直接切入正题，缺乏将心比心的能力，他们想把情绪因素排除在决策过程之外。<br />
　　这种人必须为自己做一次&#8220;情绪稽查&#8221;，了解自己对哪些感觉较敏感；问朋友或同事，是否发现你忽略别人的感受，搜集自己行为模式的实际案例，重新演练整个情境，改变行为。<br />
　　10、不懂装懂<br />
　　工作中那种不懂装懂的人，喜欢说：&#8220;这些工作真无聊。&#8221;但他们内心的真正感觉是：&#8220;我做不好任何工作。&#8221;他们希望年纪轻轻就功成名就，但是他们又不喜欢学习、求助或征询意见，因为这样会被人以为他们&#8220;不胜任&#8221;，所以他们只好装懂。而且，他们要求完美却又严重拖延，导致工作严重瘫痪。<br />
　　11、管不住嘴巴<br />
　　有的人往往不知道，有些话题可以公开交谈，而有些内容是只能私下说。这些人通常都是好人，没有心机，但在讲究组织层级的企业，这种管不住嘴巴的人，只会断送事业生涯。<br />
　　他们必须随时为自己竖立警告标示，提醒自己什么可以说，什么不能说。什么样的MM最好找工作&#8230;&#8230;<br />
　　12、我的路到底对不对？<br />
　　这种人总是觉得自己失去了职业生涯的方向。&#8220;我走的路到底对不对？&#8221;他们总是这样怀疑。他们觉得自己的角色可有可无，跟不上别人，也没有归属感。
<img src ="http://www.blogjava.net/chenxiaojun/aggbug/197287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenxiaojun/" target="_blank">啊啊</a> 2008-04-29 15:45 <a href="http://www.blogjava.net/chenxiaojun/archive/2008/04/29/197287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Google台湾工程研究所所长：开发人员如何培养自己</title><link>http://www.blogjava.net/chenxiaojun/archive/2008/01/23/177253.html</link><dc:creator>啊啊</dc:creator><author>啊啊</author><pubDate>Wed, 23 Jan 2008 05:49:00 GMT</pubDate><guid>http://www.blogjava.net/chenxiaojun/archive/2008/01/23/177253.html</guid><wfw:comment>http://www.blogjava.net/chenxiaojun/comments/177253.html</wfw:comment><comments>http://www.blogjava.net/chenxiaojun/archive/2008/01/23/177253.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenxiaojun/comments/commentRss/177253.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenxiaojun/services/trackbacks/177253.html</trackback:ping><description><![CDATA[<p>要点：<br />
要培养国际化能力、源源不绝的创造力，以及具备说服优秀人才的领导力<br />
<br />
1.<font face="Arial">寻求组织培养国际化能力 </font><br />
培养国际化能力最快的方式，是寻求组织的协助。不论是与具备国际观能力的人组成团队，或者是进入国际级<nobr><strong class="kgb" onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u4F01_u4E1A";KeyGate_ads.ShowGgAds(this,"_u4F01_u4E1A",event)' style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; font-weight: normal; border-left-width: 0px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; cursor: hand; color: #0000ff; padding-top: 0px; border-right-width: 0px; text-decoration: underline" onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&amp;ai=BWmEqxtOWR_HGHpykjgLJz-DJDZaSryLGp7XcBMCNtwHAuAIQAxgDIK2F0A0oFDgAUJrTu4gDYJ250IGQBaAB1J7H_gOqAQoyMDAwMDM2MTI3sgENbmV3cy5jc2RuLm5ldMgBAdoBK2h0dHA6Ly9uZXdzLmNzZG4ubmV0L24vMjAwODAxMjMvMTEzMDE5Lmh0bWyoAwHoA8kC9QMABAAA&amp;num=3&amp;adurl=https://adwords.google.com/select/Login%3Fhl%3Dzh_CN%26sourceid%3Dawo%26subid%3Dcn-zh_cn-ha-aw%26utm_medium%3Dcpc%26utm_term%3D%25E5%2585%25AC%25E5%258F%25B8%25E5%25AE%25A3%25E4%25BC%25A0&amp;client=ca-pub-5186439242807756");GgKwClickStat("企业","http://adwords.google.cn","afc","2000036127");' onmouseout='isShowGg = false;InTextAds_GgLayer="_u4F01_u4E1A"'>企业</strong></nobr>或环境中历练，都远比自己累积容易。他以Google工程师为例，进入Google不需很久，就能很快拥有超过简立峰30年累积的国际经验。或者像无名小站被Yahoo收购后，无名开发团队很快就能学习到国际市场经验，比起靠自己累积容易很多。开发人员要培养自己的能力，简立峰建议：「要选一个有机会的环境去发展，而不是选一个你已经是第一名的环境。」 <br />
2.源源不绝的创造力<br />
有想象力，才能得到比别人更多信息。」而且不是那种偶而灵光乍现的创意，他认为必须是能够源源不绝的想象，然后逐一求证，找出其中其中可行的创意。 </p>
<p><font face="Arial">&nbsp;</font><font face="Arial">简立峰培养想象力的秘诀是每天花一些时间，回顾前一天所发生的事情。过程中，他会去想象前一天生活中的每一个情境，尝试站在别人的角度来看事情，就像是拍电影时，切换不同角度的摄影机看相同的场景。一方面让自己更周全，另一方面也有助于改正工程师往往只想到自己的缺点。 </font></p>
<p><font face="Arial">&nbsp;</font><font face="Arial">除了回顾，还可以进一步作预想的练习。例如要进行英文电话会议前，先想象对方的模样，要讨论的的议题等，真正开始开会时，就能很容易的使用英文对话。运用各种方法训练自己，培养不断想象的能力。 </font></p>
3.说服别人的能力<br />
：「有好的开始不难，最困难的是第二波的成长曲线。」
<p><font face="Arial">&nbsp;</font><font face="Arial">什么时候开发团队会面临这样的瓶颈？简立峰认为很快就会遇到，但是多数开发者都不知道。如果自己无法培养出说服人才的能力，他建议开发人员最好去直接加入具有说服力领导者的团队，才能有机会成功。 </font></p>
<p><font face="Arial">&nbsp;</font><font face="Arial">开发者具备了国际化能力、源源不绝的创造力，以及说服优秀人才的领导力之后，还不一定保证成功。如同所有成功者都会说的话，坚持到底才是最重要。但是简立峰解释能够成功的「坚持」，不是那种固执己见、消耗体力、毅力的坚持方式，也不是一味认定媳妇终会熬成婆的苦苦坚持，而是「期待自己好还要更好，不断突破的坚持态度。」</font></p>
<img src ="http://www.blogjava.net/chenxiaojun/aggbug/177253.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenxiaojun/" target="_blank">啊啊</a> 2008-01-23 13:49 <a href="http://www.blogjava.net/chenxiaojun/archive/2008/01/23/177253.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Google台湾工程研究所所长：开发人员如何培养自己</title><link>http://www.blogjava.net/chenxiaojun/archive/2008/01/23/177252.html</link><dc:creator>啊啊</dc:creator><author>啊啊</author><pubDate>Wed, 23 Jan 2008 05:49:00 GMT</pubDate><guid>http://www.blogjava.net/chenxiaojun/archive/2008/01/23/177252.html</guid><wfw:comment>http://www.blogjava.net/chenxiaojun/comments/177252.html</wfw:comment><comments>http://www.blogjava.net/chenxiaojun/archive/2008/01/23/177252.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenxiaojun/comments/commentRss/177252.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenxiaojun/services/trackbacks/177252.html</trackback:ping><description><![CDATA[<p>要点：<br />
要培养国际化能力、源源不绝的创造力，以及具备说服优秀人才的领导力<br />
<br />
1.<font face="Arial">寻求组织培养国际化能力 </font><br />
培养国际化能力最快的方式，是寻求组织的协助。不论是与具备国际观能力的人组成团队，或者是进入国际级<nobr><strong class="kgb" onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u4F01_u4E1A";KeyGate_ads.ShowGgAds(this,"_u4F01_u4E1A",event)' style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; font-weight: normal; border-left-width: 0px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; cursor: hand; color: #0000ff; padding-top: 0px; border-right-width: 0px; text-decoration: underline" onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&amp;ai=BWmEqxtOWR_HGHpykjgLJz-DJDZaSryLGp7XcBMCNtwHAuAIQAxgDIK2F0A0oFDgAUJrTu4gDYJ250IGQBaAB1J7H_gOqAQoyMDAwMDM2MTI3sgENbmV3cy5jc2RuLm5ldMgBAdoBK2h0dHA6Ly9uZXdzLmNzZG4ubmV0L24vMjAwODAxMjMvMTEzMDE5Lmh0bWyoAwHoA8kC9QMABAAA&amp;num=3&amp;adurl=https://adwords.google.com/select/Login%3Fhl%3Dzh_CN%26sourceid%3Dawo%26subid%3Dcn-zh_cn-ha-aw%26utm_medium%3Dcpc%26utm_term%3D%25E5%2585%25AC%25E5%258F%25B8%25E5%25AE%25A3%25E4%25BC%25A0&amp;client=ca-pub-5186439242807756");GgKwClickStat("企业","http://adwords.google.cn","afc","2000036127");' onmouseout='isShowGg = false;InTextAds_GgLayer="_u4F01_u4E1A"'>企业</strong></nobr>或环境中历练，都远比自己累积容易。他以Google工程师为例，进入Google不需很久，就能很快拥有超过简立峰30年累积的国际经验。或者像无名小站被Yahoo收购后，无名开发团队很快就能学习到国际市场经验，比起靠自己累积容易很多。开发人员要培养自己的能力，简立峰建议：「要选一个有机会的环境去发展，而不是选一个你已经是第一名的环境。」 <br />
2.源源不绝的创造力<br />
有想象力，才能得到比别人更多信息。」而且不是那种偶而灵光乍现的创意，他认为必须是能够源源不绝的想象，然后逐一求证，找出其中其中可行的创意。 </p>
<p><font face="Arial">&nbsp;</font><font face="Arial">简立峰培养想象力的秘诀是每天花一些时间，回顾前一天所发生的事情。过程中，他会去想象前一天生活中的每一个情境，尝试站在别人的角度来看事情，就像是拍电影时，切换不同角度的摄影机看相同的场景。一方面让自己更周全，另一方面也有助于改正工程师往往只想到自己的缺点。 </font></p>
<p><font face="Arial">&nbsp;</font><font face="Arial">除了回顾，还可以进一步作预想的练习。例如要进行英文电话会议前，先想象对方的模样，要讨论的的议题等，真正开始开会时，就能很容易的使用英文对话。运用各种方法训练自己，培养不断想象的能力。 </font></p>
3.说服别人的能力<br />
：「有好的开始不难，最困难的是第二波的成长曲线。」
<p><font face="Arial">&nbsp;</font><font face="Arial">什么时候开发团队会面临这样的瓶颈？简立峰认为很快就会遇到，但是多数开发者都不知道。如果自己无法培养出说服人才的能力，他建议开发人员最好去直接加入具有说服力领导者的团队，才能有机会成功。 </font></p>
<p><font face="Arial">&nbsp;</font><font face="Arial">开发者具备了国际化能力、源源不绝的创造力，以及说服优秀人才的领导力之后，还不一定保证成功。如同所有成功者都会说的话，坚持到底才是最重要。但是简立峰解释能够成功的「坚持」，不是那种固执己见、消耗体力、毅力的坚持方式，也不是一味认定媳妇终会熬成婆的苦苦坚持，而是「期待自己好还要更好，不断突破的坚持态度。」</font></p>
<img src ="http://www.blogjava.net/chenxiaojun/aggbug/177252.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenxiaojun/" target="_blank">啊啊</a> 2008-01-23 13:49 <a href="http://www.blogjava.net/chenxiaojun/archive/2008/01/23/177252.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>2008年Java开发者最迫切的五个期望</title><link>http://www.blogjava.net/chenxiaojun/archive/2008/01/23/177249.html</link><dc:creator>啊啊</dc:creator><author>啊啊</author><pubDate>Wed, 23 Jan 2008 05:41:00 GMT</pubDate><guid>http://www.blogjava.net/chenxiaojun/archive/2008/01/23/177249.html</guid><wfw:comment>http://www.blogjava.net/chenxiaojun/comments/177249.html</wfw:comment><comments>http://www.blogjava.net/chenxiaojun/archive/2008/01/23/177249.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenxiaojun/comments/commentRss/177249.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenxiaojun/services/trackbacks/177249.html</trackback:ping><description><![CDATA[国际 不少人为自己是Java开发者中的一员而感到骄傲，新年伊始，大家一定对这个与自己息息相关的语言和平台有不少的期待。以下为2008年Java开发者五个最迫切的期待，可能其中有不合你意者，但相信大多数Java开发者会对此认同：
<p><font face="Arial"><strong>JavaFx不再只是空谈</strong></font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在2007年的JavaOne上，我们听到了一个救世主——JavaFx，不幸的是，当初的所有许诺却没有成为现实。希望2008它能成为一个真正的、简单的、可用选择，从而Java开发者不必在富交互技术领域无&#8220;本宗&#8221;技术可选。</font></p>
<p><font face="Arial"><strong>Glassfish成为应用服务器的选择</strong></font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Glassfish是一款非常好的开源应用服务器和平台，也是第一个遵从Java EE 5标准的，它强大而有效。然而在<nobr><strong class="kgb" onmouseover='isShowAds = false;isShowAds2 = false;isShowGg = true;InTextAds_GgLayer="_u4F01_u4E1A";KeyGate_ads.ShowGgAds(this,"_u4F01_u4E1A",event)' style="border-top-width: 0px; padding-right: 0px; padding-left: 0px; font-weight: normal; border-left-width: 0px; border-bottom-width: 0px; padding-bottom: 0px; margin: 0px; cursor: hand; color: #0000ff; padding-top: 0px; border-right-width: 0px; text-decoration: underline" onclick='javascript:window.open("http://pagead2.googlesyndication.com/pagead/iclk?sa=l&amp;ai=BTa_m19KWR4O0NpnQwwHK6bXmB5aSryKKp7XcBMCNtwHAuAIQBBgEIK2F0A0oFDgAUJrTu4gDYJ250IGQBaAB1J7H_gOqAQoyMDAwMDM2MTI3sgENbmV3cy5jc2RuLm5ldMgBAdoBK2h0dHA6Ly9uZXdzLmNzZG4ubmV0L24vMjAwODAxMDcvMTEyNDk2Lmh0bWyoAwHoA8kC9QMABAAA&amp;num=4&amp;adurl=https://adwords.google.com/select/Login%3Fhl%3Dzh_CN%26sourceid%3Dawo%26subid%3Dcn-zh_cn-ha-aw%26utm_medium%3Dcpc%26utm_term%3D%25E5%2585%25AC%25E5%258F%25B8%25E5%25AE%25A3%25E4%25BC%25A0&amp;client=ca-pub-5186439242807756");GgKwClickStat("企业","http://adwords.google.cn","afc","2000036127");' onmouseout='isShowGg = false;InTextAds_GgLayer="_u4F01_u4E1A"'>企业</strong></nobr>端它还不被熟知，许多企业主管甚至从未听说它。即使Java开发者，很多也从未下载使用过，甚至部分人还没有用就在印象中觉得它不够正规。希望2008年开发者能够有效利用它。</font></p>
<p><font face="Arial"><strong>重量级/轻量级(Lightweight/Heavyweight)之争当停止</strong></font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于Java EE正不断吸取各种框架、工具、库等的优点，开发方法变得更加直接和简单，所以传统的所谓的重量级Java和轻量级之间的区别也越来越模糊。然而此间关于重量级和轻量级的争论仍未停止。</font></p>
<p><font face="Arial"><strong>Google青睐Java，希望Apple也能</strong></font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iPhone非常风靡而且许多iPhone应用正在开发，然而迄今Java仍然是iPhone的毒药，希望08年这一局面可以改观。Google已经通过它众多的Java API和服务帮助了全世界的Java开发者，这也再一次证明，强者用之则发扬广大。所以希望包括Apple在内的更多强者可以用Java。</font></p>
<p><font face="Arial"><strong>弃糟粕、大统一</strong></font></p>
<p><font face="Arial">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 凭借Java的枝繁叶茂，再复杂的任务Java都可以提供很好的解决，然而它也因为自身分支和技术的太过丰富而使开发者迷乱。Java开发者花费了几年时间去弄清楚一大堆商业和开源框架、工具、库&#8230;&#8230;希望在2008年，其中的一些可以被废弃。虽然专政（指Java统一）是有害的，但一个统一的领土有更多的优势。</font></p>
<img src ="http://www.blogjava.net/chenxiaojun/aggbug/177249.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenxiaojun/" target="_blank">啊啊</a> 2008-01-23 13:41 <a href="http://www.blogjava.net/chenxiaojun/archive/2008/01/23/177249.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>几个eclipse插件介绍</title><link>http://www.blogjava.net/chenxiaojun/archive/2008/01/17/175987.html</link><dc:creator>啊啊</dc:creator><author>啊啊</author><pubDate>Thu, 17 Jan 2008 08:26:00 GMT</pubDate><guid>http://www.blogjava.net/chenxiaojun/archive/2008/01/17/175987.html</guid><wfw:comment>http://www.blogjava.net/chenxiaojun/comments/175987.html</wfw:comment><comments>http://www.blogjava.net/chenxiaojun/archive/2008/01/17/175987.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenxiaojun/comments/commentRss/175987.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenxiaojun/services/trackbacks/175987.html</trackback:ping><description><![CDATA[jadclipse : 反编译工具<br />
&nbsp; 具体的配置和下载地址：<a href="http://blog.csdn.net/xzknet/archive/2007/12/15/1937735.aspx">http://blog.csdn.net/xzknet/archive/2007/12/15/1937735.aspx</a><br />
JSEclipse&nbsp;&nbsp;&nbsp;&nbsp;:<br />
WTP&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<br />
ATF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :<br />
Lomboz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ：
<img src ="http://www.blogjava.net/chenxiaojun/aggbug/175987.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenxiaojun/" target="_blank">啊啊</a> 2008-01-17 16:26 <a href="http://www.blogjava.net/chenxiaojun/archive/2008/01/17/175987.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java杂谈（十一）??ORM</title><link>http://www.blogjava.net/chenxiaojun/archive/2008/01/16/175615.html</link><dc:creator>啊啊</dc:creator><author>啊啊</author><pubDate>Wed, 16 Jan 2008 02:24:00 GMT</pubDate><guid>http://www.blogjava.net/chenxiaojun/archive/2008/01/16/175615.html</guid><wfw:comment>http://www.blogjava.net/chenxiaojun/comments/175615.html</wfw:comment><comments>http://www.blogjava.net/chenxiaojun/archive/2008/01/16/175615.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenxiaojun/comments/commentRss/175615.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenxiaojun/services/trackbacks/175615.html</trackback:ping><description><![CDATA[这是最后一篇Java杂谈了，以ORM框架的谈论收尾，也算是把J2ee的最后一方面给涵盖到了，之所以这么晚才总结出ORM这方面，一是笔者这两周比较忙，另一方面也想善始善终，仔细的先自己好好研究一下ORM框架技术，不想草率的敷衍了事。&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;其实J2ee的规范指南里面就已经包括了一些对象持久化技术，例如JDO（Java&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object）就是Java对象持久化的新规范，一个用于存取某种数据仓库中的对象的标准化API，提供了透明的对象存储，对开发人员来说，存储数据对象完全不需要额外的代码（如JDBC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;API的使用）。这些繁琐的工作已经转移到JDO产品提供商身上，使开发人员解脱出来，从而集中时间和精力在业务逻辑上。另外，JDO很灵活，因为它可以在任何数据底层上运行。JDBC只是面向关系数据库（RDBMS）JDO更通用，提供到任何数据底层的存储功能，比如关系数据库、文件、XML以及对象数据库（ODBMS）等等，使得应用可移植性更强。我们如果要理解对象持久化技术，首先要问自己一个问题：为什么传统的JDBC来持久化不再能满足大家的需求了呢？&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;笔者认为最好是能用JDBC真正编写过程序了才能真正体会ORM的好处，同样的道理，真正拿Servlet/Jsp做过项目了才能体会到Struts、&nbsp;Spring等框架的方便之处。很幸运的是笔者这两者都曾经经历过，用混乱的内嵌Java代码的Jsp加Servlet转发写过完整的Web项目，也用&nbsp;JDBC搭建过一个完整C/S项目的后台。所以现在接触到新框架才更能体会它们思想和实现的优越之处，回顾从前的代码，真是丑陋不堪啊。^_^&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;回到正题，我们来研究一下为什么要从JDBC发展到ORM。简单来说，传统的JDBC要花大量的重复代码在初始化数据库连接上，每次增删改查都要获得&nbsp;Connection对象，初始化Statement，执行得到ResultSet再封装成自己的List或者Object，这样造成了在每个数据访问方法中都含有大量冗余重复的代码，考虑到安全性的话，还要加上大量的事务控制和log记录。虽然我们学习了设计模式之后，可以自己定义Factory来帮助减少一部分重复的代码，但是仍然无法避免冗余的问题。其次，随着OO思想深入人心，连典型的过程化语言Perl等都冠冕堂皇的加上了OO的外壳，何况是&nbsp;Java中繁杂的数据库访问持久化技术呢？强调面向对象编程的结果就是找到一个桥梁，使得关系型数据库存储的数据能准确的映射到Java的对象上，然后针对Java对象来设计对象和方法，如果我们把数据库的Table当作Class，Record当作Instance的话，就可以完全用面向对象的思想来编写数据层的代码。于是乎，Object&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Relationship&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mapping的概念开始普遍受到重视，尽管很早很早就已经有人提出来了。&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;缺点我们已经大概清楚了，那么如何改进呢？对症下药，首先我们要解决的是如何从Data&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Schema准备完美的映射到Object&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Schema，另外要提供对数据库连接对象生命周期的管理，对事务不同粒度的控制和考虑到扩展性后提供对XML、Properties等可配置化的文件的支持。到目前为止，有很多框架和技术在尝试着这样做。例如似乎是封装管理得过了头的EJB、很早就出现目前已经不在开发和升级了的Apache&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OJB、首先支持Manual&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SQL的iBATIS，还有公认非常优秀的Hibernate等等。在分别介绍它们之前，我还想反复强调这些框架都在试图做什么：&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;毕竟Java&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object和数据库的每一条Record还是有很大的区别，就是类型上来说，DB是没有Boolean类型的。而Java也不得不用封装类（Integer、Double等）为了能映射上数据库中为null的情况，毕竟Primitive类型是没有null值的。还有一个比较明显的问题是，数据库有主键和外键，而Java中仍然只能通过基本类型来对应字段值而已，无法规定Unique等特征，更别提外键约束、事务控制和级联操作了。另外，通过Java&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object预设某Field值去取数据库记录，是否在这样的记录也是不能保证的。真的要设计到完全映射的话，Java的Static被所有对象共享的变量怎么办？在数据库中如何表现出来&#8230;&#8230;&nbsp;&nbsp;<br />
我们能看到大量的问题像一座座大山横在那些框架设计者们面前，他们并不是没有解决办法，而是从不同的角度去考虑，会得到很多不同的解决方案，问题是应该采取哪一种呢？甚至只有等到真正设计出来了投入生产使用了，才能印证出当初的设想是否真的能为项目开发带来更多的益处。笔者引用一份文档中提到一个健壮的持久化框架应该具有的特点：&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;robust&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;persistence&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layer&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;should&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;support----&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1.&nbsp;&nbsp;&nbsp;Several&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;types&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;persistence&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mechanism&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2.&nbsp;&nbsp;&nbsp;Full&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;encapsulation&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;persistence&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mechanism.&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.&nbsp;&nbsp;&nbsp;Multi-object&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;actions&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4.&nbsp;&nbsp;&nbsp;Transactions&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Control&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.&nbsp;&nbsp;&nbsp;Extensibility&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6.&nbsp;&nbsp;&nbsp;Object&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;identifiers&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;7.&nbsp;&nbsp;&nbsp;Cursors:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logical&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connection&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;persistence&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mechanism&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8.&nbsp;&nbsp;&nbsp;Proxies:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;commonly&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;used&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;when&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;results&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;are&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;be&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;displayed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9.&nbsp;&nbsp;&nbsp;Records:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;avoid&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;the&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;overhead&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;of&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;converting&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;database&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;records&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;objects&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;then&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;back&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;to&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;records&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;10.&nbsp;&nbsp;&nbsp;Multi&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;architecture&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;11.&nbsp;&nbsp;&nbsp;Various&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;database&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;version&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and/or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;vendors&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;12.&nbsp;&nbsp;&nbsp;Multiple&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;connections&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;13.&nbsp;&nbsp;&nbsp;Native&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;non-native&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;drivers&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;14.&nbsp;&nbsp;&nbsp;Structured&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;query&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;language&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;queries(SQL)&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;现在来简短的介绍一下笔者用过的一些持久化框架和技术，之所以前面强调那么多共通的知识，是希望大家不要盲从流行框架，一定要把握它的本质和卓越的思想好在哪里。&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1．&nbsp;&nbsp;&nbsp;Apache&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OJB&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OJB代表Apache&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Object&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Relational&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Bridge，是Apache开发的一个数据库持久型框架。它是基于J2ee规范指南下的持久型框架技术而设计开发的，例如实现了ODMG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.0规范的API，实现了JDO规范的API，&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;核心实现是Persistence&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Broker&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;API。OJB使用XML文件来实现映射并动态的在Metadata&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layer听过一个Meta-Object-Protocol(MOP)来改变底层数据的行为。更高级的特点包括对象缓存机制、锁管理机制、&nbsp;Virtual&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;代理、事务隔离性级别等等。举个OJB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mapping的简单例子ojb-repository.xml：&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;class-descriptor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class=&#8221;com.ant.Employee&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table=&#8221;EMPLOYEE&#8221;&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;field-descriptor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=&#8221;id&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column=&#8221;ID&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jdbc-type=&#8221;INTEGER&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;primarykey=&#8221;true&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;autoincrement=&#8221;true&#8221;/&gt;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;field-descriptor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=&#8221;name&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column=&#8221;NAME&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jdbc-type=&#8221;VARCHAR&#8221;/&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/class-descrptor&gt;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;class-descriptor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class=&#8221;com.ant.Executive&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table=&#8221;EXECUTIVE&#8221;&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;field-descriptor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=&#8221;id&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column=&#8221;ID&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jdbc-type=&#8221;INTEGER&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;primarykey=&#8221;true&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;autoincrement=&#8221;true&#8221;/&gt;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;field-descriptor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=&#8221;department&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column=&#8221;DEPARTMENT&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;jdbc-type=&#8221;VARCHAR&#8221;/&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;reference-descriptor&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=&#8221;super&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class-ref=&#8221;com.ant.Employee&#8221;&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;foreignkey&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;field-ref=&#8221;id&#8221;/&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/reference-descriptor&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/class-descrptor&gt;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2．&nbsp;&nbsp;&nbsp;iBATIS&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iBATIS最大的特点就是允许用户自己定义SQL来组配Bean的属性。因为它的SQL语句是直接写入XML文件中去的，所以可以最大程度上利用到&nbsp;SQL语法本身能控制的全部特性，同时也能允许你使用特定数据库服务器的额外特性，并不局限于类似SQL92这样的标准，它最大的缺点是不支持枚举类型的持久化，即把枚举类型的几个对象属性拼成与数据库一个字段例如VARCHAR对应的行为。这里也举一个Mapping文件的例子sqlMap.xml：&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;sqlMap&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;typeAlias&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type=&#8221;com.ant.Test&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alias=&#8221;test&#8221;/&gt;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;resultMap&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class=&#8221;test&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id=&#8221;result&#8221;&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;result&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property=&#8221;testId&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column=&#8221;TestId&#8221;/&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;result&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property=&#8221;name&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column=&#8221;Name&#8221;/&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;result&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;property=&#8221;date&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column=&#8221;Date&#8221;/&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/resultMap&gt;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;select&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id=&#8221;getTestById&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;resultMap=&#8221;result&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parameterClass=&#8221;int&#8221;&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;select&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Test&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TestId=#value#&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/select&gt;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;update&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id=&#8221;updateTest&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;parameterClass=&#8221;test&#8221;&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Update&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Tests&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;set&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Name=#name#,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Date=&#8221;date&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TestId=#testId#&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/update&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/sqlMap&gt;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3．&nbsp;&nbsp;&nbsp;Hibernate&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hibernate无疑是应用最广泛最受欢迎的持久型框架，它生成的SQL语句是非常优秀。虽然一度因为不能支持手工SQL而性能受到局限，但随着新一代&nbsp;Hibernate&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.x推出，很多缺点都被改进，Hibernate也因此变得更加通用而时尚。同样先看一个Mapping文件的例子customer.hbm.xml来有一个大概印象：&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;hibernate-mapping&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;class&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=&#8221;com.ant.Customer&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;table=&#8221;Customers&#8221;&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=&#8221;customerId&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column=&#8221;CustomerId&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;type=&#8221;int&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unsaved-value=&#8221;0&#8221;&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;generator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class=&#8221;sequence&#8221;&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;param&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=&#8221;sequence&#8221;&gt;&nbsp;&nbsp;&nbsp;Customers_CustomerId_Seq&nbsp;&nbsp;&nbsp;&lt;/param&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/generator&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/id&gt;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=&#8221;firstName&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column=&#8221;FirstName&#8221;/&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;property&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=&#8221;lastName&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column=&#8221;LastName&#8221;/&gt;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;set&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=&#8221;addresses&#8221;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;outer-join=&#8221;true&#8221;&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;key&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;column=&#8221;Customer&#8221;/&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;one-to-many&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;class=&#8221;com.ant.Address&#8221;/&gt;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/set&gt;&nbsp;&nbsp;<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#8230;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;/class&gt;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&lt;/hibernate-mapping&gt;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Hibernate有很多显著的特性，最突出的就是它有自己的查询语言叫做HQL，在HQL中select&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from的不是Table而是类名，一方面更加面向对象，另外一方面通过在hibernate.cfg.xml中配置Dialect为HQL可以使得整个后台与数据库脱离耦合，因为不管用那种数据库我都是基于HQL来查询，Hibernate框架负责帮我最终转换成特定数据库里的SQL语句。另外&nbsp;Hibernate在Object-Caching这方面也做得相当出色，它同时管理两个级别的缓存，当数据被第一次取出后，真正使用的时候对象被放在一级缓存管理，这个时候任何改动都会影响到数据库；而空闲时候会把对象放在二级缓存管理，虽然这个时候与数据库字段能对应上但未绑定在一起，改动不会影响到数据库的记录，主要目的是为了在重复读取的时候更快的拿到数据而不用再次请求连接对象。其实关于这种缓存的设计建议大家研究一下Oracle的存储机制（原理是相通的），Oracle牺牲了空间换来时间依赖于很健壮的缓存算法来保证最优的企业级数据库访问速率。&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;以上是一些Mapping的例子，真正在Java代码中使用多半是继承各个框架中默认的Dao实现类，然后可以通过Id来查找对象，或者通过&nbsp;Example来查找，更流行的是更具Criteria查找对象。Criteria是完全封装了SQL条件查询语法的一个工具类，任何一个查询条件都可以在Criteria中找到方法与之对应，这样可以在Java代码级别实现SQL的完全控制。另外，现在许多ORM框架的最新版本随着JDk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5.0加入Annotation特性都开始支持用XDoclet来自动根据Annotation来生成XML配置文件了。&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;笔者不可能详细的讲解每一个框架，也许更多的人在用Hibernate，笔者是从OJB开始接触ORM技术的，它很原始却更容易让人理解从JDBC到&nbsp;ORM的过渡。更多的细节是可以从官方文档和书籍中学到的，但我们应该更加看中它们设计思想的来源和闪光点，不是盲从它们的使用方法。 <br />
<img src ="http://www.blogjava.net/chenxiaojun/aggbug/175615.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenxiaojun/" target="_blank">啊啊</a> 2008-01-16 10:24 <a href="http://www.blogjava.net/chenxiaojun/archive/2008/01/16/175615.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java杂谈（十）－－Spring</title><link>http://www.blogjava.net/chenxiaojun/archive/2008/01/16/175614.html</link><dc:creator>啊啊</dc:creator><author>啊啊</author><pubDate>Wed, 16 Jan 2008 02:23:00 GMT</pubDate><guid>http://www.blogjava.net/chenxiaojun/archive/2008/01/16/175614.html</guid><wfw:comment>http://www.blogjava.net/chenxiaojun/comments/175614.html</wfw:comment><comments>http://www.blogjava.net/chenxiaojun/archive/2008/01/16/175614.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/chenxiaojun/comments/commentRss/175614.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/chenxiaojun/services/trackbacks/175614.html</trackback:ping><description><![CDATA[笔者最近比较忙，一边在实习一边在寻找明年毕业更好的工作，不过论坛里的朋友非常支持小弟继续写，今天是周末，泡上一杯咖啡，继续与大家分享J2ee部分的学习经验。今天的主题是目前很流行也很好的一个开源框架－Spring。&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;引用《Spring2.0技术手册》上的一段话：&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Spring的核心是个轻量级容器，它是实现IoC容器和非侵入性的框架，并提供AOP概念的实现方式；提供对持久层、事务的支持；提供MVC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Web框架的实现，并对于一些常用的企业服务API提供一致的模型封装，是一个全方位的应用程序框架，除此之外，对于现存的各种框架，Spring也提供了与它们相整合的方案。&nbsp;&nbsp;<br />
接下来笔者先谈谈自己的一些理解吧，Spring框架的发起者之前一本很著名的书名字大概是《J2ee&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Development&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;without&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EJB》，他提倡用轻量级的组件代替重量级的EJB。笔者还没有看完那本著作，只阅读了部分章节。其中有一点分析觉得是很有道理的：&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EJB里在服务器端有Web&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Container和EJB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Container，从前的观点是各层之间应该在物理上隔离，Web&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Container处理视图功能、在EJB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Container中处理业务逻辑功能、然后也是EBJ&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Container控制数据库持久化。这样的层次是很清晰，但是一个很严重的问题是Web&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Container和EJB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Container毕竟是两个不同的容器，它们之间要通信就得用的是RMI机制和JNDI服务，同样都在服务端，却物理上隔离，而且每次业务请求都要远程调用，有没有必要呢？看来并非隔离都是好的。&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;再看看轻量级和重量级的区别，笔者看过很多种说法，觉得最有道理的是轻量级代表是POJO&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IoC，重量级的代表是Container&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Factory。（EJB2.0是典型的重量级组件的技术）我们尽量使用轻量级的Pojo很好理解，意义就在于兼容性和可适应性，移植不需要改变原来的代码。而Ioc与Factory比起来，Ioc的优点是更大的灵活性，通过配置可以控制很多注入的细节，而Factory模式，行为是相对比较封闭固定的，生产一个对象就必须接受它全部的特点，不管是否需要。其实轻量级和重量级都是相对的概念，使用资源更少、运行负载更小的自然就算轻量。&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;话题扯远了，因为Spring框架带来了太多可以探讨的地方。比如它的非侵入性：指的是它提供的框架实现可以让程序员编程却感觉不到框架的存在，这样所写的代码并没有和框架绑定在一起，可以随时抽离出来，这也是Spring设计的目标。Spring是唯一可以做到真正的针对接口编程，处处都是接口，不依赖绑定任何实现类。同时，Spring还设计了自己的事务管理、对象管理和Model2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;的MVC框架，还封装了其他J2ee的服务在里面，在实现上基本都在使用依赖注入和AOP的思想。由此我们大概可以看到Spring是一个什么概念上的框架，代表了很多优秀思想，值得深入学习。笔者强调，学习并不是框架，而是框架代表的思想，就像我们当初学Struts一样&#8230;&#8230;&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1．Spring&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MVC&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;关于IoC和AOP笔者在上篇已经稍微解释过了，这里先通过Spring的MVC框架来给大家探讨一下Spring的特点吧。（毕竟大部分人已经很熟悉Struts了，对比一下吧）&nbsp;&nbsp;<br />
众所周知MVC的核心是控制器。类似Struts中的ActionServlet，Spring里面前端控制器叫做DispatcherServlet。里面充当Action的组件叫做Controller，返回的视图层对象叫做ModelAndView，提交和返回都可能要经过过滤的组件叫做&nbsp;Interceptor。&nbsp;&nbsp;<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;让我们看看一个从请求到返回的流程吧：&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(1)&nbsp;&nbsp;&nbsp;前台Jsp或Html通过点击submit，将数据装入了request域&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(2)&nbsp;&nbsp;&nbsp;请求被Interceptor拦截下来，执行preHandler()方法出前置判断&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(3)&nbsp;&nbsp;&nbsp;请求到达DispathcerServlet&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(4)&nbsp;&nbsp;&nbsp;DispathcerServlet通过Handler&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Mapping来决定每个reuqest应该转发给哪个后端控制器Controlle <br />
<script type="text/javascript"><!-- google_ad_client="pub-7390275636631344" ; google_ad_width="468;
google_ad_height" = 60; google_ad_format="468x60_as" ; google_ad_type="text_image" ;
// google_ad_channel="4212957139" ; google_color_border="336699" ; google_color_bg="FFFFFF" ; google_color_link="0000FF" ; google_color_url="008000" ; google_color_text="000000" ;
//--></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript">
</script><iframe name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-7390275636631344&amp;dt=1200449648377&amp;lmt=1200449648&amp;format=468x60_as&amp;output=html&amp;correlator=1200449648377&amp;url=http%3A%2F%2Fwww.javaresearch.org%2Ffaq%2Fthread.jsp%3Fthread%3D82524&amp;color_bg=FFFFFF&amp;color_text=000000&amp;color_link=0000FF&amp;color_url=008000&amp;color_border=336699&amp;ad_type=text_image&amp;ref=http%3A%2F%2Fwww.javaresearch.org%2F&amp;cc=469&amp;ga_vid=917340093.1196735460&amp;ga_sid=1200449465&amp;ga_hid=873313896&amp;ga_fc=true&amp;flash=9&amp;u_h=768&amp;u_w=1024&amp;u_ah=708&amp;u_aw=1024&amp;u_cd=32&amp;u_tz=480&amp;u_java=true" frameborder="0" width="468" scrolling="no" height="60" allowTransparency></iframe><br />
<img src ="http://www.blogjava.net/chenxiaojun/aggbug/175614.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/chenxiaojun/" target="_blank">啊啊</a> 2008-01-16 10:23 <a href="http://www.blogjava.net/chenxiaojun/archive/2008/01/16/175614.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>