﻿<?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-云下的天空-随笔分类-MyBatis</title><link>http://www.blogjava.net/liuwuping12064915/category/48784.html</link><description> 坚持  随心而动</description><language>zh-cn</language><lastBuildDate>Thu, 02 Jun 2011 14:07:13 GMT</lastBuildDate><pubDate>Thu, 02 Jun 2011 14:07:13 GMT</pubDate><ttl>60</ttl><item><title>MyBatis入门</title><link>http://www.blogjava.net/liuwuping12064915/archive/2011/06/02/351633.html</link><dc:creator>天空布蓝</dc:creator><author>天空布蓝</author><pubDate>Thu, 02 Jun 2011 14:05:00 GMT</pubDate><guid>http://www.blogjava.net/liuwuping12064915/archive/2011/06/02/351633.html</guid><wfw:comment>http://www.blogjava.net/liuwuping12064915/comments/351633.html</wfw:comment><comments>http://www.blogjava.net/liuwuping12064915/archive/2011/06/02/351633.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuwuping12064915/comments/commentRss/351633.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuwuping12064915/services/trackbacks/351633.html</trackback:ping><description><![CDATA[&nbsp; 今天开始学MyBatis 在网上看了一些简单的demo &nbsp;官方还提供了中文指南。。可以去下。。<br />&nbsp; 然后自己写了个简单的。。<br />&nbsp; 首先在mysql建名为mybatis的数据库 &nbsp; 在数据库中建一个user表 里面有2个字段 id &nbsp;name<br />&nbsp; <br />&nbsp; 下面是目录结构<br /><img src="http://www.blogjava.net/images/blogjava_net/liuwuping12064915/0.jpg" border="0" alt="" width="242" height="226" /><br /><br />&nbsp; <span style="color: red; ">Configuration.xml<br /></span>&nbsp; &nbsp; &nbsp;&lt;?xml version="1.0" encoding="UTF-8" ?&gt;<div><div>&lt;!DOCTYPE configuration PUBLIC&nbsp;</div><div>&nbsp; &nbsp; "-//mybatis.org//DTD Config 3.0//EN"</div><div>&nbsp; &nbsp; "http://mybatis.org/dtd/mybatis-3-config.dtd"&gt;</div><div></div><div>&lt;configuration&gt;</div><div>&nbsp; &nbsp; &lt;typeAliases&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &lt;typeAlias alias="User" type="User" /&gt;</div><div>&nbsp; &nbsp; &lt;/typeAliases&gt;</div><div></div><div>&nbsp; &nbsp; &lt;environments default="development"&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &lt;environment id="development"&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;transactionManager type="JDBC" /&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;dataSource type="POOLED"&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;property name="driver" value="com.mysql.jdbc.Driver" /&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;property name="url" value="jdbc:mysql://localhost:3306/mybatis" /&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;property name="username" value="root" /&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;property name="password" value="55" /&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &lt;/dataSource&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &lt;/environment&gt;</div><div>&nbsp; &nbsp; &lt;/environments&gt;</div><div>&nbsp; &nbsp; &lt;mappers&gt;</div><div>&nbsp; &nbsp; &nbsp; &nbsp; &lt;mapper resource="User.xml" /&gt;</div><div>&nbsp; &nbsp; &lt;/mappers&gt;</div><div>&lt;/configuration&gt;</div></div><br /><span style="color: red; ">User.xml</span><br /><br /><div><div>public class User {</div><div>&nbsp; &nbsp;private int id;</div><div>&nbsp; &nbsp;private String name;</div><div>&nbsp; &nbsp;</div><div>&nbsp; &nbsp;</div><div>public int getId() {</div><div><span style="white-space:pre">	</span>return id;</div><div>}</div><div>public void setId(int id) {</div><div><span style="white-space:pre">	</span>this.id = id;</div><div>}</div><div>public String getName() {</div><div><span style="white-space:pre">	</span>return name;</div><div>}</div><div>public void setName(String name) {</div><div><span style="white-space:pre">	</span>this.name = name;</div><div>}</div><div></div><div>@Override</div><div>public String toString() {</div><div><span style="white-space:pre">	</span>return "User [id=" + id + ", name=" + name + "]";</div><div>}</div><div>}<br /><br /><br /><span style="color: red; ">Test.java<br /></span><br /><div><div>import java.io.IOException;</div><div>import java.io.Reader;</div><div></div><div>import org.apache.ibatis.io.Resources;</div><div>import org.apache.ibatis.session.SqlSession;</div><div>import org.apache.ibatis.session.SqlSessionFactory;</div><div>import org.apache.ibatis.session.SqlSessionFactoryBuilder;</div><div></div><div></div><div></div><div>public class Test {</div><div></div><div><span style="white-space:pre">	</span>public static void main(String[] args) throws IOException {</div><div><span style="white-space:pre">		</span></div><div><span style="white-space:pre">		</span>String resource = "Configuration.xml";</div><div><span style="white-space:pre">		</span>Reader <span style="white-space:pre">	</span>reader = Resources.getResourceAsReader(resource);</div><div><span style="white-space:pre">		</span>SqlSessionFactory &nbsp;sqlMapper = new SqlSessionFactoryBuilder().build(reader);</div><div><span style="white-space:pre">		</span>SqlSession session = sqlMapper.openSession();</div><div><span style="white-space:pre">		</span>try {</div><div><span style="white-space:pre">			</span></div><div><span style="white-space:pre">			</span></div><div><span style="white-space:pre">			</span>User user = (User)session.selectOne("User.selectUser",2);</div><div><span style="white-space:pre">			</span>System.out.println("user name:"+user.getName());</div><div><span style="white-space:pre">			</span></div><div><span style="white-space:pre">		</span>} catch (Exception e) {</div><div><span style="white-space:pre">			</span>e.printStackTrace();</div><div><span style="white-space:pre">		</span>}finally{</div><div><span style="white-space:pre">			</span> session.close();</div><div><span style="white-space:pre">		</span>}</div><div><span style="white-space:pre">		</span></div><div><span style="white-space:pre">	</span>}</div><div><span style="white-space:pre">	</span></div><div>}</div></div></div></div><img src ="http://www.blogjava.net/liuwuping12064915/aggbug/351633.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwuping12064915/" target="_blank">天空布蓝</a> 2011-06-02 22:05 <a href="http://www.blogjava.net/liuwuping12064915/archive/2011/06/02/351633.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>POJO 与 PO的 概念</title><link>http://www.blogjava.net/liuwuping12064915/archive/2011/06/02/351621.html</link><dc:creator>天空布蓝</dc:creator><author>天空布蓝</author><pubDate>Thu, 02 Jun 2011 10:14:00 GMT</pubDate><guid>http://www.blogjava.net/liuwuping12064915/archive/2011/06/02/351621.html</guid><wfw:comment>http://www.blogjava.net/liuwuping12064915/comments/351621.html</wfw:comment><comments>http://www.blogjava.net/liuwuping12064915/archive/2011/06/02/351621.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/liuwuping12064915/comments/commentRss/351621.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/liuwuping12064915/services/trackbacks/351621.html</trackback:ping><description><![CDATA[<span class="Apple-style-span" style="font-family: Arial, sans-serif, Helvetica, Tahoma; "><table id="forum_main" cellspacing="1" style="width: 946px; background-color: #ffffff; border-top-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-left-width: 2px; border-top-color: #006699; border-right-color: #006699; border-bottom-color: #006699; border-left-color: #006699; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-collapse: separate; "><tbody id="posts"><tr id="741"><td class="postcontent" style="font-size: 1em; background-color: #efefef; vertical-align: top; width: 798px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div class="postbody clearfix" style="display: block; padding-top: 20px; padding-right: 0px; padding-bottom: 1px; padding-left: 0px; font-family: Tahoma; min-height: 120px; width: 790px; ">原文转载自：</div></td></tr></tbody></table></span><span class="Apple-style-span" style="font-family: Arial, sans-serif, Helvetica, Tahoma; "><table id="forum_main" cellspacing="1" style="width: 946px; background-color: #ffffff; border-top-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-left-width: 2px; border-top-color: #006699; border-right-color: #006699; border-bottom-color: #006699; border-left-color: #006699; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-collapse: separate; display: inline !important; "><tbody id="posts" style="display: inline !important; "><tr id="741" style="display: inline !important; "><td class="postcontent" style="font-size: 1em; background-color: #efefef; vertical-align: top; width: 798px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; display: inline !important; "><div class="postbody clearfix" style="display: inline !important; padding-top: 20px; padding-right: 0px; padding-bottom: 1px; padding-left: 0px; font-family: Tahoma; min-height: 120px; width: 790px; "><div style="display: inline !important; "><a href="http://www.iteye.com/topic/243">http://www.iteye.com/topic/243</a></div></div></td></tr></tbody></table></span><span class="Apple-style-span" style="font-family: Arial, sans-serif, Helvetica, Tahoma; "><table cellspacing="1" style="width: 946px; background-color: #ffffff; border-top-width: 2px; border-right-width: 2px; border-bottom-width: 2px; border-left-width: 2px; border-top-color: #006699; border-right-color: #006699; border-bottom-color: #006699; border-left-color: #006699; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-collapse: separate; "><tbody><tr><td class="postcontent" style="font-size: 1em; background-color: #efefef; vertical-align: top; width: 798px; padding-top: 5px; padding-right: 5px; padding-bottom: 5px; padding-left: 5px; "><div class="postbody clearfix" style="display: block; padding-top: 20px; padding-right: 0px; padding-bottom: 1px; padding-left: 0px; font-family: Tahoma; min-height: 120px; width: 790px; "><br /><span style="color: red; ">POJO = pure old java object or plain ordinary java object or what ever.</span>&nbsp;<br /><br /><span style="color: red; ">PO = persisent object 持久对象</span>&nbsp;<br /><br />就是说在一些Object/Relation Mapping工具中，能够做到维护数据库表记录的persisent object完全是一个符合Java Bean规范的纯Java对象，没有增加别的属性和方法。全都是这样子的：&nbsp;<br /><br /><br /><div class="dp-highlighter" id="" style="font-family: Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace; font-size: 12px; background-color: transparent; width: 765px; overflow-x: auto; overflow-y: auto; margin-left: 9px; padding-top: 1px; padding-right: 1px; padding-bottom: 1px; padding-left: 1px; word-break: break-all; word-wrap: break-word; "><div class="bar"><div class="tools" style="padding-top: 3px; padding-right: 3px; padding-bottom: 3px; padding-left: 3px; text-align: left; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: black; font-weight: bold; ">Java代码&nbsp;<embed src="http://www.iteye.com/javascripts/syntaxhighlighter/clipboard_new.swf" width="14" height="15" flashvars="clipboard=public%20class%20User%20%7B%20%0A%20%20private%20long%20id%3B%20%0A%20%20private%20String%20name%3B%0A%20%20public%20void%20setId(long%20id)%3B%20%7B%0A%20this.id%20%3D%20id%3B%0A%7D%20%20%0Apublic%20void%20setName(String%20name)%3B%20%7B%0Athis.name%3Dname%3B%0A%7D%20%0A%20public%20long%20getId()%3B%20%7B%0A%20return%20id%3B%0A%7D%20%20%0Apublic%20String%20getName()%3B%20%7B%20%0Areturn%20name%3B%0A%7D%0A%7D%20%20" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer">&nbsp;<a href="http://www.iteye.com/topic/243" title="收藏这段代码" style="color: #006699; text-decoration: underline; "><img class="star" src="http://www.iteye.com/images/icon_star.png" alt="收藏代码" style="border-top-width: 0px; border-right-width: 0px; border-bottom-width: 0px; border-left-width: 0px; border-style: initial; border-color: initial; " /></a></div></div><ol start="1" class="dp-j" style="font-size: 1em; line-height: 1.4em; margin-top: 0px; margin-right: 0px; margin-bottom: 1px; margin-left: 0px; padding-top: 2px; padding-right: 0px; padding-bottom: 2px; padding-left: 0px; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-color: #d1d7dc; border-right-color: #d1d7dc; border-bottom-color: #d1d7dc; border-left-color: #d1d7dc; list-style-type: decimal; list-style-position: initial; list-style-image: initial; background-color: #ffffff; color: #2b91af; "><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; "><span class="keyword" style="color: #7f0055; font-weight: bold; ">public</span><span style="color: black; ">&nbsp;</span><span class="keyword" style="color: #7f0055; font-weight: bold; ">class</span><span style="color: black; ">&nbsp;User&nbsp;{&nbsp;&nbsp;&nbsp;</span></span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;&nbsp;<span class="keyword" style="color: #7f0055; font-weight: bold; ">private</span><span style="color: black; ">&nbsp;</span><span class="keyword" style="color: #7f0055; font-weight: bold; ">long</span><span style="color: black; ">&nbsp;id;&nbsp;&nbsp;&nbsp;</span></span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;&nbsp;<span class="keyword" style="color: #7f0055; font-weight: bold; ">private</span><span style="color: black; ">&nbsp;String&nbsp;name;&nbsp;&nbsp;</span></span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;&nbsp;<span class="keyword" style="color: #7f0055; font-weight: bold; ">public</span><span style="color: black; ">&nbsp;</span><span class="keyword" style="color: #7f0055; font-weight: bold; ">void</span><span style="color: black; ">&nbsp;setId(</span><span class="keyword" style="color: #7f0055; font-weight: bold; ">long</span><span style="color: black; ">&nbsp;id);&nbsp;{&nbsp;&nbsp;</span></span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;<span class="keyword" style="color: #7f0055; font-weight: bold; ">this</span><span style="color: black; ">.id&nbsp;=&nbsp;id;&nbsp;&nbsp;</span></span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">}&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; "><span class="keyword" style="color: #7f0055; font-weight: bold; ">public</span><span style="color: black; ">&nbsp;</span><span class="keyword" style="color: #7f0055; font-weight: bold; ">void</span><span style="color: black; ">&nbsp;setName(String&nbsp;name);&nbsp;{&nbsp;&nbsp;</span></span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; "><span class="keyword" style="color: #7f0055; font-weight: bold; ">this</span><span style="color: black; ">.name=name;&nbsp;&nbsp;</span></span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">}&nbsp;&nbsp;&nbsp;</span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;<span class="keyword" style="color: #7f0055; font-weight: bold; ">public</span><span style="color: black; ">&nbsp;</span><span class="keyword" style="color: #7f0055; font-weight: bold; ">long</span><span style="color: black; ">&nbsp;getId();&nbsp;{&nbsp;&nbsp;</span></span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">&nbsp;<span class="keyword" style="color: #7f0055; font-weight: bold; ">return</span><span style="color: black; ">&nbsp;id;&nbsp;&nbsp;</span></span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">}&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; "><span class="keyword" style="color: #7f0055; font-weight: bold; ">public</span><span style="color: black; ">&nbsp;String&nbsp;getName();&nbsp;{&nbsp;&nbsp;&nbsp;</span></span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; "><span class="keyword" style="color: #7f0055; font-weight: bold; ">return</span><span style="color: black; ">&nbsp;name;&nbsp;&nbsp;</span></span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">}&nbsp;&nbsp;</span></li><li style="font-size: 1em; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 38px; padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 10px; border-left-width: 1px; border-left-style: solid; border-left-color: #d1d7dc; background-color: #fafafa; line-height: 18px; "><span style="color: black; ">}&nbsp;&nbsp;&nbsp;&nbsp;</span></li></ol></div><br /><br />---------------------------------------------------------------------------&nbsp;<br />首先要区别持久对象和POJO。&nbsp;<br /><br />持久对象实际上必须对应数据库中的entity，所以和POJO有所区别。比如说POJO是由new创建，由GC回收。但是持久对象是insert数据库创建，由数据库delete删除的。基本上持久对象生命周期和数据库密切相关。另外持久对象往往只能存在一个数据库Connection之中，Connnection关闭以后，持久对象就不存在了，而POJO只要不被GC回收，总是存在的。&nbsp;<br /><br />由于存在诸多差别，因此持久对象PO(Persistent Object)在代码上肯定和POJO不同，起码PO相对于POJO会增加一些用来管理数据库entity状态的属性和方法。而ORM追求的目标就是要PO在使用上尽量和POJO一致，对于程序员来说，他们可以把PO当做POJO来用，而感觉不到PO的存在。&nbsp;<br /><br />JDO的实现方法是这样的：&nbsp;<br />1、编写POJO&nbsp;<br />2、编译POJO&nbsp;<br />3、使用JDO的一个专门工具，叫做Enhancer，一般是一个命令行程序，手工运行，或者在ant脚本里面运行，对POJO的class文件处理一下，把POJO替换成同名的PO。&nbsp;<br />4、在运行期运行的实际上是PO，而不是POJO。&nbsp;<br /><br />该方法有点类似于JSP，JSP也是在编译期被转换成Servlet来运行的，在运行期实际上运行的是Servlet，而不是JSP。&nbsp;<br /><br />Hibernate的实现方法比较先进：&nbsp;<br />1、编写POJO&nbsp;<br />2、编译POJO&nbsp;<br />3、直接运行，在运行期，由Hibernate的CGLIB动态把POJO转换为PO。&nbsp;<br /><br />由此可以看出H<span style="color: red; ">ibernate是在运行期把POJO的字节码转换为PO的</span>，而JDO是在编译期转换的。一般认为JDO的方式效率会稍高，毕竟是编译期转换嘛。但是Hibernate的作者Gavin King说CGLIB的效率非常之高，运行期的PO的字节码生成速度非常之快，效率损失几乎可以忽略不计。&nbsp;<br /><br /><span style="color: red; ">实际上运行期生成PO的好处非常大，这样对于程序员来说，是无法接触到PO的，PO对他们来说完全透明。可以更加自由的以POJO的概念操纵PO。另外由于是运行期生成PO</span>，所以可以支持增量编译，增量调试。而JDO则无法做到这一点。实际上已经有很多人在抱怨JDO的编译期Enhancer问题了，而据说JBossDO将采用运行期生成PO字节码，而不采用编译期生成PO字节码。&nbsp;<br /><br />另外一个相关的问题是，不同的JDO产品的Enhancer生成的PO字节码可能会有所不同，可能会影响在JDO产品之间的可移植性，这一点有点类似EJB的可移植性难题。&nbsp;<br /><br />-----------------------------------------------------------------------------------&nbsp;<br />由这个问题另外引出一个JDO的缺陷。&nbsp;<br /><br />由于JDO的PO状态管理方式，所以当你在程序里面get/set的时候，实际上不是从PO的实例中取values，而是从JDO StateManager中取出来，所以一旦PM关闭，PO就不能进行存取了。&nbsp;<br /><br />在JDO中，也可以通过一些办法使得PO可以在PM外面使用，比如说定义PO是transient的，但是该PO在PM关闭后就没有PO identity了。无法进行跨PM的状态管理。&nbsp;<br /><br />而Hibernate是从PO实例中取values的，所以即使Session关闭，也一样可以get/set，可以进行跨Session的状态管理。&nbsp;<br /><br />在分多层的应用中，由于持久层和业务层和web层都是分开的，此时Hibernate的PO完全可以当做一个POJO来用，也就是当做一个VO，在各层间自由传递，而不用去管Session是开还是关。如果你把这个POJO序列化的话，甚至可以用在分布式环境中。（不适合lazy loading的情况）&nbsp;<br /><br />但是JDO的PO在PM关闭后就不能再用了，所以必须在PM关闭前把PO拷贝一份VO，把VO传递给业务层和web层使用。在非分布式环境中，也可以使用ThreadLocal模式确保PM始终是打开状态，来避免每次必须进行PO到VO的拷贝操作。但是不管怎么说，这总是权宜之计，不如Hibernate的功能强。</div></td></tr></tbody></table></span><img src ="http://www.blogjava.net/liuwuping12064915/aggbug/351621.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/liuwuping12064915/" target="_blank">天空布蓝</a> 2011-06-02 18:14 <a href="http://www.blogjava.net/liuwuping12064915/archive/2011/06/02/351621.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>