??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲高清在线视频,国产精品夜夜嗨,欧美精品一二三http://www.aygfsteel.com/Kira-2006/-仅仅是一阵风也Ş?偏偏是这h? 仅仅是一场梦也Ş?偏偏是如此的真实,zh-cnSun, 18 May 2025 20:08:05 GMTSun, 18 May 2025 20:08:05 GMT60深入出HibernateMW记--Hibernate常见优化{略http://www.aygfsteel.com/Kira-2006/articles/203632.htmlKira-2006Kira-2006Wed, 28 May 2008 12:37:00 GMThttp://www.aygfsteel.com/Kira-2006/articles/203632.htmlhttp://www.aygfsteel.com/Kira-2006/comments/203632.htmlhttp://www.aygfsteel.com/Kira-2006/articles/203632.html#Feedback0http://www.aygfsteel.com/Kira-2006/comments/commentRss/203632.htmlhttp://www.aygfsteel.com/Kira-2006/services/trackbacks/203632.html 1. 在允许的情况下,选用最新版本的Hibernate的发行版?br /> 2. 制定合理的缓存策略?br /> 3. 采用合理的Session理机制?br /> 4. 量使用延迟加蝲Ҏ?br /> 5. 讑֮合理的批处理参数(batch_size)?br /> 6. 如果可能Q选用UUID作ؓ主键生成器?br /> 7. 如果可能Q选用Zversion的乐观锁{略替代悲观锁?br /> 8. 开发过E中Q打开Hibernate的SQL日志输出Q通过观察Hibernate生成的sql语句q一步了解实现原理,从而指定更好的实现{略?

Kira-2006 2008-05-28 20:37 发表评论
]]>
深入出Hibernate学习W记--Criteria Queryhttp://www.aygfsteel.com/Kira-2006/articles/199774.htmlKira-2006Kira-2006Sat, 10 May 2008 14:59:00 GMThttp://www.aygfsteel.com/Kira-2006/articles/199774.htmlhttp://www.aygfsteel.com/Kira-2006/comments/199774.htmlhttp://www.aygfsteel.com/Kira-2006/articles/199774.html#Feedback0http://www.aygfsteel.com/Kira-2006/comments/commentRss/199774.htmlhttp://www.aygfsteel.com/Kira-2006/services/trackbacks/199774.html
Criteria criteria=session.createCriteria(TUser.class);
criteria.add(Expression.eq(
"name","Erica"));
criteria.add(Expression.eq(
"sex",new Integer(1));
q里的criteria实例本质上是对SQL“select * from t_user where name='Erica' and sex=1”的封装?br /> Hibernate在运行期会根据Criteria中指定的查询条g生成相应的SQL语句?br />
Criteria查询表达?br />     Criteria本n只是一个容器,具体的查询条件要通过Criteria.addҎd到Criteria实例中?br />
Ҏ 描述
Expression.eq

对应SQL “field=value”表达?/p>

如:Expression.eq("name","Erica")

Expression.allEq 参数Z个Map对象Q其中包含了多个属?值对应关pR相当于多个Expression.eq关系的叠?/td>
Expression.gt 对应SQL“field>value”表达?/td>
Expression.ge 对应SQL“field>=value”表达?/td>
Expression.lt 对应SQL“field<value”表达?/td>
Expression.le 对应SQL“field<=value”表达?/td>
Expression.between

对应SQL“between”表达?/p>

如:Expression.between("age",new Integer(13),new Integer(50));

Expression.like 对应SQL"field like valule"表达?/td>
Expression.in 对应SQL“field in...”表达?/td>
Expression.eqproperty 用于比较两个属性之间的|对应SQL“field>field”
Expression.gtProperty 用于比较两个属性之间的|对应SQL“field>=field”
Expression.ltProperty 用于比较两个属性之间的|对应SQL"field<field"
Expression.leProperty 用于比较两个属性之间的|对应SQL"field<=field"
Expression.and

and关系l合Q如Q?/p>

Expression.add(Expression.eq("name","Erica"),Expression.add("sex",new Integer(1)))

Expression.or

or关系l合Q如Q?/p>

Expression.or(Expression.eq("name","Erica"),Expression.add("sex",new Integer(1)))

Expression.sql

作ؓ补充Q本Ҏ提供了原生SQL语法的支持,我们可以通过q个Ҏ直接通过SQL语句限定查询条g

下面的代码返回所有名UC"Erica"其实的记录:
Expression.sql("lower({alias}.name) like lower(?)","Erica%",Hibernate.STRING);
其中?{alias}"Hibernate在运行期使用当前兌的POJO别名替换


在Hibernate3中,引入了RestrictionscM为Expression的替代?br />
CZ查询
    ExamplecdCCriteria接口Q同P它也可以用作Criteria的查询条件。Example的作用是Q根据已有对象,查找属性与之相W的其他对象?br />
Criteria criteria=session.CreateCriteria(TUser.class);
TUser exampleUser
=new TUser();
exapleUser.getName(
"Erica");
criteria.add(Example.create(exampleUser));

List
<TUser> list=criteria.list();

for(TUser user:list){
System.out.println(user.getName());
}
新徏一个TUser对象exampleUserQƈ作ؓ范本Q查询所有name属性与之相同的记录?br />
复合查询
Criteria criteria=session.createCriteria(TUser.class);
Criteria addrCriteria=criteria.createCriteria("addresses");
addrCriteria.add(Expression.like("addresses","%shanghai%"));


List
<TUser> list = criteria.list();
for(TUser user:list){
    System.out.println(user.getName());
    Set
<TAddress> addrSet=user.getAddresses();
    
for(TAddress addr:addrSet){
        System.out.println(addr.getAddress());
    }

}
U色部分是我们新增的复合查询条Ӟ可以看到Q我们可以通过Criteria.createCriteriaҎ在原有Criteria对象的基上构建复合查询?br />
DetachedCriteria
   Hibernate2中,Criteria生命周期位于其宿主Session生命周期中,也就是说Q由某个session创徏的Criteria实例Q一旦session销毁,那么此Criteria实例也随之失效?br />     Hibernate3中引入了DetachedCriteriaQDetachedCriteria可以qsession实例独立存在Q这P我们可以将某些通用的Criteria查询条gq行抽离Q每ơ用时再与当前session实例l定以获得更好的代码重用效果?br />
DetachedCriteria deCriteria=DetachedCriteria.forClass(TUser.class);
deCriteria.add(Expression.eq(
"name","Erica"));
deCriteria.add(Expression.eq(
"sex",new Integer(1)));

Criteria criteria=deCriteria.getExecutableCriteria(session);
List<TUser> list=criteria.list();
for(TUser user:list){
    System.out.println(user.getName());
}
DetachedCriteria的生存周期与session实例无关Q我们可以独立创建DetachedCriteria实例Qƈ在需要用时与session相绑定,从而获得运行期Criteria实例。这P我们可以将查询逻辑和Criteria实例分离Q以获得最大化代码的重用效果?br />     DetachedCriteria也可以用于子查询表达Q?br />
DetachedCriteria aveAge=DetachedCriteria.forClass(TUser.class);
avgAge.setProjection(Projections.avg(
"age"));

Criteria criteria
=session.createCriteria(TUser.class);
criteria.add(Subqueries.propertyGT("age",avgAge));

通过Subqueries我们可以DetachedCriteriaU_查询表达式,反映在SQL上则是一个典型的子查询语句。上例生成的SQL语句大致如:select ... from T_User where age > (select avg(age) from T_User)

Criteria高Ҏ?br />     限定q回的记录范?/strong>
        通过criteria.setFirstResult/setMaxResultsҎ可以限制一ơ查询返回的记录范围Q?br />
Criteria criteria=session.createCriteria(TUser.class);
//限定查询q回索结果中Q从100条结果开始的20条记?/span>
criteria.setFirstResult(100);
criteria.setMaxResults(
20);
        记录排序Q?br />
//
//
Criteria criteria=session.createCriteria(TUser.class);
criteria.add(Expression.eq(
"groupId",new Integer(2)));

criteria.addOrder(Order.asc(
"name"));
criteria.addOrder(Order.desc(
"groupId"));

    分组与统?br />         在Hibernate3中,我们q可以通过Criteria完成分组和统计。分l、统计表辑ּ由Hibernate3新引入的Projections Classq行装?br />
Criteria criteria=session.createCriteria(TUser.class);
criteria.setProjection(Projections.groupProperty("age"));


List
<TUser> list=criteria.list();
for(TUser user:list){
    System.out.println(user);
}

上例对当前的TUser记录按照q龄q行分组。通过Projections.groupPropertyҎQ我们指定了用于分组的目标属?#8220;age”。生成的SQL语句Qselect this.age as y0_ from T_User this_group by this_.age?br />     另外Q对于多条gl合的统计、分l功能,我们可以借助ProjectionList完成Q下面的例子中,我们l计了各个年龄层ơ中的用h量:

ProjectionList projectionlist=Projections.ProjectionList();
projectionList.add(Projections.groupProperty(
"age"));
projectionList.add9Projections.rowCount());

