??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久亚洲欧洲日产国码二区,亚洲最新中文字幕,国产亚洲?V无码?V男人的天堂http://m.tkk7.com/jelver/category/7668.html每天q步一点点zh-cnSun, 20 Feb 2011 12:57:30 GMTSun, 20 Feb 2011 12:57:30 GMT60化开?basec(泛型Q?/title><link>http://m.tkk7.com/jelver/articles/344686.html</link><dc:creator>冰河快狼</dc:creator><author>冰河快狼</author><pubDate>Sun, 20 Feb 2011 06:13:00 GMT</pubDate><guid>http://m.tkk7.com/jelver/articles/344686.html</guid><wfw:comment>http://m.tkk7.com/jelver/comments/344686.html</wfw:comment><comments>http://m.tkk7.com/jelver/articles/344686.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jelver/comments/commentRss/344686.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jelver/services/trackbacks/344686.html</trackback:ping><description><![CDATA[<div id="l1pzb3t" class="bct fc05 fc11 nbw-blog ztag js-fs2"> <p><span style="font-size: small"><strong>本文章主要讲了两个技?一是在Dao层中基本操作的复用,和Spring配置中的一些代码复用?/strong></span></p> <p> </p> <p>明的说一下类的作用:</p> <p> </p> <p>BaseDaoQ接口类Q:</p> <p>实体中共有的增删Ҏ操作的接?/p> <p> </p> <p>BaseHibernateDaoQ实现类Q:l承HibernateDaoSupportQ实现BaseDao接口</p> <p>实现BaseDaocM的基本操作?/p> <p> </p> <p>UserDaoQ接口类Q:l承BaseDaoc?/p> <p>实体中除了基本操作的额外操作Q用于扩充功能?/p> <p> </p> <p>UserHibernateDaoQ实现类Q:l承BaseHibernateDaoc,实现UserDao接口</p> <p>实现UserDaocȝ操作?/p> <p> </p> <p> </p> <p>从上面的分析可以看出来,UserDaocL包含有全部的底层操作的接口,而UserHibernateDaocL实现了UserDao</p> <p>cȝ全部操作?span style="color: rgb(255,0,0)">实现了basecdQ实际上是简化了实体通用的操作,只写一ơ就行了。?/span></p> <p> </p> <p>在ssh2 l构中,可以利用spring 对UserService c进行注入UserDaocd可。如Spring的配|文Ӟ </p> <div><span style="color: rgb(255,0,0)"> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000">    </span><span style="color: #0000ff"><</span><span style="color: #800000">bean </span><span style="color: #ff0000">id</span><span style="color: #0000ff">="daoTemplate"</span><span style="color: #ff0000"> abstract</span><span style="color: #0000ff">="true"</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff"><</span><span style="color: #800000">property </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="sessionFactory"</span><span style="color: #ff0000"> ref</span><span style="color: #0000ff">="sessionFactory"</span><span style="color: #0000ff">></</span><span style="color: #800000">property</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff"></</span><span style="color: #800000">bean</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff"><</span><span style="color: #800000">bean </span><span style="color: #ff0000">id</span><span style="color: #0000ff">="userDao"</span><span style="color: #ff0000"> class</span><span style="color: #0000ff">="dao.hibernate.UserHibernateDao"</span><span style="color: #ff0000"> parent</span><span style="color: #0000ff">="daoTemplate"</span><span style="color: #0000ff">/></span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff"><</span><span style="color: #800000">bean </span><span style="color: #ff0000">id</span><span style="color: #0000ff">="userService"</span><span style="color: #ff0000"> class</span><span style="color: #0000ff">="service.imp.UserService"</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff"><</span><span style="color: #800000">property </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="userDao"</span><span style="color: #ff0000"> ref</span><span style="color: #0000ff">="userDao"</span><span style="color: #0000ff">/></span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff"><</span><span style="color: #800000">bean </span><span style="color: #ff0000">id</span><span style="color: #0000ff">="***Dao"</span><span style="color: #ff0000"> class</span><span style="color: #0000ff">="dao.hibernate.***HibernateDao"</span><span style="color: #ff0000"> parent</span><span style="color: #0000ff">="daoTemplate"</span><span style="color: #0000ff">/></span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff"><</span><span style="color: #800000">bean </span><span style="color: #ff0000">id</span><span style="color: #0000ff">="***Service"</span><span style="color: #ff0000"> class</span><span style="color: #0000ff">="service.imp.UserService"</span><span style="color: #0000ff">></span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff"><</span><span style="color: #800000">property </span><span style="color: #ff0000">name</span><span style="color: #0000ff">="***Dao"</span><span style="color: #ff0000"> ref</span><span style="color: #0000ff">="***Dao"</span><span style="color: #0000ff">/></span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span></div> <br /> 从这个配|文件上又有?daoTemplate 的bean Q这个bean 是一个抽象类Q注入了sessionFactoryQ如果其他beancȝ承它的话Q就可以不用在ؓ它注入sessionFactory了,Q这个也是一个技巧,有点像Basec,功能都是实现代码的复用。。?/span></div> <p> </p> <p><strong></strong></p> <p><strong><span style="font-size: small">下面是上面一些类的演CZ码:</span></strong></p> <p><strong><span style="color: rgb(255,0,0)">BaseDao</span></strong></p> <p><strong><span style="color: rgb(255,0,0)"></p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #0000ff">import</span><span style="color: #000000"> java.io.Serializable;<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.List;<br /> <img id="Codehighlighter1_104_339_Open_Image" onclick="this.style.display='none'; Codehighlighter1_104_339_Open_Text.style.display='none'; Codehighlighter1_104_339_Closed_Image.style.display='inline'; Codehighlighter1_104_339_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_104_339_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_104_339_Closed_Text.style.display='none'; Codehighlighter1_104_339_Open_Image.style.display='inline'; Codehighlighter1_104_339_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">interface</span><span style="color: #000000"> BaseDao</span><span style="color: #000000"><</span><span style="color: #000000">T,ID </span><span style="color: #0000ff">extends</span><span style="color: #000000"> Serializable</span><span style="color: #000000">></span><span style="color: #000000"> </span><span id="Codehighlighter1_104_339_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://m.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_104_339_Open_Text"><span style="color: #000000">{<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> save(T entity);<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> delete(T entity);<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> deleteById(Class</span><span style="color: #000000"><</span><span style="color: #000000">T</span><span style="color: #000000">></span><span style="color: #000000"> entityClass,ID id);<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> update(T entity);<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> T findById(Class</span><span style="color: #000000"><</span><span style="color: #000000">T</span><span style="color: #000000">></span><span style="color: #000000"> entityClass,ID id);<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> List</span><span style="color: #000000"><</span><span style="color: #000000">T</span><span style="color: #000000">></span><span style="color: #000000"> findAll(Class</span><span style="color: #000000"><</span><span style="color: #000000">T</span><span style="color: #000000">></span><span style="color: #000000"> entityClass);<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span></div> <p><br /> BaseHibernateDao<br /> </p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #0000ff">package</span><span style="color: #000000"> dao.base;<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.io.Serializable;<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.List;<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> org.springframework.orm.hibernate3.support.HibernateDaoSupport;<br /> <img id="Codehighlighter1_251_885_Open_Image" onclick="this.style.display='none'; Codehighlighter1_251_885_Open_Text.style.display='none'; Codehighlighter1_251_885_Closed_Image.style.display='inline'; Codehighlighter1_251_885_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_251_885_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_251_885_Closed_Text.style.display='none'; Codehighlighter1_251_885_Open_Image.style.display='inline'; Codehighlighter1_251_885_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> BaseHibernateDao</span><span style="color: #000000"><</span><span style="color: #000000">T,ID </span><span style="color: #0000ff">extends</span><span style="color: #000000"> Serializable</span><span style="color: #000000">></span><span style="color: #000000"> </span><span style="color: #0000ff">extends</span><span style="color: #000000"> HibernateDaoSupport </span><span style="color: #0000ff">implements</span><span style="color: #000000"> BaseDao</span><span style="color: #000000"><</span><span style="color: #000000">T,ID</span><span style="color: #000000">></span><span style="color: #000000"> </span><span id="Codehighlighter1_251_885_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://m.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_251_885_Open_Text"><span style="color: #000000">{<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />@Override<br /> <img id="Codehighlighter1_292_338_Open_Image" onclick="this.style.display='none'; Codehighlighter1_292_338_Open_Text.style.display='none'; Codehighlighter1_292_338_Closed_Image.style.display='inline'; Codehighlighter1_292_338_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_292_338_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_292_338_Closed_Text.style.display='none'; Codehighlighter1_292_338_Open_Image.style.display='inline'; Codehighlighter1_292_338_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> delete(T entity) </span><span id="Codehighlighter1_292_338_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://m.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_292_338_Open_Text"><span style="color: #000000">{<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">this</span><span style="color: #000000">.getHibernateTemplate().delete(entity);<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />@Override<br /> <img id="Codehighlighter1_402_444_Open_Image" onclick="this.style.display='none'; Codehighlighter1_402_444_Open_Text.style.display='none'; Codehighlighter1_402_444_Closed_Image.style.display='inline'; Codehighlighter1_402_444_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_402_444_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_402_444_Closed_Text.style.display='none'; Codehighlighter1_402_444_Open_Image.style.display='inline'; Codehighlighter1_402_444_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> deleteById(Class</span><span style="color: #000000"><</span><span style="color: #000000">T</span><span style="color: #000000">></span><span style="color: #000000"> entityClass, ID id) </span><span id="Codehighlighter1_402_444_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://m.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_402_444_Open_Text"><span style="color: #000000">{<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />delete(</span><span style="color: #0000ff">this</span><span style="color: #000000">.findById(entityClass, id));<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />@Override<br /> <img id="Codehighlighter1_503_565_Open_Image" onclick="this.style.display='none'; Codehighlighter1_503_565_Open_Text.style.display='none'; Codehighlighter1_503_565_Closed_Image.style.display='inline'; Codehighlighter1_503_565_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_503_565_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_503_565_Closed_Text.style.display='none'; Codehighlighter1_503_565_Open_Image.style.display='inline'; Codehighlighter1_503_565_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> T findById(Class</span><span style="color: #000000"><</span><span style="color: #000000">T</span><span style="color: #000000">></span><span style="color: #000000"> entityClass, ID id) </span><span id="Codehighlighter1_503_565_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://m.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_503_565_Open_Text"><span style="color: #000000">{<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">return</span><span style="color: #000000"> (T)</span><span style="color: #0000ff">this</span><span style="color: #000000">.getHibernateTemplate().get(entityClass, id);<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />@Override<br /> <img id="Codehighlighter1_622_713_Open_Image" onclick="this.style.display='none'; Codehighlighter1_622_713_Open_Text.style.display='none'; Codehighlighter1_622_713_Closed_Image.style.display='inline'; Codehighlighter1_622_713_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_622_713_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_622_713_Closed_Text.style.display='none'; Codehighlighter1_622_713_Open_Image.style.display='inline'; Codehighlighter1_622_713_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> List</span><span style="color: #000000"><</span><span style="color: #000000">T</span><span style="color: #000000">></span><span style="color: #000000"> findAll(Class</span><span style="color: #000000"><</span><span style="color: #000000">T</span><span style="color: #000000">></span><span style="color: #000000"> entityClass) </span><span id="Codehighlighter1_622_713_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://m.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_622_713_Open_Text"><span style="color: #000000">{<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />String name</span><span style="color: #000000">=</span><span style="color: #000000">entityClass.getName();<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">this</span><span style="color: #000000">.getHibernateTemplate().find(</span><span style="color: #000000">"</span><span style="color: #000000">from</span><span style="color: #000000">"</span><span style="color: #000000">+</span><span style="color: #000000">name);<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />@Override<br /> <img id="Codehighlighter1_752_796_Open_Image" onclick="this.style.display='none'; Codehighlighter1_752_796_Open_Text.style.display='none'; Codehighlighter1_752_796_Closed_Image.style.display='inline'; Codehighlighter1_752_796_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_752_796_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_752_796_Closed_Text.style.display='none'; Codehighlighter1_752_796_Open_Image.style.display='inline'; Codehighlighter1_752_796_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> save(T entity) </span><span id="Codehighlighter1_752_796_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://m.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_752_796_Open_Text"><span style="color: #000000">{<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">this</span><span style="color: #000000">.getHibernateTemplate().save(entity);<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />@Override<br /> <img id="Codehighlighter1_837_883_Open_Image" onclick="this.style.display='none'; Codehighlighter1_837_883_Open_Text.style.display='none'; Codehighlighter1_837_883_Closed_Image.style.display='inline'; Codehighlighter1_837_883_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_837_883_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_837_883_Closed_Text.style.display='none'; Codehighlighter1_837_883_Open_Image.style.display='inline'; Codehighlighter1_837_883_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">void</span><span style="color: #000000"> update(T entity) </span><span id="Codehighlighter1_837_883_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://m.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_837_883_Open_Text"><span style="color: #000000">{<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">this</span><span style="color: #000000">.getHibernateTemplate().update(entity);<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span></div> <p><br /> <br /> </span></strong></p> <p><span style="color: rgb(255,0,0)"><strong>UserDao</strong></span></p> <p> </p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #0000ff">package</span><span style="color: #000000"> dao;<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> dao.base.BaseDao;<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> model.User;<br /> <img id="Codehighlighter1_111_170_Open_Image" onclick="this.style.display='none'; Codehighlighter1_111_170_Open_Text.style.display='none'; Codehighlighter1_111_170_Closed_Image.style.display='inline'; Codehighlighter1_111_170_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_111_170_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_111_170_Closed_Text.style.display='none'; Codehighlighter1_111_170_Open_Image.style.display='inline'; Codehighlighter1_111_170_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">interface</span><span style="color: #000000"> UserDao </span><span style="color: #0000ff">extends</span><span style="color: #000000"> BaseDao</span><span style="color: #000000"><</span><span style="color: #000000">User,Integer</span><span style="color: #000000">></span><span id="Codehighlighter1_111_170_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://m.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_111_170_Open_Text"><span style="color: #000000">{<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />User findUserByNameAndPass(String name,String password);<br /> <img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000"><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /><br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span></div> <p> </p> <p><span style="color: rgb(255,0,0)"><strong> UserHibernateDao</strong></span> </p> <div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #0000ff">package</span><span style="color: #000000"> dao.hibernate;   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> java.util.List;   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> model.User;   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> dao.UserDao;   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff">import</span><span style="color: #000000"> dao.base.BaseHibernateDao;   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/None.gif" align="top" alt="" />   <br /> <img id="Codehighlighter1_234_630_Open_Image" onclick="this.style.display='none'; Codehighlighter1_234_630_Open_Text.style.display='none'; Codehighlighter1_234_630_Closed_Image.style.display='inline'; Codehighlighter1_234_630_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_234_630_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_234_630_Closed_Text.style.display='none'; Codehighlighter1_234_630_Open_Image.style.display='inline'; Codehighlighter1_234_630_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedBlock.gif" align="top" alt="" /></span><span style="color: #0000ff">public</span><span style="color: #000000"> </span><span style="color: #0000ff">class</span><span style="color: #000000"> UserHibernateDao </span><span style="color: #0000ff">extends</span><span style="color: #000000"> BaseHibernateDao</span><span style="color: #000000"><</span><span style="color: #000000">User,Integer</span><span style="color: #000000">></span><span style="color: #000000"> </span><span style="color: #0000ff">implements</span><span style="color: #000000"> UserDao </span><span id="Codehighlighter1_234_630_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://m.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_234_630_Open_Text"><span style="color: #000000">{   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />    @Override   <br /> <img id="Codehighlighter1_328_621_Open_Image" onclick="this.style.display='none'; Codehighlighter1_328_621_Open_Text.style.display='none'; Codehighlighter1_328_621_Closed_Image.style.display='inline'; Codehighlighter1_328_621_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_328_621_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_328_621_Closed_Text.style.display='none'; Codehighlighter1_328_621_Open_Image.style.display='inline'; Codehighlighter1_328_621_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" />    </span><span style="color: #0000ff">public</span><span style="color: #000000"> User findUserByNameAndPass(String name, String password) </span><span id="Codehighlighter1_328_621_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://m.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_328_621_Open_Text"><span style="color: #000000">{   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #008000">//</span><span style="color: #008000"> TODO Auto-generated method stub   </span><span style="color: #008000"><br /> <img id="Codehighlighter1_491_505_Open_Image" onclick="this.style.display='none'; Codehighlighter1_491_505_Open_Text.style.display='none'; Codehighlighter1_491_505_Closed_Image.style.display='inline'; Codehighlighter1_491_505_Closed_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" alt="" /><img id="Codehighlighter1_491_505_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_491_505_Closed_Text.style.display='none'; Codehighlighter1_491_505_Open_Image.style.display='inline'; Codehighlighter1_491_505_Open_Text.style.display='inline';" src="http://m.tkk7.com/images/OutliningIndicators/ContractedSubBlock.gif" align="top" alt="" /></span><span style="color: #000000">        List</span><span style="color: #000000"><</span><span style="color: #000000">User</span><span style="color: #000000">></span><span style="color: #000000"> us</span><span style="color: #000000">=</span><span style="color: #0000ff">this</span><span style="color: #000000">.getHibernateTemplate().find(</span><span style="color: #000000">"</span><span style="color: #000000">from User user where name=? and password=?</span><span style="color: #000000">"</span><span style="color: #000000">,</span><span style="color: #0000ff">new</span><span style="color: #000000"> Object[]</span><span id="Codehighlighter1_491_505_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img src="http://m.tkk7.com/Images/dot.gif" alt="" /></span><span id="Codehighlighter1_491_505_Open_Text"><span style="color: #000000">{name,password}</span></span><span style="color: #000000">);   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">if</span><span style="color: #000000">(us.size()</span><span style="color: #000000">==</span><span style="color: #000000">1</span><span style="color: #000000">)   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />            </span><span style="color: #0000ff">return</span><span style="color: #000000"> us.get(</span><span style="color: #000000">0</span><span style="color: #000000">);   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />        </span><span style="color: #0000ff">else</span><span style="color: #000000">   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />            </span><span style="color: #0000ff">return</span><span style="color: #000000"> </span><span style="color: #0000ff">null</span><span style="color: #000000">;   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />    }</span></span><span style="color: #000000">   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/InBlock.gif" align="top" alt="" />   <br /> <img src="http://m.tkk7.com/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000"> </span></div> </div> <img src ="http://m.tkk7.com/jelver/aggbug/344686.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jelver/" target="_blank">冰河快狼</a> 2011-02-20 14:13 <a href="http://m.tkk7.com/jelver/articles/344686.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Unit tests with H2 and iBATIShttp://m.tkk7.com/jelver/articles/334100.html冰河快狼冰河快狼Sat, 09 Oct 2010 07:10:00 GMThttp://m.tkk7.com/jelver/articles/334100.htmlhttp://m.tkk7.com/jelver/comments/334100.htmlhttp://m.tkk7.com/jelver/articles/334100.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/334100.htmlhttp://m.tkk7.com/jelver/services/trackbacks/334100.html阅读全文