Criteria criteria
=session.createCriteria(TUser.class);
criteria.setProjection(projectionList);

 

 



Kira-2006 2008-05-10 22:59 发表评论
]]>
深入出Hibernate学习W记--数据兌http://www.aygfsteel.com/Kira-2006/articles/199736.htmlKira-2006Kira-2006Sat, 10 May 2008 12:08:00 GMThttp://www.aygfsteel.com/Kira-2006/articles/199736.htmlhttp://www.aygfsteel.com/Kira-2006/comments/199736.htmlhttp://www.aygfsteel.com/Kira-2006/articles/199736.html#Feedback0http://www.aygfsteel.com/Kira-2006/comments/commentRss/199736.htmlhttp://www.aygfsteel.com/Kira-2006/services/trackbacks/199736.html一对一兌
    主键兌Q?/strong>即两张表通过主键形成一对一映射关系?/p>     用户TUser与护照TPassport兌
    TUer.hbm.xml
    
<hibernate-mapping>
<class
    
name="TUser"
    table
="T_User">
    
    
<one-to-one 
        
name="passport"
        class
="TPassport"
        cascade
="all"
        outer-join
="true"/>
    
</class>
</hibernate-mapping>
cascade="all"表示U联关系讄?#8220;all”Q即无论ȝ房执行Q何操作,都会兌cL行相同的操作?br />
    TPassport.hbm.xml
<hibernate-mapping>
<class
    
name="TPassport"
    table
="T_Passport">
    
<one-to-one
        
name="user"
        class
="TUser"
        constrain
="true">
    .