冰河快狼 2010-10-09 15:10 发表评论
]]>
DbUnit入门实战Q{载) http://m.tkk7.com/jelver/articles/334093.html冰河快狼冰河快狼Sat, 09 Oct 2010 06:20:00 GMThttp://m.tkk7.com/jelver/articles/334093.htmlhttp://m.tkk7.com/jelver/comments/334093.htmlhttp://m.tkk7.com/jelver/articles/334093.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/334093.htmlhttp://m.tkk7.com/jelver/services/trackbacks/334093.html怿做过单元试的h都会对JUnit非常的熟悉了Q今天要介绍的DbUnit(http://dbunit.sourceforge.net/)则是专门针对数据库测试的对JUnit的一个扩展,它可以将试对象数据库置于一个测试轮回之间的状态。鉴于目前国内介lDbUnit的系l教E比较少见,本文分从理论和实例两个斚w带你领略DbUnit的精彩世界?/span>
DbUnit设计理念
熟悉单元试的开发h员都知道Q在Ҏ据库q行单元试时候,通常采用的方案有q用模拟对象(mock objects)和stubs两种。通过隔离兌的数据库讉Kc,比如JDBC的相x作类Q来辑ֈҎ据库操作的模拟测试。然而某些特D的pȝQ比如利用了EJB的CMP(container
-managed persistence)的系l,数据库的讉K对象是在最底层而且很隐蔽的Q那么这两种解决Ҏ对这些系l就昑־力不从心了?br /> DBUnit的设计理念就是在试之前Q备份数据库Q然后给对象数据库植入我们需要的准备数据Q最后,在测试完毕后Q读入备份数据库Q回溯到试前的状态;
而且又因为DBUnit是对JUnit的一U扩展,开发h员可以通过创徏试用例代码Q在q些试用例的生命周期内来对数据库的操作l果q行比较?br /> DbUnit试基本概念和流E?br /> ZDbUnit 的测试的主要接口是IDataSet。IDataSet代表一个或多个表的数据?br /> 可以数据库模式的全部内容表CZؓ单个IDataSet 实例。这些表本n由Itable 实例来表C?br /> IDataSet 的实现有很多Q每一个都对应一个不同的数据源或加蝲机制。最常用的几U?nbsp;IDataSet实现为:
FlatXmlDataSetQ数据的单^面文?nbsp;XML 表示
QueryDataSetQ用 SQL 查询获得的数?br /> DatabaseDataSetQ数据库表本w内容的一U表C?br /> XlsDataSet Q数据的excel表示
一般而言Q用DbUnitq行单元试的流E如下:
1 Ҏ业务Q做好测试用的准备数据和预想l果数据Q通常准备成xml格式文g?br /> 2 在setUp()Ҏ里边备䆾数据库中的关联表?br /> 3 在setUp()Ҏ里边d准备数据?br /> 4 Ҏ试类的对应测试方法进行实?执行对象ҎQ把数据库的实际执行l果和预想结果进行比较?br /> 5 在tearDown()Ҏ里边,把数据库q原到测试前状态?br /> DbUnit开发实?br /> 下面通过一个实例来说明DbUnit的实际运用?br /> 实例准备
比如有一个学生表[student]Q结构如下:

--------------------------------------------------------------------------------
id 
char(4) pk 学号
name 
char(50) 姓名
sex 
char(1) 性别
birthday date 出生日期
--------------------------------------------------------------------------------
准备数据如下Q?br />
--------------------------------------------------------------------------------
id name sex birthday
0001 仔 m 1979-12-31
0002 王翠?nbsp;f 1982-08-09
--------------------------------------------------------------------------------
试对象cMؓStudentOpe.javaQ里Ҏ2个方法:
findStudent(String id) :Ҏ主键id找记?br /> addStudent(Student student) Q添加一条记?br /> 在测试addStudentҎ时候,我们准备d如下一条数?br />
--------------------------------------------------------------------------------
id name sex birthday
0088 王x m 1982-01-01
--------------------------------------------------------------------------------
那么在执行该Ҏ后,数据库的student表里的数据是q样的:
--------------------------------------------------------------------------------
id name sex birthday
0001 仔 m 1979-12-31
0002 王翠?nbsp;f 1982-08-09
0088 王x m 1982-01-01
--------------------------------------------------------------------------------
然后我们说明如何对这2个方法进行单元测试?br /> 实例展开
1 把准备数据和预想数据转换成xml文g
student_pre.xml

--------------------------------------------------------------------------------
<?xml version='1.0' encoding="gb2312"?>
<dataset>
<student id="0001" name="" sex="m" birthday="1979-12-31"/>
<student id="0002" name="王翠?/span>" sex="f" birthday="1982-08-09"/>
</dataset>
--------------------------------------------------------------------------------
student_exp.xml
--------------------------------------------------------------------------------
<?xml version='1.0' encoding="gb2312"?>
<dataset>
<student id="0001" name="" sex="m" birthday="1979-12-31"/>
<student id="0002" name="王翠?/span>" sex="f" birthday="1982-08-09"/>
<student id="0088" name="王x" sex="m" birthday="1982-01-01"/>
</dataset>
--------------------------------------------------------------------------------
2 实装setUpҎQ详l见代码注释?br />
--------------------------------------------------------------------------------
protected void setUp() {
IDatabaseConnection connection 
=null;
try{
super.setUp();
//本例使用postgresql数据?/span>
Class.forName("org.postgresql.Driver");
//q接DB
Connection conn=DriverManager.getConnection("jdbc:postgresql:testdb.test","postgres","postgres");
//获得DBq接
connection =new DatabaseConnection(conn);
//Ҏ据库中的操作对象表studentq行备䆾
QueryDataSet backupDataSet = new QueryDataSet(connection);
backupDataSet.addTable(
"student");
file
=File.createTempFile("student_back",".xml");//备䆾文g
FlatXmlDataSet.write(backupDataSet,new FileOutputStream(file));
//准备数据的读?/span>
IDataSet dataSet = new FlatXmlDataSet( new FileInputStream("student_pre.xml"));
DatabaseOperation.CLEAN_INSERT.execute(connection,dataSet);
}
catch(Exception e){
e.printStackTrace();
}
finally{
try{
if(connection!=null) connection.close();
}
catch(SQLException e){}
}
}
--------------------------------------------------------------------------------
3 实装试ҎQ详l见代码注释?br /> *索类ҎQ可以利用assertEquals()ҎQ拿表的字段q行比较?br /> --------------------------------------------------------------------------------
// findStudent
public void testFindStudent() throws Exception{
//执行findStudentҎ
StudentOpe studentOpe=new StudentOpe();
Student result 
= studentOpe.findStudent("0001");
//预想l果和实际结果的比较
assertEquals("",result.getName());
assertEquals(
"m",result.getSex());
assertEquals(
"1979-12-31",result.getBirthDay());
}
--------------------------------------------------------------------------------
*更新Q添加,删除{方法,可以利用Assertion.assertEquals()ҎQ拿表的整体来比较?br /> --------------------------------------------------------------------------------
public void testAddStudent() throws Exception{
//执行addStudentҎ
StudentOpe studentOpe=new StudentOpe();
//被追加的记录
Student newStudent = new Student("0088","王x","m","1982-01-01");
//执行q加Ҏ
Student result = studentOpe.addStudent(newStudent);
//预想l果和实际结果的比较
IDatabaseConnection connection=null;
try{
//预期l果取得
IDataSet expectedDataSet = new FlatXmlDataSet(new FileInputStream("student_exp.xml"));
ITable expectedTable 
= expectedDataSet.getTable("student");
//实际l果取得
Connection conn=getConnection();
connection 
=new DatabaseConnection(conn);
IDataSet databaseDataSet 
= connection.createDataSet();
ITable actualTable 
= databaseDataSet.getTable("student");
//比较
Assertion.assertEquals(expectedTable, actualTable);
}
finally{
if(connection!=null) connection.close();
}
}
--------------------------------------------------------------------------------
*如果在整体比较表的时候,有个别字D不需要比较,可以用DefaultColumnFilter.excludedColumnsTable()ҎQ?br /> 指定字D늻排除在比较范围之外。比如上例中不需要比较birthdayq个字段的话Q那么可以如下代码所C行处理:
--------------------------------------------------------------------------------
ITable filteredExpectedTable 
= DefaultColumnFilter.excludedColumnsTable(expectedTable, new String[]{"birthday"});
ITable filteredActualTable 
= DefaultColumnFilter.excludedColumnsTable(actualTable,new String[]{"birthday"});
Assertion.assertEquals(filteredExpectedTable, filteredActualTable);
--------------------------------------------------------------------------------
4 在tearDown()Ҏ里边,把数据库q原到测试前状?br /> --------------------------------------------------------------------------------
protected void tearDown() throws Exception{
IDatabaseConnection connection 
=null;
try{
super.tearDown();
Connection conn
=getConnection();
connection 
=new DatabaseConnection(conn);
IDataSet dataSet 
= new FlatXmlDataSet(file);
DatabaseOperation.CLEAN_INSERT.execute(connection,dataSet);
}
catch(Exception e){
e.printStackTrace();
}
finally{
try{
if(connection!=null) connection.close();
}
catch(SQLException e){}
}
}



冰河快狼 2010-10-09 14:20 发表评论
]]>
Hibernate与缓存技?/title><link>http://m.tkk7.com/jelver/articles/233294.html</link><dc:creator>冰河快狼</dc:creator><author>冰河快狼</author><pubDate>Thu, 09 Oct 2008 02:38:00 GMT</pubDate><guid>http://m.tkk7.com/jelver/articles/233294.html</guid><wfw:comment>http://m.tkk7.com/jelver/comments/233294.html</wfw:comment><comments>http://m.tkk7.com/jelver/articles/233294.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jelver/comments/commentRss/233294.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jelver/services/trackbacks/233294.html</trackback:ping><description><![CDATA[     摘要: 对于Hibernateq类ORM而言,~存昄ؓ重要,它是持久层性能提升的关?单来讲Hibernate是对JDBCq行装,以实现内部状态的理,OR关系的映等,但随之带来的是数据讉K效率的降?和性能的下?而缓存就是I补这一~点的重要方?     ~存是数据库数据在内存中的临时容器,包括数据库数据在内存中的临时拯,它位于数据库与数...  <a href='http://m.tkk7.com/jelver/articles/233294.html'>阅读全文</a><img src ="http://m.tkk7.com/jelver/aggbug/233294.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jelver/" target="_blank">冰河快狼</a> 2008-10-09 10:38 <a href="http://m.tkk7.com/jelver/articles/233294.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate中映blob数据cd的一个例?(zhuan)http://m.tkk7.com/jelver/articles/168261.html冰河快狼冰河快狼Mon, 17 Dec 2007 08:25:00 GMThttp://m.tkk7.com/jelver/articles/168261.htmlhttp://m.tkk7.com/jelver/comments/168261.htmlhttp://m.tkk7.com/jelver/articles/168261.html#Feedback1http://m.tkk7.com/jelver/comments/commentRss/168261.htmlhttp://m.tkk7.com/jelver/services/trackbacks/168261.html 1java 代码
 2public class User  implements java.io.Serializable {    
 3   
 4   
 5    // Fields        
 6   
 7     private long id;    
 8     private String name;    
 9     private String email;    
10     private String addr;    
11     //定义Blob的pthto    
12     private Blob photo;   
13
14xml 代码
15<hibernate-mapping>   
16    <class name="org.tie.User" table="user" catalog="tie">   
17        <id name="id" type="long">   
18            <column name="id" />   
19            <generator class="identity" />   
20        </id>   
21        <property name="name" type="string">   
22            <column name="name" length="45" not-null="true" />   
23        </property>   
24        <property name="email" type="string">   
25            <column name="email" length="45" />   
26        </property>   
27        <property name="addr" type="string">   
28            <column name="addr" length="45" />   
29        </property>   
30        <!-- 映射blobcd -->   
31        <property name="photo" type="blob">   
32            <column name="photo" />   
33        </property>   
34    </class>   
35</hibernate-mapping>   
36
37两个试Ҏ:
38
39java 代码
40public void testCreate(){    
41            
42        User user = new User();    
43        user.setName("linweiyang");    
44        user.setAddr("beijing");    
45        user.setEmail("linweiyang@163.com");    
46        Blob photo = null;    
47        
48        try {    
49            //图片读q输入流    
50            FileInputStream fis = new FileInputStream("c:\\a.jpg");    
51            //转成Blobcd    
52            photo = Hibernate.createBlob(fis);    
53                
54        }
 catch (FileNotFoundException e) {    
55            e.printStackTrace();    
56        }
 catch (IOException e) {    
57            e.printStackTrace();    
58        }
    
59                
60        user.setPhoto(photo);    
61            
62        Session session = factory.openSession();    
63        Transaction tr = session.beginTransaction();    
64        session.save(user);    
65        tr.commit();    
66        session.close();    
67   
68    }
    
69        
70    public void testRerieve(){    
71            
72        Session session = factory.openSession();    
73        User user = (User)session.load(User.classnew Long(3));    
74        try {    
75            //从数据库中要d出来    
76            InputStream is = user.getPhoto().getBinaryStream();    
77            //在把写到一个图片格式的文g?nbsp;   
78            FileOutputStream fos = new FileOutputStream("c:\\linweihan.jpg");    
79                
80            byte[] buffer = new byte[1024];    
81            int len = 0;    
82            //从数据库中读取到指定的字节数l中    
83            while((len = is.read(buffer) )!= -1){    
84                //从指定的数组中读取,然后输出来,所以这里buffer好象是连接inputStream和outputStream的一个东?nbsp;   
85                fos.write(buffer,0,len);    
86            }
    
87        }
 catch (FileNotFoundException e) {    
88            e.printStackTrace();    
89        }
 catch (SQLException e) {    
90            e.printStackTrace();    
91        }
 catch (IOException  e){    
92            e.printStackTrace();    
93        }
               
94        session.close();    
95    }
   

q么理解输入输出?/font>

d?自然要有d的源?

输出也要输出到某个地?输出一般是先要输读?

q里q接输入和输出的是一个在内存中的字节数组buffer.q样从数据库中读到这个数l里,输出在从这个数l中输出到特定的文g格式?



冰河快狼 2007-12-17 16:25 发表评论
]]>
利用Jakarta Commonslgbeanutils、dbutils化JDBC数据库操作(转)http://m.tkk7.com/jelver/articles/166515.html冰河快狼冰河快狼Sun, 09 Dec 2007 13:30:00 GMThttp://m.tkk7.com/jelver/articles/166515.htmlhttp://m.tkk7.com/jelver/comments/166515.htmlhttp://m.tkk7.com/jelver/articles/166515.html#Feedback1http://m.tkk7.com/jelver/comments/commentRss/166515.htmlhttp://m.tkk7.com/jelver/services/trackbacks/166515.html阅读全文