</class>
</hibernate-mapping>

    
constrain必须讑֮?#8220;true”Q以告知Hibernate当前主键上存在一个约束?br />    
    试代码Q?br />
TUser user = new TUser();
user.setAge(
new Integer(20));
user.setName(
"Carin");

TPassport passport 
= new TPassport();
passport.setSerial(
"PCN759386");
passport.setExpiry(
new Integer(20080101));

//怺讄兌
passport.setUser(user);
user.setPassport(passport);

Transaction tx 
= sessioin.beginTransaction();
//׃TUsercȝone-to-one节点被设|成
//cascade=“all”其关联的passport对象被U联保存
session.save(user);

tx.commit();
    以下代码完成兌对象的读取:
TUser user=(TUser)Hibernate.load(TUser.class,new Integer(15));
System.out.println(
"User name=>"+user.getName());
System.out.println(
"Passport Serial=>"+user.getPassport().getSerial());
    控制台输出:
Hibernate:select tuser0_.id as id1_,
from T_USER tuser0_
left outer join
T_PASSPORT tpassport1_ on tuser0_.id
=tpassport1_.id
where tuser0_.id
=?
User name
=>Carin
Passport Serial
=>PCN759386
Hibernate通过left outer joinT_User表及其关联的T_Passport表同时读入,因ؓ此时out-join=“true”。若讄为falseQ则会分开d两个表?br />
一对多兌
    用户TUser和地址TAddress的一对多兌?br />     单向一对多兌
        L方TUser的映配|:
<hibernate-mapping>
<class
    
name="TUser"
    table
="t_user"
    dynamic-update
="true"
    dynamic-insert
="true">
.
    
<set
        
name="address"
        table
="t_address"
        cascade
="all"
        order-by
="zipcode asc">
        
<key column="user_id"/>
        
<one-to-many class="TAddress">
    
</set>

</class>
</hibernate>
被动方TAddress的记录由Hibernate负责dQ之后存攑֜L方TUser指定的Collectioncd属性中?br /> 单向一对多的实现比较简单,但是存在一个问题,׃是单向关联,Z保持兌关系Q我们只能通过L方对被动方进行联更新。如果被兌方的兌字段?#8220;NOT NULL”Q当Hibernate创徏或者更新时Q可能出现约束违例?br />
双向多对一兌
    实际上是“一对多”?#8220;多对一”兌的组合。也是说我们必dL斚w|一对多关系的基上,在被控方配置与其对应的多对一兌?br />     TUser.hbm.xml
<hibernate-mapping>
<class
    
name="TUser"
    table
="t_user"
    dynamic-update
="true"
    dynamic-insert
="true">
.
    
<set
        
name="address"
        table
="t_address"
        lazy
="false"
        inverse
="true"
        cascade
="all"
        sort
="unsorted"
        order-by
="zipcode asc">
        
<key column="user_id"/>
        
<one-to-many class="TAddress"/>
    
</set>
.
</class>
</hibernate>
inverse="true"QTUser不在作ؓL方,而是关联关pȝl护工作交给兌对象TAddress来做?br /> 在one-to-many关系中,many一方设|ؓL方(inverse=“true”Q将有助于性能的改善?br />     TAddress.hbm.xml
<hibernat-mapping>
<class
    
name="TAddress"
    table
="t_address"
    dynamic-update
="false"
    dynamic-insert
="false">
.
    
<many-to-one
        
name="user"
        class
="TUser"
        cascade
="none"
        outer-join
="auto"
        update
="true"
        insert
="true"
        access
="property"
        column
="user_id"
        not-null
="true"/>
.
</class>
</hibernate-mapping>

多对多关?br /> 需要借助中间表来完成多对多映信息的保存?br />     ׃多对多关联的性能不佳Q由于引入了中间表,一ơ读取操作需要反复多ơ查询)Q因此在设计中应该避免大量用。同Ӟ在多对多关系中,应根据情况,采取延迟加蝲机制来避免无谓的性能开销?br />     TGroup与TRole的多对多兌Q?br />     TGroup.hbm.xmlQ?br />
<hibernate-mapping>
<class
    
name="TGroup"
    table
="t_group"
    dynamic-update
="false"
    dynamic-insert
="false">
.
    
<set
        
name="roles"
        table
="t_group_role"
        lazy
="false"
        inverse
="false"
        cascade
="save-update">
        
<key column="group_id"/>
        
<many-to-many
            
class="TRole"
            column
="role_id"/>
    
</set>
.
</class>
</hibernate>
t_group_role为t_group与t_role之间的映表Q它保存了group和role之间的映关pR?br /> cascade=“save-update”Q对于多对多逻辑而言Q很出现删除一斚w要联删除所有关联数据的情况Q如删除一个groupQ一般不会删除其中包含的Role?br /> column=“group_id”映射表中对于t_group表记录的标识字段?br />  
    TRole.hbm.xmlQ?br />
<hibernate-mapping>
<class
    
name="TRole"
    table
="t_role"
    dynamic-update
="false"
    dynamic-insert
="false">
.
    
<set
        
name="groups"
        table
="t_group_role"
        lazy
="false"
        inverse
="true"
        cascade
="save-update"
        sort
="unsorted">
        
<key column="role_id"/>
        
<many-to-many 
            
class="TGroup"
            column
="group_id"
            outer-join
="auto"/>
    
</set>
.
</class>
</hibernate>
多对多关pMQ由于关联关pL两张表相互引用,因此在保存关联状态时必须对双方同时保存?br />