冰河快狼 2007-12-09 21:30 发表评论
]]>
利用开源项目Hibernate开发Blogpȝhttp://m.tkk7.com/jelver/articles/165126.html冰河快狼冰河快狼Tue, 04 Dec 2007 03:50:00 GMThttp://m.tkk7.com/jelver/articles/165126.htmlhttp://m.tkk7.com/jelver/comments/165126.htmlhttp://m.tkk7.com/jelver/articles/165126.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/165126.htmlhttp://m.tkk7.com/jelver/services/trackbacks/165126.html阅读全文

冰河快狼 2007-12-04 11:50 发表评论
]]>
利于ThreadLocal理Hibernate Session (zhuan)http://m.tkk7.com/jelver/articles/165070.html冰河快狼冰河快狼Tue, 04 Dec 2007 01:28:00 GMThttp://m.tkk7.com/jelver/articles/165070.htmlhttp://m.tkk7.com/jelver/comments/165070.htmlhttp://m.tkk7.com/jelver/articles/165070.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/165070.htmlhttp://m.tkk7.com/jelver/services/trackbacks/165070.html
 1public class ThreadLocal {    
 2     private Map values = Collections.synchronizedMap(new HashMap());    
 3     public Object get() {    
 4        Thread currentThread = Thread.currentThread();     
 5        Object result = values.get(currentThread);     
 6        if(result == null&&!values.containsKey(currentThread)) {    
 7           result = initialValue();    
 8           values.put(currentThread, result);     
 9        }
    
10        return result;     
11     }
    
12     public void set(Object newValue) {    
13        values.put(Thread.currentThread(), newValue);    
14     }
    
15     public Object initialValue() {    
16        return null;     
17     }
    
18}
   


 1public class HibernateUtil {    
 2       public static final SessionFactory sessionFactory;    
 3       static {    
 4           try {    
 5                 sessionFactory = new Configuration().configure()    
 6                                   .buildSessionFactory();    
 7           }
 catch (Throwable ex) {    
 8                throw new ExceptionInInitializerError(ex);    
 9           }
    
10       }
    
11       public static final ThreadLocal session =     
12                                            new ThreadLocal();    
13       public static Session currentSession() throws HibernateException {    
14               Session s = session.get();    
15               if(s == null{    
16                     s = sessionFactory.openSession();    
17                     session.set(s);    
18               }
    
19               return s;    
20       }
    
21       public static void closeSession() throws HibernateException {    
22                Session s = session.get();    
23                if(s != null{    
24                      s.close();    
25                }
    
26                session.set(null);    
27       }
    
28}
   
29


      在Session的众多管理方案中Q我们今天来认识一U名为ThreadLocal模式的解x案?br />       早在Java1.2推出之时QJavaq_中就引入了一个新的支持:java.lang.ThreadLocalQ给我们在编写多U程E序时提供了一U新的选择。ThreadLocal是什么呢Q其实ThreadLocalq是一个线E的本地实现版本Q它q不是一个ThreadQ而是thread local variable(U程局部变?。也许把它命名ؓThreadLocalVar更加合适。线E局部变?ThreadLocal)其实的功用非常简单,是为每一个用该变量的线E都提供一个变量值的副本Q是每一个线E都可以独立地改变自q副本Q而不会和其它U程的副本冲H。从U程的角度看Q就好像每一个线E都完全拥有一个该变量?br />       ThreadLocal是如何做Cؓ每一个线E维护变量的副本的呢Q其实实现的思\很简单,在ThreadLocalcM有一个MapQ用于存储每一个线E的变量的副本。比如下面的CZ实现(Z单,没有考虑集合的泛?Q?font face="Arial"> 
  只要借助上面的工L获取Session实例Q我们就可以实现U程范围内的Session׃nQ从而避免了U程中频J的创徏和销毁Session实例。当Ӟ不要忘记在用完后关闭Session?br />      写到q里Q想再多说一些,也许大多数时候我们的DAOq不会涉及到多线E的情ŞQ比如我们不会将DAO的代码写在Servlet之中Q那样不是良好的设计Q我自己通常会在service层的代码里访问DAO的方法。但是我q是采用以上的工L来管理SessionQ毕竟我们不能仅仅考虑今天己做什么,q应该考虑明天己做什么!

冰河快狼 2007-12-04 09:28 发表评论
]]>ZXDoclet的Hibernate3企业U开发教E?one2one映射cdQ{Q?/title><link>http://m.tkk7.com/jelver/articles/34774.html</link><dc:creator>冰河快狼</dc:creator><author>冰河快狼</author><pubDate>Sat, 11 Mar 2006 01:05:00 GMT</pubDate><guid>http://m.tkk7.com/jelver/articles/34774.html</guid><wfw:comment>http://m.tkk7.com/jelver/comments/34774.html</wfw:comment><comments>http://m.tkk7.com/jelver/articles/34774.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://m.tkk7.com/jelver/comments/commentRss/34774.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jelver/services/trackbacks/34774.html</trackback:ping><description><![CDATA[     摘要: 摘要Q此为我l公司内部新员工培训的实战演CZ子,ȝU教E,讲述了开发中的注意要点和常见错误Q目的主要是让他们适应企业U快速流水作业。由于是面对面讲解,所以没有详l的文档Q现在简单整理如下,希望对入门者有帮助?培训的目标:对下面的开发过E和模式快速理解和应用。基于我的UML架构-----〉Java POJOs代码------〉在pojos中做xdoclet标识-------〉基于ant生成*....  <a href='http://m.tkk7.com/jelver/articles/34774.html'>阅读全文</a><img src ="http://m.tkk7.com/jelver/aggbug/34774.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jelver/" target="_blank">冰河快狼</a> 2006-03-11 09:05 <a href="http://m.tkk7.com/jelver/articles/34774.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>W合oo惯例的表现层控制 [Ҏ钢]http://m.tkk7.com/jelver/articles/33457.html冰河快狼冰河快狼Fri, 03 Mar 2006 05:59:00 GMThttp://m.tkk7.com/jelver/articles/33457.htmlhttp://m.tkk7.com/jelver/comments/33457.htmlhttp://m.tkk7.com/jelver/articles/33457.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/33457.htmlhttp://m.tkk7.com/jelver/services/trackbacks/33457.htmlJava惯例的O/R 持久化,q揭CZ目前三层l构的重大问题,是三层的不l一。到目前为止Q仍焉于在Web界面上实现C/S模式?master-detail"Q?lookup"的快L用户交互?

目前常见的web application的结构,包含web browser/application server/database。database占据L的仍然是l典的E/R模型Q这个模型是Z行集的,因此?A target=_blank>VB/Delphi/Power Builder的实践中Qdata source/table set都是Z行集的,odbc/JDBC driver也都是基于行集的。view层的DbGrid也是Z行集的,和Entity模型对应得非常好Q开发简易直观,怿q是C/S模式得到q速推q的重点原因之一。“master-detail?"lookup"都是C/S模式下极为常见和直观的关联模式?/P>

但本质上QObject pascal/java都是面向对象的。在此,出C一ơ重大的不统一QOO vs E-R。出现的解决方式是EJB和O/R mapping 工具。EJB的entity bean是早期的entity装形式。但是和现在以hibernateZ表的先进工具Q对POJO执行持久化)比较hQ在OO与ER的对应上昑־W重而难于用。在q些工具中,代表OO与E-R融合的最本质的功能则是承树与表l构的对应关pRhibernate2支持整棵l承树与一个表对应、承树中每个类与一个表对应两种基本的对应关p,而hibernate 3引入的join标记则更可以二者融合,实现每个cd选与基类在同一个表中持久或者在新表中保存部分持久数据,可以说hibernate 3把这个对应的d完成得非常出艌Ӏ?master-detail","lookup"则对应hbm.XMLq样的映文件中?one-many","many-one"兌?/P>

database与java的融合完成之后,下一步,不可避免的就是现有的web client?A target=_blank>服务?/FONT>端代码之间的融合。从表面上看Qweb client大多采用html/JavaScript完成Q而服务器端采用java输出Q二者是单的命o/反馈的模型,q个模型从model 1发展到MVC的模型后Q编写代码变得清晎ͼ但是开发h员仍然发玎ͼ~写web app仍然不是一件简单的事情?A target=_blank>Struts/webwork仍然只是非常底层的基Q对~写客户端业务对象没有什么帮助。比如说,在服务器端javaE序建模Ӟ大家已经习惯用pojo分析订单/客户/产品Q但是在~写web clientӞstruts/webwork都只能帮助你完成面提交/反馈的流E,却不能帮助你分析客户端业务:新徏订单Ӟ选择了客户之后,判断此客h否有_的预收款Q这样一个简单用例在E序员心目中的反映仍然是每个字段的input tag,每个面post上来的model,以及如何用action的处理再ơ渲染下一个页面?/P>

最大的问题Q就是作现层的web client端代码与服务器端代码蕴含的语义脱节。具体表现在Q?BR> 在采用struts/webworkq样的MVCl构的时候,通常不会考虑在客Lq行业务控制Q比如由javascipt判断预收ƾ是否够。因此需要不断的多次面h才能完成整个逻辑?/P>

要解x问题Q通常可以采用把业务逻辑部分转移到客LQ以javascript + xmlhttp或javascript + web service,java Applet/application,甚至采用Officeq_(嵌入代码到excel)完成整个业务逻辑。也有很多问题:

1Q若要在客户端实C务逻辑Q可能客L代码没有对应Pojoq样的基object设施。javascript~Z如interfaceq样的基l构。excelҎ在这Ҏ加难于进行,因ؓ整个开发涉及到的语a太多Q造成开发难度加大,目控制困难?BR>直接后果是Q难于在客户端代码中定义"master-detail","lookup"{关联。就在目规划中在javascript中定义pojo(plain old javascript object)及其兌Q也难于利用hbm.xmlq样的现成关联描q?/P>

2Q客L基础设施难于q行界面元素l定。在处理大量数据ӞexcelҎ在此体现出杰出的优势Q客户对内置E序的excel的接受程度非帔RQ但~点是这UexcelE序难于做到xmlhttp可以L做到的动态查询等Ҏ?/P>

3Q客L基础设施难于与服务器端进行交互。xmlhttp以及web service可选,但是在企业应用中其低下效率可能会带来服务器的压力隐患Q降低性能和吞吐量。若excelҎQ则同样面着与服务器数据交互的难题。不是xmlhttpҎq是applicationҎQ都面着抛弃struts/webwork重新实现request/response dispatch的要求?/P>

4Q客L基础设施难于q行单元试。有junit4jsQport了junit 3.8.1Q但没有成熟的stub/mock工具。excelҎ在此几乎不可试?/P>

5, 客户端基设施难于调试。javascript~ZcMlog4jq样的log工具(log4js http://www.petrusrex.com/Programmes/jslib.htm q样的工兯q没有成?Q也难于q行断点跟踪。excelҎ倒是有完整的vba环境?/P>

6, 客户端基设施q行效率低。javascipt/vba都是解释语言Q难于实现复杂逻辑Q其性能军_只能用它们进行细_度的界面控制?/P>

7Q由于浏览器的分裂,造成语言的不标准Q应用程序难以跨q_使用。在IEq_上可以用behavior和expressionq种cAOP的操作,却无法在mozilla中实现?/P>

jsfҎ有望成ؓ备选方案,但是按照myfaces目前的情况,要实现更多的表现层控Ӟ才能完成更复杂灵zȝ控制?/P>

下面一?A target=_blank>软g开?/FONT>方式的突_向前看,可能出现设计方式的突_MDA是方向;另一个方向就是向后对具体实现的突_在类似webappq样的具体技术(除了webapp,application同样面;cM问题Q上Q对于是否能够把model的定义直接带入到表现层,JSF?A target=_blank>.net可能会有C轮竞争?BR>



冰河快狼 2006-03-03 13:59 发表评论
]]>
hibernate配置要点详谈http://m.tkk7.com/jelver/articles/32831.html冰河快狼冰河快狼Tue, 28 Feb 2006 05:30:00 GMThttp://m.tkk7.com/jelver/articles/32831.htmlhttp://m.tkk7.com/jelver/comments/32831.htmlhttp://m.tkk7.com/jelver/articles/32831.html#Feedback0http://m.tkk7.com/jelver/comments/commentRss/32831.htmlhttp://m.tkk7.com/jelver/services/trackbacks/32831.html1.两种配置文gQ?BR>A.hibernate.cfg.xml和B.hibernate.properties

A中可含映文件的配置Q而B中hard codes加映文件?BR>
A.Configuration config=new Configuration().config();
B. Configuration config=new Configuration();
config.addClass(TUser.class);

2.你不必一定用hibernate.cfg.xml或hibernate.propertiesq两文g名,你也不一定非得把配置文g攑֜Classes下,  File file=new File("c:\\sample\\myhibernate.xml");  Configuration config=new Configuration().config(file);

3. session.Flush() 强制数据库立卛_步,当用事务Ӟ不必用flush,事务提交自动调用flush在session关闭时也会调用flush

4. HibernateL使用对象cd作ؓ字段cd

5. XDoclet专门建立了hibernate doclet,是在java代码上加上一些java docTagQ后来再让XDoclet分析该java代码Q生成映文?

6.HQL子句本n大小写无养I但是其中出现的类名和属性名必须注意大小写区分?BR>
7.关系Q  Constrained : U束Q表明主控表的主键上是否存在一个外键(foreigh keyQ对其进行约束?BR>
property-ref:兌cM用于与主控类相关联的属性名Q默认ؓ兌cȝ主键属性名

单向一对多需在一斚w|,双向一对多需在双方进行配|?BR>
8.lazy=false:被动方的记录由hibernate负责记取Q之后存攑֜LҎ定的Collectioncd属性中

9. java.util.Set或net.sof.hibernate.collecton.Bagcd的Collection

10.重要Qinverse:用于标识双向兌中的被动方一端?BR>
inverse=false的一方(L方)负责l护兌关系.默认|false

11.batch-size:采用延迟加蝲特征Ӟ一ơ读入的数据数昨?BR>
12.一对多通过LҎ斎ͼL方ؓ一ҎQ?BR>
user.getAddresses().add(addr);

session.save(user);//通过L对象U联更新

13.在one-to-many 关系中,many 一方设Z动方Qinverse=falseQ将有助性能的改善。在一方设|关pLQinverse=true,卛_L权交l多方,  q样多方可主动从一方获得foreign key,然后一ơinsert卛_完工?BR>
addr.setUser(user);//讄兌的TUser对象

user.getAddresses().add(addr);

session.save(user);//U联更新

14.只有设ؓL方的一Ҏ兛_Q访问)Ҏ的属性,被动Ҏ不关心对方的属性的?BR>
15.one-to-many与many-to-one节点的配|属性不同:

一对多关系多了lazy和inverse两个属性多对多节点属性:

column:中间映射表中Q关联目标表的关联字D?BR>
class:cdQ关联目标类

outer-join:是否使用外联?BR>
注意:access是设|属性值的d方式?BR>
column是设|关联字Dc?BR>
16.多对多,注意两方都要讄inverse和lazy,cascade只能设ؓinsert-update

多对多关pMQ由于关联关pL两张表相互引用,因此在保存关pȝ态时必须对双方同时保存?BR>
group1.getRoles().add(role1);  role1.getGroups().add(group1);

session.save(role1);  session.save(group1);

17.关于vo和po  vol过hibernate定w处理Q就变成了po(该vo的引用将被容器保存,q且在session关闭时flush,因此po如果再传到其它地Ҏ变了Q就危险?    vo和po怺转换QBeanUtils.copyProperties(anotherUser,user);

18.对于save操作而言Q如果对象已l与Session相关联(卛_l被加入Session的实体容器中Q,则无需q行具体的操作。因Z后的Session.flushq程中,Hibernate 会对此实体容器中的对象进行遍历,查找出发生变化的实体Q生成ƈ执行相应的update 语句?BR>
19.如果我们采用了gq加载机Ӟ但希望在一些情况下Q实现非延迟?载时的功能,也就是说Q我们希望在Session关闭后,依然允许操作user的addresses 属?Hibernate.initializeҎ可以通过强制加蝲兌对象实现q一功能Q?q也正是我们Z么在~写POJOӞ必须用JDK Collection接口Q如Set,MapQ? 而非特定的JDK Collection实现c(如HashSet、HashMapQ申明Collection属性的 原因?BR>
20.事务Q从sessionFactory获得session,其自动提交属性就已经关闭(AutoCommit=false),此时若执行了jdbc操作Q如果不昑ּ调用session.BeginTransaction(),是不会执行事务操作的?BR>
jdbc transaction:Z同一个session(是同一个connection)的事?

jta transaction:跨sessionQ跨connectionQ事?

对于jta事务Q有三种实现ҎQ?BR>
A。UserTransaction tx=new InitialContext().lookup("...");
tx.commit();

B. 使用hibernate装的方法:(不推?

Transaction tx=session.beginTransaction();
tx.commit();
C. 使用ejb之sessionBean的事务技持方法,你只要在把需要在发布描述W中Q把需要jta事务的方法声明ؓrequire卛_

21.悲观锁,乐观锁:  乐观锁一般通过version来实玎ͼ注意version节点必须出现在id后?BR>
22.Hibernate中,可以通过Criteria.setFirstResult和Criteria.setFetchSizeҎ讑֮分页范围?BR>
Query接口中也提供了与其一致的ҎQhibernate主要在dialectcM实现在这个功能?BR>
23.cache

…?BR>
net.sf.ehcache.hibernate.Provider 


q需对ecache本nq配|?BR>
 


之后在映文件中指定各个映射实体的cache{略


Query.list()跟Query.iterate()的不同: 对于query.list()L通过一条sql语句获取所有记?然后其dQ填入pojoq回; 但是query.iterate()Q则是首先通过一条Select SQL 获取所有符合查询条件的记录?idQ再对这个id 集合q行循环操作Q通过单独的Select SQL 取出每个id 所对应的记 录,之后填入POJO中返回?BR>
也就是说Q对于list 操作Q需要一条SQL 完成。而对于iterate 操作Q需要n+1 条SQL。,listҎ不会从Cache中读取数据。iterator却会?BR>
24.ThreadLocal:它会为每个线E维护一个私有的变量I间。实际上Q?其实现原理是在JVM 中维护一个MapQ这个Map的key 是当前的线E对象,而value则是 U程通过ThreadLocal.setҎ保存的对象实例。当U程调用ThreadLocal.getҎӞ ThreadLocal会根据当前线E对象的引用Q取出Map中对应的对象q回?BR>
q样QThreadLocal通过以各个线E对象的引用作ؓ区分Q从而将不同U程的变量隔d来?BR>
25.Hibernate官方开发手册标准示?

public class HibernateUtil { private static SessionFactory sessionFactory;
static { try { // Create the SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
} catch (HibernateException ex) { throw new RuntimeException( "Configuration problem: " + ex.getMessage(), ex );
} } public static final ThreadLocal session = new ThreadLocal();
public static Session currentSession() throws HibernateException { Session s = (Session) session.get();
// Open a new Session, if this Thread has none yet if (s == null) { s = sessionFactory.openSession();
session.set(s);
} return s;
} public static void closeSession() throws HibernateException { Session s = (Session) session.get();
session.set(null);
if (s != null) s.close();
} }

26.通过filter实现session的重用:

public class PersistenceFilter implements Filter { protected static ThreadLocal hibernateHolder = new ThreadLocal();
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { hibernateHolder.set(getSession());
try { …?chain.doFilter(request, response);
…?} finally { Session sess = (Session)hibernateHolder.get();
if (sess != null) { hibernateHolder.set(null);
try { sess.close(); } catch (HibernateException ex) { throw new ServletException(ex);
} } } } ……}

27.Spring的参数化事务理功能相当强大Q笔者徏议在ZSpring Framework的应?开发中Q尽量用容器管理事务,以获得数据逻辑代码的最佛_L?BR>
public class UserDAO extends HibernateDaoSupport implements IUserDAO { public void insertUser(User user) { getHibernateTemplate().saveOrUpdate(user);
} }

上面的UserDAO实现了自定义的IUserDAO接口Qƈ扩展了抽象类Q?BR>
HibernateDaoSupport HibernateSupport实现了HibernateTemplate和SessionFactory实例的关联?BR>
HibernateTemplate对Hibernate Session操作q行了封装,?HibernateTemplate.executeҎ则是一装机制的核?BR>
*在spring的配|文仉Q移植了整个hibernate.cfg.xml的内宏V?/P>

冰河快狼 2006-02-28 13:30 发表评论
]]>
hibernatel合查询(查询l果从多张表中找出非常普遍,该例子教你实现查询结果bean的实? Q{Q?/title><link>http://m.tkk7.com/jelver/articles/32343.html</link><dc:creator>冰河快狼</dc:creator><author>冰河快狼</author><pubDate>Fri, 24 Feb 2006 13:01:00 GMT</pubDate><guid>http://m.tkk7.com/jelver/articles/32343.html</guid><wfw:comment>http://m.tkk7.com/jelver/comments/32343.html</wfw:comment><comments>http://m.tkk7.com/jelver/articles/32343.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://m.tkk7.com/jelver/comments/commentRss/32343.html</wfw:commentRss><trackback:ping>http://m.tkk7.com/jelver/services/trackbacks/32343.html</trackback:ping><description><![CDATA[<SPAN style="COLOR: #333399"> <P><SPAN style="COLOR: #333399">查询l果从多张表中找出非常普遍,该例子教你实现查询结果bean的实?BR>1 插寻l果beanQA的属性a、b来源于已影射的bean M,N<BR>class A<BR>{<BR>       String a,b;</P> <P>       public A(String a,String b)<BR>           {<BR>             this.a=a;<BR>             thia.b=b;<BR>           }<BR>}</P> <P>2 ~写查询Ҏ</P> <P>  Query q;<BR>  List l = null;<BR>  q = session.createQuery("select new A(M.a,N.b) from M as M,N as N where M.id=N.id");</P> <P>3 资源载入A<BR><import class="package.A"/></P></SPAN></SPAN><img src ="http://m.tkk7.com/jelver/aggbug/32343.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://m.tkk7.com/jelver/" target="_blank">冰河快狼</a> 2006-02-24 21:01 <a href="http://m.tkk7.com/jelver/articles/32343.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://m.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://linanhotel.com" target="_blank">ƬĻ</a>| <a href="http://wwwfac286.com" target="_blank">2048޾Ʒ</a>| <a href="http://51nianyefan.com" target="_blank">avһ</a>| <a href="http://zjtuhui.com" target="_blank">ũѸһëƬѿƵ</a>| <a href="http://www97544.com" target="_blank"></a>| <a href="http://dzhankong.com" target="_blank">Ƶվ</a>| <a href="http://625r.com" target="_blank">ɫ˿ѹۿվ</a>| <a href="http://zgbeian.com" target="_blank">ձ</a>| <a href="http://www2626cf.com" target="_blank">ڵƷƵ</a>| <a href="http://czxgjt.com" target="_blank">av</a>| <a href="http://fsszx888.com" target="_blank">ձ˵ɫwwwһ</a>| <a href="http://k9l4.com" target="_blank">޴߶רһ</a>| <a href="http://wuiso.com" target="_blank">Ů18ëƬѹۿ</a>| <a href="http://zhaosaohuo.com" target="_blank">ƷAV</a>| <a href="http://9hao66.com" target="_blank">ֳִˬƵ </a>| <a href="http://bisi666.com" target="_blank">ާžƷ</a>| <a href="http://dunyny.com" target="_blank">wwwѻɫ</a>| <a href="http://9akk.com" target="_blank">gvgvͬ</a>| <a href="http://038037.com" target="_blank">þþƷƵѿ</a>| <a href="http://818812.com" target="_blank">һɫƬ</a>| <a href="http://siminglighting.com" target="_blank">ĻӰԺ߲</a>| <a href="http://dyj696.com" target="_blank">һػɫѴƬƵ</a>| <a href="http://34007c.com" target="_blank">Ļ</a>| <a href="http://ynxxrh.com" target="_blank">þùƷƵ</a>| <a href="http://0769wwt.com" target="_blank">޳վ</a>| <a href="http://hzczj.com" target="_blank">ҹѲëƬ</a>| <a href="http://zkqzdq.com" target="_blank">ѹվ߹ۿҪ </a>| <a href="http://3x79.com" target="_blank">ۺɫ鶹</a>| <a href="http://www-7607.com" target="_blank">ѸӰ</a>| <a href="http://srvz83.com" target="_blank">yellowվ</a>| <a href="http://bwgdbjb.com" target="_blank">þþƷav鶹ɫ</a>| <a href="http://kan63.com" target="_blank">޾ƷѶ</a>| <a href="http://118762.com" target="_blank">һëƬƬƵֻ</a>| <a href="http://avqvod.com" target="_blank">avר߲</a>| <a href="http://www-474749.com" target="_blank"></a>| <a href="http://jhmydxx.com" target="_blank">һƬƵ</a>| <a href="http://mtripmall.com" target="_blank">ڳ߿</a>| <a href="http://tha2008.com" target="_blank">˳ӰԺۿ</a>| <a href="http://aiwoqi.com" target="_blank">8888ɫ߹ۿѿ</a>| <a href="http://9156892.com" target="_blank">޾Ƶ</a>| <a href="http://42329c.com" target="_blank">Ůaþþ91</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>