Kira-2006 2008-05-10 20:08 发表评论
]]>
深入出HibernateW记--1.2.1持久化设计与解?/title><link>http://www.aygfsteel.com/Kira-2006/articles/197776.html</link><dc:creator>Kira-2006</dc:creator><author>Kira-2006</author><pubDate>Fri, 02 May 2008 11:33:00 GMT</pubDate><guid>http://www.aygfsteel.com/Kira-2006/articles/197776.html</guid><wfw:comment>http://www.aygfsteel.com/Kira-2006/comments/197776.html</wfw:comment><comments>http://www.aygfsteel.com/Kira-2006/articles/197776.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Kira-2006/comments/commentRss/197776.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Kira-2006/services/trackbacks/197776.html</trackback:ping><description><![CDATA[     摘要: 解耦合的设计目标:     1. 应用层解耦合--应用逻辑与数据逻辑相分R?    2. 资源层解耦合--逻辑l构与物理结构相分离? DAO模式Q即Data Accessor模式和Active Domain Object模式?    Data Accessor模式...  <a href='http://www.aygfsteel.com/Kira-2006/articles/197776.html'>阅读全文</a><img src ="http://www.aygfsteel.com/Kira-2006/aggbug/197776.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Kira-2006/" target="_blank">Kira-2006</a> 2008-05-02 19:33 <a href="http://www.aygfsteel.com/Kira-2006/articles/197776.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate---SQL中datetime的映?/title><link>http://www.aygfsteel.com/Kira-2006/archive/2008/04/27/196459.html</link><dc:creator>Kira-2006</dc:creator><author>Kira-2006</author><pubDate>Sun, 27 Apr 2008 05:56:00 GMT</pubDate><guid>http://www.aygfsteel.com/Kira-2006/archive/2008/04/27/196459.html</guid><wfw:comment>http://www.aygfsteel.com/Kira-2006/comments/196459.html</wfw:comment><comments>http://www.aygfsteel.com/Kira-2006/archive/2008/04/27/196459.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Kira-2006/comments/commentRss/196459.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Kira-2006/services/trackbacks/196459.html</trackback:ping><description><![CDATA[<p>?nbsp;Hibernate学习?通用的设|时间的映射如下:</p> <p><property name="addtime" column="add_time"  type="date" not-null="true"></p> <p>如果按照上面的提C?则发?生成的时?只能_到日,?2007-08-08,而我们需要的?2007-08-08 21:21:34</p> <p>有h提示可以Ҏjava.sql.Datecd,我没试过,因ؓ在程序中用的多的?java.util.Date</p> <p>其实,通过单的修改XML文g可以得?007-08-08 21:21:34</p> <p><property name="addTime"><br />             <column name="add_time"<br />                     sql-type="datetime" not-null="true"/><br />         </property></p> <p>q样修改,应该更可以被大家所接受</p> <img src ="http://www.aygfsteel.com/Kira-2006/aggbug/196459.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Kira-2006/" target="_blank">Kira-2006</a> 2008-04-27 13:56 <a href="http://www.aygfsteel.com/Kira-2006/archive/2008/04/27/196459.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>myeclipse自带Struts~少jar文gQdatasource配置http://www.aygfsteel.com/Kira-2006/archive/2008/04/26/196313.htmlKira-2006Kira-2006Sat, 26 Apr 2008 10:44:00 GMThttp://www.aygfsteel.com/Kira-2006/archive/2008/04/26/196313.htmlhttp://www.aygfsteel.com/Kira-2006/comments/196313.htmlhttp://www.aygfsteel.com/Kira-2006/archive/2008/04/26/196313.html#Feedback2http://www.aygfsteel.com/Kira-2006/comments/commentRss/196313.htmlhttp://www.aygfsteel.com/Kira-2006/services/trackbacks/196313.html 在应用过E中想用DBCP数据源,遇到了一些问?配置环境:Eclipse3.1,Myeclipse4.02

   在struts-config.xml的设计视图中可以选择"新增数据?QMyeclipse会弹出向导窗口,q里使用的缺省DataSource的Type?org.apache.struts.util.GenericDataSource"Q而用DBCP数据源的话需要改?org.apache.commons.dbcp.BasicDataSource"Q当然了通过Myeclipse插入的Struts框架中是~少DBCP的包的,好在Tomcat用的是q个Q因此能够在Tomcat\common\lib目录中找到需要的包:
   1.commons-dbcp-1.2.1.jar
   2.commons-pool-1.2.jar
   在工E的配置路径中加入即?也可以从apache的网站上 下蝲

   Myeclipse的向导窗口中h一些属性栏Q在q里可以输入数据源用的Drivercd以及URLQ当然还有用户名/密码?br />    属性栏全部都配|完毕后Q会在struts-config.xml文g中加?lt;data-sources>标签Q这里面?lt;data-source>x刚刚新徏的数据源配置参数Q这里需要手工更改:

      1.增加<data-source>标签的type属性,q样 <data-source type="org.apache.commons.dbcp.BasicDataSource">Q?br />       2.属性名 driverClass 改ؓ dirverClassNameQ?br />       3.属性名 user 改ؓusernameQ注意n是小写的Q?br />       4.L属性标{?loginTimeout?/p>

   改完以后可以启动Tomcat看效果了



Kira-2006 2008-04-26 18:44 发表评论
]]>
【{帖?1条面向对象设计的l验原则-《OOD启示录》ArthurJ.Rielhttp://www.aygfsteel.com/Kira-2006/articles/196308.htmlKira-2006Kira-2006Sat, 26 Apr 2008 10:40:00 GMThttp://www.aygfsteel.com/Kira-2006/articles/196308.htmlhttp://www.aygfsteel.com/Kira-2006/comments/196308.htmlhttp://www.aygfsteel.com/Kira-2006/articles/196308.html#Feedback0http://www.aygfsteel.com/Kira-2006/comments/commentRss/196308.htmlhttp://www.aygfsteel.com/Kira-2006/services/trackbacks/196308.html 61条面向对象设计的l验原则


(1)所有数据都应该隐藏在所在的cȝ内部。p13
 
(2)cȝ使用者必M赖类的共有接口,但类不能依赖它的使用者。p15
 
(3)量减少cȝ协议中的消息。p16
 
(4)实现所有类都理解的最基本公有接口[例如Q拷贝操?深拷贝和拷?、相{性判断、正输出内宏V从ASCII描述解析{等]?p16
 
(5)不要把实现细?例如攄q代码的私有函?攑ֈcȝ公有接口中。p17
如果cȝ两个Ҏ有一D公׃码,那么可以创Z个防止这些公׃码的U有函数?/td>
 
(6)不要以用h法用或不感兴趣的东西扰q的公有接口。p17
 
(7)cM间应该零耦合Q或者只有导合关系。也卻I一个类要么同另一个类毫无关系Q要么只使用另一个类的公有接口中的操作?p18
 
(8)cd该只表示一个关键抽象。p19
包中的所有类对于同一cL质的变化应该是共同闭的。一个变化若对一个包影响Q则对包中的所有类产生影响Q而对其他的包不造成M影响 .
 
(9)把相关的数据和行为集中放|。p19
设计者应当留意那些通过get之类操作从别的对象中获取数据的对象。这U类型的行ؓ暗示着q条l验原则被违反了?/td>
 
(10)把不相关的信息放在另一个类?也即Q互不沟通的行ؓ)。p19
朝着E_的方向进行依?
 
(11)保你ؓ之徏模的抽象概念是类Q而不只是对象扮演的角艌Ӏp23
 
(12)在水qx向上可能统一地分布系l功能,也即Q按照设计,层cd当统一地共享工作。p30
 
(13)在你的系l中不要创徏全能c?对象。对名字包含Driver、Manager、System、Susystem的类要特别多加小心。p30
规划一个接口而不是实C个接口?/td>
 
(14)对公共接口中定义了大量访问方法的cd加小心。大量访问方法意味着相关数据和行为没有集中存放。p30
 
(15)对包含太多互不沟通的行ؓ的类多加心。p31
q个问题的另一表现是在你的应用E序中的cȝ公有接口中创Z很多的get和set函数?/td>
 
(16)在由同用L面交互的面向对象模型构成的应用程序中Q模型不应该依赖于界面,界面则应当依赖于模型。p33
 
(17)可能地按照现实世界建模(我们常常Z遵守pȝ功能分布原则、避免全能类原则以及集中攄相关数据和行为的原则而违背这条原? 。p36
 
(18)从你的设计中去除不需要的cRp38
一般来_我们会把q个c降U成一个属性?/td>
 
(19)去除pȝ外的cRp39
pȝ外的cȝ特点是,抽象地看它们只往pȝ领域发送消息但q不接受pȝ领域内其他类发出的消息?
 
(20)不要把操作变成类。质疑Q何名字是动词或者派生自动词的类Q特别是只有一个有意义行ؓ的类。考虑一下那个有意义的行为是否应当迁Ud已经存在或者尚未发现的某个cM。p40
 
(21)我们在创建应用程序的分析模型时常常引入代理类。在设计阶段Q我们常会发现很多代理没有用的,应当去除。p43
 
(22)量减少cȝ协作者的数量。p52
一个类用到的其他类的数目应当尽量少?
 
(23)量减少cd协作者之间传递的消息的数量。p55
 
(24)量减少cd协作者之间的协作量,也即Q减类和协作者之间传递的不同消息的数量。p55
 
(25)量减少cȝ扇出Q也卻I减少cd义的消息数和发送的消息数的乘积。p55
 
(26)如果cd含另一个类的对象,那么包含cd当给被包含的对象发送消息。也卻I包含关系L意味着使用关系。p55
 
(27)cM定义的大多数Ҏ都应当在大多数时间里使用大多数数据成员。p57
 
(28)cd含的对象数目不应当超q开发者短期记忆的定w。这个数目常常是6。p57
当类包含多于6个数据成员时Q可以把逻辑相关的数据成员划分ؓ一l,然后用一个新的包含类d含这一l成员?
 
(29)让系l功能在H而深的承体pM垂直分布。p58
 
(30)在实现语义约束时Q最好根据类定义来实现。这常常会导致类泛滥成灾Q在q种情况下,U束应当在类的行Z实现Q通常是在构造函C实现Q但不是必须如此。p60
 
(31)在类的构造函C实现语义U束Ӟ把约束测试放在构造函数领域所允许的尽量深的包含层ơ中。p60
 
(32)U束所依赖的语义信息如果经常改变,那么最好放在一个集中式的第3方对象中。p60
 
(33)U束所依赖的语义信息如果很改变,那么最好分布在U束所涉及的各个类中。p60
 
(34)cdȝ道它包含什么,但是不能知道谁包含它。p61
 
(35)׃n字面范围(也就是被同一个类所包含)的对象相互之间不应当有用关pRp61
 
(36)l承只应被用来ؓ特化层次l构建模。p74
 
(37)zcdȝ道基c,基类不应该知道关于它们的zcȝM信息。p74
 
(38)基类中的所有数据都应当是私有的Q不要用保护数据。p75
cȝ设计者永q都不应该把cȝ使用者不需要的东西攑֜公有接口中?
 
(39)在理ZQ承层ơ体pd当深一点,深好。p77
 
(40)在实践中Q承层ơ体pȝ深度不应当超Z个普通h的短期记忆能力。一个广为接受的深度值是6。p77
 
(41)所有的抽象c都应当是基cRp81
 
(42)所有的基类都应当是抽象cRp82
 
(43)把数据、行为和/或接口的共性尽可能地放到承层ơ体pȝ高端。p85
 
(44)如果两个或更多个cd享公共数?但没有公p?Q那么应当把公共数据攑֜一个类中,每个׃nq个数据的类都包含这个类?p88
 
(45)如果两个或更多个cL共同的数据和行ؓ(是Ҏ)Q那么这些类的每一个都应当从一个表CZq些数据和方法的公共基类l承?p89
 
(46)如果两个或更多个cd享公共接?指的是消息,而不是方?Q那么只有他们需要被多态地使用Ӟ他们才应当从一个公共基cȝѝ?p89
 
(47)对对象类型的昄的分情况分析一般是错误的。在大多数这L情况下,设计者应当用多态。p89
 
(48)对属性值的昄的分情况分析常常是错误的。类应当解耦合成一个承层ơ结构,每个属性值都被变换成一个派生类?p96
 
(49)不要通过l承关系来ؓcȝ动态语义徏模。试囄静态语义关pL为动态语义徏模会D在运行时切换cd。p97
 
(50)不要把类的对象变成派生类。对M只有一个实例的zc都要多加小心。p99
 
(51)如果你觉得需要在q行时刻创徏新的c,那么退后一步以认清你要创徏的是对象。现在,把这些对象概括成一个类?p103
 
(52)在派生类中用I方?也就是什么也不做的方?来覆写基cM的方法应当是非法的。p103
 
(53)不要把可选包含同对承的需要相h。把可选包含徏模成l承会带来泛滥成灄cRp108
 
(54)在创建承层ơ时Q试着创徏可复用的框架Q而不是可复用的组件。p112
 
(55)如果你在设计中用了多重l承Q先假设你犯了错误。如果没犯错误,你需要设法证明。p120
 
(56)只要在面向对象设计中用到了承,问自׃个问题:(1)zcL否是它承的那个东西的一个特D类型?(2)基类是不是派生类的一部分Qp121
 
(57)如果你在一个面向对象设计中发现了多重承关p,保没有哪个基类实际上是另一个基cȝzcRp122
 
(58)在面向对象设计中如果你需要在包含关系和关联关p间作出选择Q请选择包含关系。p123
 
(59)不要把全局数据或全局函数用于cȝ对象的薄记工作。应当用类变量或类Ҏ。p140
 
(60)面向对象设计者不应当让物理设计准则来破坏他们的逻辑设计。但是,在对逻辑设计作出决策的过E中我们l常用到物理设计准则?p149
 
(61)不要l开公共接口M改对象的状态。p164
 


Kira-2006 2008-04-26 18:40 发表评论
]]>
Ant操作hsql数据?/title><link>http://www.aygfsteel.com/Kira-2006/articles/196291.html</link><dc:creator>Kira-2006</dc:creator><author>Kira-2006</author><pubDate>Sat, 26 Apr 2008 10:25:00 GMT</pubDate><guid>http://www.aygfsteel.com/Kira-2006/articles/196291.html</guid><wfw:comment>http://www.aygfsteel.com/Kira-2006/comments/196291.html</wfw:comment><comments>http://www.aygfsteel.com/Kira-2006/articles/196291.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Kira-2006/comments/commentRss/196291.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Kira-2006/services/trackbacks/196291.html</trackback:ping><description><![CDATA[<p>使用Ant操作hsql数据库的例子Q?br /> <br /> <?xml version="1.0"?></p> <p><project name="timexdb"><br />  <property name="hjar" value="WebRoot/WEB-INF/lib/hsqldb.jar" /><br />  <property name="hclass" value="org.hsqldb.Server" /><br />  <property name="hfile" value="-database.0 data/gogoudb" /><br />  <property name="halias" value="gogou" /><br />  <property name="hport" value="9005" /></p> <p> <target name="starthsql"><br />   <java fork="true" <br />    classname="${hclass}" <br />    classpath="${hjar}" <br />    args="${hfile} -dbname.0 ${halias} -port ${hport}" /><br />  </target></p> <p> <target name="execddl"><br />   <sql classpath="${hjar}" <br />    driver="org.hsqldb.jdbcDriver" <br />    url="jdbc:hsqldb:hsql://localhost:${hport}/${halias}" <br />    userid="sa" <br />    password="" <br />    print="yes"><br /> <br /> -- SQL script for TimeX<br /> -- Step 1: Drop objects if they exist<br /> DROP TABLE Department IF EXISTS;<br /> DROP TABLE Employee IF EXISTS;<br /> DROP TABLE Timesheet IF EXISTS;<br /> DROP INDEX TimesheetIndex IF EXISTS;<br /> DROP INDEX DepartmentCodeIndex IF EXISTS;<br /> DROP INDEX EmployeeIdIndex IF EXISTS;<br /> DROP TABLE customer IF EXISTS;<br /> DROP TABLE Item IF EXISTS;<br /> DROP TABLE Item_subType IF EXISTS;<br /> DROP TABLE Item_superType IF EXISTS;<br /> DROP TABLE orders IF EXISTS;<br />    <br /> -- Step 2: Create tables<br /> CREATE TABLE Item_superType<br /> (<br />    superID BIGINT primary key,<br />    superTypeName VARCHAR(20) NOT NULL<br /> );</p> <p>CREATE TABLE Item_subType<br /> (<br />    subID BIGINT primary key,<br />    superID BIGINT,<br />    subTypeName VARCHAR(20) NOT NULL,<br />    FOREIGN KEY(superID) REFERENCES Item_superType(superID) <br /> );</p> <p>CREATE TABLE Item<br /> (<br />    itemID BIGINT primary key,<br />    subID BIGINT,<br />    itemName VARCHAR(20) NOT NULL,<br />    Introduce VARCHAR(50) ,<br />    Price VARCHAR(6) NOT NULL,<br />    nowPrice VARCHAR(6) NOT NULL,<br />    smallPicture VARCHAR(10) NOT NULL,<br />    bigPicture VARCHAR(10) NOT NULL,<br />    inTime datetime ,<br />    newItem INT ,<br />    Rebate INT ,<br />    Hit INT ,<br />    FOREIGN KEY(subID) REFERENCES Item_subType(subID)<br /> );</p> <p>CREATE TABLE customer<br /> (<br />     userID BIGINT IDENTITY,<br />     username VARCHAR(20) NOT NULL,<br />     Password  VARCHAR(20) NOT NULL,<br />     userCity  VARCHAR(20) ,<br />     userEmail  VARCHAR(20) NOT NULL,<br />     userAge  INT ,<br />     userSex  INT<br />  );<br />      <br /> CREATE TABLE orders<br /> (<br />  orderID BIGINT IDENTITY,<br />     consigneeName VARCHAR(20) NOT NULL,<br />     consigneeAddress VARCHAR(20) NOT NULL,<br />     Postalcode VARCHAR(6) NOT NULL,<br />     Telephone VARCHAR(20) NOT NULL,<br />     carryMethod VARCHAR(10) NOT NULL,<br />     Orderdate  datetime   <br /> );<br />        <br /> CREATE TABLE visualOrder<br /> (<br />      id BIGINT  IDENTITY, <br />      itemID BIGINT,<br />      userID BIGINT,<br />      orderID BIGINT,<br />      itemNumber BIGINT NOT NULL,<br />      FOREIGN KEY(itemID) REFERENCES Item(itemID),<br />      FOREIGN KEY(userID) REFERENCES customer(userID),<br />      FOREIGN KEY(orderID) REFERENCES orders(orderID)<br /> );<br /> <br /> -- Step 3: Create indexes<br /> CREATE UNIQUE INDEX visualOrderIndex ON visualOrder (userID);<br /> CREATE UNIQUE INDEX ItemIndex ON Item (itemID);<br /> CREATE UNIQUE INDEX userIdIndex ON customer (userId);<br />    <br /> create view newItem_statistic as  select * from item where item.newItem = 1;<br /> create view saleItem_statistic as  select * from item where item.Rebate = 1;</p> <p>-- Step 4: Insert some reference and test data<br /> INSERT INTO customer (userName, Password,userEmail) <br />         VALUES ('kira', 'kira','xuguoliang@sina.com');</p> <p><br /> -- Step 5: Verify tables and test data look ok<br /> SELECT * FROM customer;</p> <p>      </sql><br />  </target><br />  <target name="hsqldm"><br />   <java fork="true" classpath="${hjar}" classname="org.hsqldb.util.DatabaseManagerSwing" /><br />  </target><br />  <target name="sqltool"><br />   <java fork="true" classpath="${hjar}" classname="org.hsqldb.util.SqlTool" args="localhost-sa" /><br />  </target><br /> </project></p> <img src ="http://www.aygfsteel.com/Kira-2006/aggbug/196291.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Kira-2006/" target="_blank">Kira-2006</a> 2008-04-26 18:25 <a href="http://www.aygfsteel.com/Kira-2006/articles/196291.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate生成?/title><link>http://www.aygfsteel.com/Kira-2006/articles/196287.html</link><dc:creator>Kira-2006</dc:creator><author>Kira-2006</author><pubDate>Sat, 26 Apr 2008 10:15:00 GMT</pubDate><guid>http://www.aygfsteel.com/Kira-2006/articles/196287.html</guid><wfw:comment>http://www.aygfsteel.com/Kira-2006/comments/196287.html</wfw:comment><comments>http://www.aygfsteel.com/Kira-2006/articles/196287.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Kira-2006/comments/commentRss/196287.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Kira-2006/services/trackbacks/196287.html</trackback:ping><description><![CDATA[<p><!--讄主键映射--><br /> <id  name=""  column=""  type=""><br />     <generator  class="">  讄主键生成?br /> </id><br /> Hibernate框架内徏Z键提供了多种生成器,具体包括如下内容Q?br /> 1. incrementQ用于ؓlongQshortQintcd生成唯一标识?br /> 2. identityQ对DB2QMySQLQMS SQL ServerQSybase和HypersonicSQL的内|标识字D|供支持?br /> 3. sequenceQ在DB2QPostgreSQLQOracleQSAPDBQMcKoi中用序列(sequenceQ,而在Interbase中用生成器QgeneratorQ?br /> 4. hiloQ用一个高/低位法高效生成longQshort或intcd的标识符。给定一个表和字D(默认分别是hibernate_unique_key和nextQ作为高位值的来源。高/低位法生成的标识符只在一个特定的数据库中是唯一的?br /> 5. seqhiloQ用一个高/低位法高效生成longQshort或intcd的标识符Q给定一个数据库序列QsequenceQ的名字?br /> 6. uuid.hexQ用一?28-bit的UUID法生成字符串类型的标识W。在一个网l中是唯一的(使用了IP地址Q。UUID被编码位一?2?6q制数字的字W串?br /> 7. uuid.stringQ用同LUUID法。UUID被编码位一?6个字W长的Q意ASCII字符l成的字W串?br /> 8. nativeQ根据底层数据库的能力选择identity、sequence、hilo中的一个?br /> 9. assignedQ让应用E序在插表之前ؓ对象分配一个标识符?br /> 10. foreignQ用另一个相兌的对象的标识W。通常被用在有兌关系的表中?br /> <br /> <span style="color: red">一般来_在Hibernate中,不推荐用assigned作ؓ主键生成器。因为对数据库表来说Q以业务逻辑字段作ؓ主键有潜在的危险性。当该业务逻辑字段在将来需要改变的时候,作ؓ主键的应用就会相当麻烦。常用的手段是用一个和业务无关的字D作Z键,而在PO中定义这个字D|为变量属性,同事又作对象的惟一标识?/span></p> <img src ="http://www.aygfsteel.com/Kira-2006/aggbug/196287.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Kira-2006/" target="_blank">Kira-2006</a> 2008-04-26 18:15 <a href="http://www.aygfsteel.com/Kira-2006/articles/196287.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hsqldb~写批处理文件启动自己创建的数据?/title><link>http://www.aygfsteel.com/Kira-2006/articles/190208.html</link><dc:creator>Kira-2006</dc:creator><author>Kira-2006</author><pubDate>Tue, 01 Apr 2008 13:54:00 GMT</pubDate><guid>http://www.aygfsteel.com/Kira-2006/articles/190208.html</guid><wfw:comment>http://www.aygfsteel.com/Kira-2006/comments/190208.html</wfw:comment><comments>http://www.aygfsteel.com/Kira-2006/articles/190208.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.aygfsteel.com/Kira-2006/comments/commentRss/190208.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/Kira-2006/services/trackbacks/190208.html</trackback:ping><description><![CDATA[<span lang="EN-US" style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">    hsql</span><span style="font-size: 12pt; font-family: 宋体; mso-bidi-font-family: 宋体; mso-font-kerning: 0pt; mso-ansi-language: EN-US; mso-fareast-language: ZH-CN; mso-bidi-language: AR-SA">数据库是一Ƅ<span lang="EN-US">Java</span>~写的免Ҏ据库Q许可是<span lang="EN-US">BSD-style</span>的协议,如果你是使用<span lang="EN-US">Java</span>~程的话Q不凡考虑一下用它Q相对其他数据库来说Q其体积,我用的是hsqldb1_8_0_7,压羃包大ؓ3.12M。仅一?span lang="EN-US">hsqldb.jar</span>文g包括了数据库引擎,数据库驱动,q有其他用户界面操作{内宏V?br />     看了一下网上的一些hsqldb的资料,大多数数据库的启动和用户界面的操作都在命令行中进行操作,o(∩_∩)o...哈哈Q感觉有炚w烦。在hsqldb的压~包中,有个自带的数据库testQ它的启动和用户界面操作都是直接有一个批处理文g来执行,很方ѝ其实我们就可以Ҏq两个批处理文g来写自己创徏的数据库的批处理文g?br />     hsqldb自带数据库的启动批处理文Ӟ在压~包中,demo/runServer.bat文gQ右?#8220;~辑”Q可以看到文件中的内容ؓQ?br /> <font face="宋体">cd ..\data<br /> @java -classpath ../lib/hsqldb.jar org.hsqldb.Server %1 %2 %3 %4 %5 %6 %7 %8 %9<br /> </font>卛_动在data目录下的pȝ自带的数据库test?br /> 如果你要在db目录下创建,q启动数据库mydb。就可以~写批处理文Ӟ<br /> cd ..\db<br /> @java -classpath ../lib/hsqldb.jar org.hsqldb.Server -database.0 mydb -dbname.0 mydb<br /> 用户界面的操作可以同L方式q行~写批处理文件?/span> <img src ="http://www.aygfsteel.com/Kira-2006/aggbug/190208.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/Kira-2006/" target="_blank">Kira-2006</a> 2008-04-01 21:54 <a href="http://www.aygfsteel.com/Kira-2006/articles/190208.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ȫ</a>| <a href="http://" target="_blank">û</a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ϫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">¡</a>| <a href="http://" target="_blank">¹Ȫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">°</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ɳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ƽ</a>| <a href="http://" target="_blank">ٷ</a>| <a href="http://" target="_blank">ó</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̩</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">̨</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>