??xml version="1.0" encoding="utf-8" standalone="yes"?>中文字幕亚洲欧美,91亚洲国产成人精品性色,国产一二在线观看http://www.aygfsteel.com/algz/category/27462.htmlPurple Butterfly Flying QQ?7101519 Flex,Ext,Spring,Hibernate,EOS,SpringSecurity,Struts http://algz.googlecode.com/svn/trunk/zh-cnThu, 28 Feb 2013 15:43:56 GMTThu, 28 Feb 2013 15:43:56 GMT60[转]hibernate之生成的和默认的属性?使用generatedh实体)http://www.aygfsteel.com/algz/articles/395824.html紫蝶∏飛揚↗紫蝶∏飛揚↗Thu, 28 Feb 2013 01:55:00 GMThttp://www.aygfsteel.com/algz/articles/395824.htmlhttp://www.aygfsteel.com/algz/comments/395824.htmlhttp://www.aygfsteel.com/algz/articles/395824.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/395824.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/395824.html阅读全文

紫蝶∏飛揚↗ 2013-02-28 09:55 发表评论
]]>
[转]Hibernate Annotation几种兌映射 虽然是{?但仔l看q是很有帮助?http://www.aygfsteel.com/algz/articles/366838.html紫蝶∏飛揚↗紫蝶∏飛揚↗Tue, 20 Dec 2011 06:10:00 GMThttp://www.aygfsteel.com/algz/articles/366838.htmlhttp://www.aygfsteel.com/algz/comments/366838.htmlhttp://www.aygfsteel.com/algz/articles/366838.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/366838.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/366838.html
Hibernate Annotation几种兌映射
一对一(One-To-One)
使用@OneToOne注解建立实体Bean之间的一对一兌。一对一兌有三U情况:(1).兌的实体都׃n同样的主键,(2).其中一个实体通过外键兌到另一个实体的主键(注意要模拟一对一兌必须在外键列上添加唯一U束)Q?3).通过兌表来保存两个实体之间的连接关p?要模拟一对一兌必须在每一个外键上d唯一U束)?/div>
 
1.׃n主键的一对一兌映射Q?/div>
@Entity
@Table(name="Test_Body")
public class Body {
   private Integer id;
   private Heart heart;
   @Id
   public Integer getId() {
      return id;
   }
   public void setId(Integer id) {
      this.id = id;
   }
   @OneToOne
   @PrimaryKeyJoinColumn
   public Heart getHeart() {
      return heart;
   }
   public void setHeart(Heart heart) {
      this.heart = heart;
   }
}
@Entity
@Table(name="Test_Heart")
public class Heart {
   private Integer id;
   @Id
   public Integer getId() {
      return id;
   }
   public void setId(Integer id) {
      this.id = id;
   }
}
通过@PrimaryKeyJoinColumnҎ定义了一对一兌
 
2.使用外键q行实体一对一兌Q?/div>
@Entity
@Table(name="Test_Trousers")
public class Trousers {
   @Id
   public Integer id;
   @OneToOne
   @JoinColumn(name = "zip_id")
   public TrousersZip zip;
}
@Entity
@Table(name="Test_TrousersZip")
public class TrousersZip {
   @Id
   public Integer id;
   @OneToOne(mappedBy = "zip")
   public Trousers trousers;
}
上面的例子是指Trousers通过Trousers的外键列zip_id和TrousersZip兌Q@JoinColumnҎ定义了联接列Q该Ҏ和@ColumnҎ有点cMQ但是多了一个名为referencedColumnName的参数。该参数定义了所兌目标实体中的联接列,注意Q当referencedColumnName兌到非主键列的时候,兌的目标类必须实现SerializableQ还要注意的是所映像的属性对应单个列Q否则映无效)
一对一兌可能是双向的Q在双向兌中,有且仅有一端作Z体(ownerQ端存在Q主体端负责l护联接列(x斎ͼQ对于不需要维护这U关pȝ从表则通过mappedNy属性进行声明。mappedBy的值指向主体的兌属性。例子中QmappedBy的gؓzip。最后,不必也不能再在被兌端(ownedsideQ定义联接列了,因ؓ已经在主体端声明了?/div>
如果在主体没有声明@JoinColumnQ系l自动进行处理:在主表(owner tableQ中创接列Q列名ؓQ主体的兌属性名+下划U?被关联端的主键列名。上面的例子中是zip_id,因ؓTrousers中的兌属性名为zipQTrousersZip的主键是id?/div>
 
3.通过兌表定义一对一兌
@Entity
@Table(name="Test_People")
public class People {
   @Id
   public Integer id;
   @OneToOne
   @JoinTable(name ="TestPeoplePassports",
      joinColumns =@JoinColumn(name="people_fk"),
      inverseJoinColumns =@JoinColumn(name="passport_fk")
   )
   public Passport passport;
}
@Entity
@Table(name="Test_Passport")
public class Passport {
   @Id
   public Integer id;
   @OneToOne(mappedBy = "passport")
   public People people;
}
People通过名ؓTestPeoplePassports的关联表和Passport兌。该兌表拥有名为passport_fk的外键列Q该外键指向Passport表,该信息定义ؓinverseJoinColoumns的属性|而people_fk外键列指向People表,该信息定义ؓjoinColumns的属性倹{?/div>
q种兌可能是双向的Q在双向兌中,有且仅有一端作Z体(ownerQ端存在Q主体端负责l护联接列(x斎ͼQ对于不需要维护这U关pȝ从表则通过mappedNy属性进行声明。mappedBy的值指向主体的兌属性。例子中QmappedBy的gؓpassport。最后,不必也不能再在被兌端(ownedsideQ定义联接列了,因ؓ已经在主体端声明了?/div>
以上是一对一兌的三UŞ式,下面介绍多对一兌?/div>
 
 
 
多对一(Many-to-One)
使用@ManyToOneҎ来实现多对一兌?/div>
@ManyToOneҎ有一个名为targetEntity的参敎ͼ该参数定义了目标实体名,通常不需要定义该参数Q因为在大部分情况下默认?表示兌关系的属性类?可以很好的满需求了。不q下面这U情况下q个参数显得有意义了:使用接口作ؓq回D不是常见的实体?/div>
@ManyToOne(targetEntity=CompanyImpl.class)
@JoinColoumn(name=”COPM_ID”)
Public Company getCompany(){
   return company;
}
多对一的配|方式有两种Q?1)通过@JoinColoumn映像(2)通过兌表的方式来映?/div>
 
(1)           通过@JoinColoumn映射
SRD Framework中Company,Category例子Q?/div>
CompanyQ?/div>
@ManyToOne
   @JoinColumn(name = "CATEGORY_OPTION_ID")
   private Category category = null;
   CategoryQ?/div>
@DiscriminatorValue("Category")
public class Category extends Option {
}
(2)           通过兌表映?/div>
通过@JoinTableҎ定义兌表,该关联表包含了指回实体表的外?通过@JoinTable.joinColoumns)以及指向目标实体表的外键(通过@JoinTable.inverseJoinColoumns)
@Entity
@Table(name="Test_TreeType")
public class TreeType {
   private Integer id;
   private String name;
   private ForestType forestType;
   @ManyToOne(fetch = FetchType.LAZY)
   @JoinTable(name="Test_Tree_Forest",
      joinColumns = @JoinColumn(name="tree_id"),
      inverseJoinColumns = @JoinColumn(name="forest_id") )
public ForestType getForestType() {// forestType的getterQsetterҎ必须在这里,否则会出?/div>
      return forestType;
   }
   public void setForestType(ForestType forestType) {
      this.forestType = forestType;
   }
   @Id
   @GeneratedValue
   public Integer getId() {
      return id;
   }
   public void setId(Integer id) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}
@Entity
@Table(name="Test_ForestType")
public class ForestType {
   private Integer id;
   private String name;
   private Set<TreeType> trees;
   @OneToMany(mappedBy="forestType")
public Set<TreeType> getTrees() {// trees的getterQsetterҎ必须在这里,否则会出?/div>
      return trees;
   }
   public void setTrees(Set<TreeType> trees) {
      this.trees = trees;
   }
   @Id @GeneratedValue
   public Integer getId() {
      return id;
   }
   public void setId(Integer id) {
      this.id = id;
   }
   public String getName() {
      return name;
   }
   public void setName(String name) {
      this.name = name;
   }
}
 
一对多(One-to-Many)
使用@OneToManyҎ可定义一对多兌Q一对多兌可以是双向关联?/div>
在EJB3规范中多对一q端几乎L双向兌中的M(owner)端,而一对多q端兌Ҏ为@OneToMany(mappedBy...)
@Entity
Public class Troop{
   @OneToMany(mappedBy=”troop”)
Public Set<Soldier> getSoldiers(){
......
}
@Entity
Public class Soldier{
   @ManyToOne
   @JoinColumn(name=”troop_fk”)
Public Troop getTroop(){
......
}
Troop通过troop属性和Soldier建立一对多的双向关联,在mappedBy端不必也不能再定义Q何物理映?/div>
对于一对多的双向映,如果要一对多q一端维护关联关p,你需要删除mappedBy元素q将多对一q端的@JoinColoumn的insertable和updatabel讄为false。这U方案不会得C么明昄优化Q而且q会增加一些附加的UPDATE语句?/div>
 
单向Q?/div>
通过在被拥有的实体端(owned entity)增加一个外键列来实C对多单向兌是很见的,也是不推荐的Q徏议通过一个联接表来实现这U关?下面会讲??/div>
@JoinColoumnҎ来描q这U单向关联关p?/div>
@Entity
Public class Customer{
   @OneToMany
@JoinColoumn(name=”CUST_ID”)
Public Set<ticket> getTickets() {
......
}
@Entity
Public class Ticket{
   ...
}
Customer通过CUST_ID列和Ticket建立了单向关联关p?/div>
通过兌表处理单向关联:
通过联接表处理单向一对多兌是首选方式,q种兌通过@JoinTableҎq行描述
@Entity
Public class Trainer{
@OneToMany
@JoinTable(
   name = "TrainedMonkeys",
   jonColumns = {@JoinColumn(name = "trainer_id")},
   inverseJoinColumns = @JoinColumn(name = "monkey_id")
   )
public Set<Monkey> getTrainedMonkeys() {
      return trainedMonkeys;
   }
......
}
@Entity
public class Monkey {
...//no bidir
}
上面q个例子中,Trainer通过TrainedMonkeys表和Monkey建立了单向关联,其中外键trainer_id兌到Trainer(joinColoumn),而外键monkey_id兌到Monkey(inversejionColoumns)
默认处理机制Q?/div>
通过联接表来建立单向一对多兌不需要描qCQ何物理映像,表名׃下三个部分组成:主表(ownertable)表名+从表(the other side table)表名Q指向主表的外键名:主表表名+下划U?主表主键列名Q指向从表的外键名:主表所对应实体的属性名+下划U?从表主键列名Q指向从表的外键定义为唯一U束Q用来表CZ对多的关联关pR?/div>
@Entity
public class Trainer{
   @OneToMany
   Public Set<Tiger> getTrainedTigers(){
... ...
}
@Entity
public class Tiger{
.. ..//no bidir
}
上面q个例子中,Trainer和Tiger通过联接表Trainer_Tiger建立单向兌关系Q其中外键trainer_id兌到Trainer,而外键trainedTigers_id兌到Tiger
 
多对?Many-to-Many)
使用@ManyToManyҎ可定义多对多兌Q同Ӟ你也许要通过Ҏ@JoinTable描述兌表和兌条g。如果是双向兌Q其中一D必d义ؓOwnerQ另一端必d义ؓinverse(在对兌表进行更新操作时q一端将被忽?
@Entity()
public class Employer implements Serializable {
   private Integer id;
   private Collection employees;
   @ManyToMany(
targetEntity = org.hibernate.test.annotations.manytomany.Employee.class,
      cascade = {CascadeType.PERSIST, CascadeType.MERGE}
   )
   @JoinTable(
         name = "EMPLOYER_EMPLOYEE",
         joinColumns = {@JoinColumn(name = "EMPER_ID")},
         inverseJoinColumns = {@JoinColumn(name = "EMPEE_ID")}
   )
   public Collection getEmployees() {
      return employees;
   }
...
}
@Entity()
public class Employee implements Serializable {
   @ManyToMany(
         cascade = {CascadeType.PERSIST, CascadeType.MERGE},
         mappedBy = "employees"
         targetEntity = Employer.class
   )
public Collection<Employer> getEmployers() {
      return employers;
   }
.. ..
}
@JoinTableҎ定义了联接表的表名,联接列数l,以及invers联接列数l,后者是兌表中兌到Employee主键的列(the “other side”)?/div>
被关联端不必也不能描q物理映:只需要一个简单的mappedBy参数Q该参数包含了主体端的属性名Q这样就l定了双方的关系?/div>
默认|
和其它许多批注一P在多对多兌中很多值是自动生成Q党双向多对多关联中没有定义M物理映射ӞHibernateҎ以下规则生成相应的|兌表名Q主表表?下划U?从表表名Q关联到主表的外键名Q主表名+下划U?主表中的主键列名Q关联到从表的外键名Q主表中用于兌的属性名+下划U?从表的主键列名,以上规则对于双向一对多兌同样一栗?/div>
 
以上是整理的一点简单的几种映射Q可参考EJB3.pdf中P111——P131Qhibernate_annotation.pdf W二?/div>
在这里没有具体的例子Q有很多内容q需要仔l查看文档?/div>


]]>Hibernate 注解映射 讄默认值的异常及解x?/title><link>http://www.aygfsteel.com/algz/articles/365534.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Mon, 05 Dec 2011 01:21:00 GMT</pubDate><guid>http://www.aygfsteel.com/algz/articles/365534.html</guid><wfw:comment>http://www.aygfsteel.com/algz/comments/365534.html</wfw:comment><comments>http://www.aygfsteel.com/algz/articles/365534.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/algz/comments/commentRss/365534.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/algz/services/trackbacks/365534.html</trackback:ping><description><![CDATA[<div><div>Oracle 数据?<br />Hibernate annotation :<br /><div><div><span style="white-space:pre"> </span>@Column(name="NUMBERS",columnDefinition="NUMBER(20,3) default 0 ")</div><div><span style="white-space:pre"> </span>public BigDecimal getNumbers() {</div><div><span style="white-space:pre"> </span>return numbers;</div><div><span style="white-space:pre"> </span>}<br /><br />异常:</div></div>Caused by: org.hibernate.HibernateException: Wrong column type: NUMBERS, expected: NUMBER(20,3) default 0 </div><div><span style="white-space:pre"> </span>at org.hibernate.mapping.Table.validateColumns(Table.java:261)</div><div><span style="white-space:pre"> </span>at org.hibernate.cfg.Configuration.validateSchema(Configuration.java:1083)</div><div><span style="white-space:pre"> </span>at org.hibernate.tool.hbm2ddl.SchemaValidator.validate(SchemaValidator.java:116)</div><div><span style="white-space:pre"> </span>at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:317)</div><div><span style="white-space:pre"> </span>at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294)</div><div><span style="white-space:pre"> </span>at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:915)</div><div><span style="white-space:pre"> </span>at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:730)</div><div><span style="white-space:pre"> </span>... 122 more<br />解决Ҏ:<br /><div><div><span style="white-space:pre"> </span>@Column(name="NUMBERS",columnDefinition="number(20,3) default 0 ")</div><div><span style="white-space:pre"> </span>public BigDecimal getNumbers() {</div><div><span style="white-space:pre"> </span>return numbers;</div><div><span style="white-space:pre"> </span>}<br />原因:hibernate 在列定义选项?数据库中的所有类型应为小写number. hibernate在此直接面对数据?所以区分大写.</div></div></div></div><img src ="http://www.aygfsteel.com/algz/aggbug/365534.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-12-05 09:21 <a href="http://www.aygfsteel.com/algz/articles/365534.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>hibernate U联(联表)删除的问?/title><link>http://www.aygfsteel.com/algz/articles/364066.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Thu, 17 Nov 2011 04:47:00 GMT</pubDate><guid>http://www.aygfsteel.com/algz/articles/364066.html</guid><wfw:comment>http://www.aygfsteel.com/algz/comments/364066.html</wfw:comment><comments>http://www.aygfsteel.com/algz/articles/364066.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/algz/comments/commentRss/364066.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/algz/services/trackbacks/364066.html</trackback:ping><description><![CDATA[<div><div>dao.getHibernateSession().createQuery(hql).setParameter("bookid", bookid).setParameter("batch", batch).executeUpdate(); <br /><br />(1)String hql="delete from TbProduceplanaccount ppa where ppa.tbBusinessplanaccount.batch=:batch and ppa.tbProduceplanbook.id=:bookid ";<br />异常:<br /><div><div>Hibernate: delete from Tb_ProducePlanAccount, Tb_BusinessplanAccount tbbusiness1_ where batch=? and ProducePlanBook_ID=?<br />2011-11-17 11:50:16,166 WARN  [JDBCExceptionReporter] SQL Error: 933, SQLState: 42000<br />2011-11-17 11:50:16,166 ERROR [JDBCExceptionReporter] ORA-00933: SQL 命o未正结?nbsp;<br /><br />(2)hql="delete from TbProduceplanaccount ppa where ppa in (from TbProduceplanaccount ppa where ppa.tbBusinessplanaccount.batch=:batch and ppa.tbProduceplanbook.id=:bookid)";</div><div><div><span id="wmqeeuq" class="Apple-style-span" style="white-space: pre;">执行正常.</span></div></div></div><br />ȝ: hibernate的理解方式与Z?不能自动生成子查?<span style="color: #99cc00; ">更新或删除操作是不允许联表的,必须通过子查询找出数?</span><br />题外?U联删除是要讄映射?<br /><div><div></div></div></div></div><img src ="http://www.aygfsteel.com/algz/aggbug/364066.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/algz/" target="_blank">紫蝶∏飛揚↗</a> 2011-11-17 12:47 <a href="http://www.aygfsteel.com/algz/articles/364066.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate?.hbm.xml文g让其自动d数据库默认?/title><link>http://www.aygfsteel.com/algz/articles/323438.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Sat, 12 Jun 2010 07:41:00 GMT</pubDate><guid>http://www.aygfsteel.com/algz/articles/323438.html</guid><wfw:comment>http://www.aygfsteel.com/algz/comments/323438.html</wfw:comment><comments>http://www.aygfsteel.com/algz/articles/323438.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/algz/comments/commentRss/323438.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/algz/services/trackbacks/323438.html</trackback:ping><description><![CDATA[<p>在hibernate.xml中的class加入dynamic-insert="true" dynamic-update="true"</p> <p>数据库中表字D必设|默认?/p> <p>如:<class name="com.hibernate.bean" table="TABLE" schema="DATABASE" <span style="color: #339966">dynamic-insert="true" dynamic-update="true"</span> ></p> <p><br /> 注:dynamic-insert="true" dynamic-update="true" 的作用是当HQL语句中未指明的列不q行insert和update操作Q这样hibernate׃会在未指明默认列的情况下数据库表中默认值字D|I?br /> </p> <img src ="http://www.aygfsteel.com/algz/aggbug/323438.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/algz/" target="_blank">紫蝶∏飛揚↗</a> 2010-06-12 15:41 <a href="http://www.aygfsteel.com/algz/articles/323438.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>could not initialize proxy - no Sessionhttp://www.aygfsteel.com/algz/articles/262823.html紫蝶∏飛揚↗紫蝶∏飛揚↗Mon, 30 Mar 2009 02:02:00 GMThttp://www.aygfsteel.com/algz/articles/262823.htmlhttp://www.aygfsteel.com/algz/comments/262823.htmlhttp://www.aygfsteel.com/algz/articles/262823.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/262823.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/262823.htmlorg.hibernate.LazyInitializationException: could not initialize proxy - no Session

原因:可能是HQL语句没有q行联表查询,产生讉K的属性不存在.引用了没有联表查询的外键.
(1)hibernate3 many-to-one的默认选项?nbsp;lazy = "proxy"
解决ҎQ?/strong><many-to-one>  & <set> 中设|?nbsp;lazy="false"
  //影响性能

(2)即from A,正确?from A a left join fetch a.集合(外键)   //灉|.

]]>
[转]正则表达?0分钟入门教程http://www.aygfsteel.com/algz/articles/229762.html紫蝶∏飛揚↗紫蝶∏飛揚↗Thu, 18 Sep 2008 09:48:00 GMThttp://www.aygfsteel.com/algz/articles/229762.htmlhttp://www.aygfsteel.com/algz/comments/229762.htmlhttp://www.aygfsteel.com/algz/articles/229762.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/229762.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/229762.html正则表达?0分钟入门教程

版本Qv2.3 (2008-4-13) 作者:deerchao 转蝲h?a >来源

目录

跌目录

  1. 本文目标
  2. 如何使用本教E?/a>
  3. 正则表达式到底是什么东西?
  4. 入门
  5. 试正则表达?/a>
  6. 元字W?/a>
  7. 字符转义
  8. 重复
  9. 字符c?/a>
  10. 分枝条g
  11. 反义
  12. 分组
  13. 后向引用
  14. 零宽断言
  15. 负向零宽断言
  16. 注释
  17. 贪婪与懒?/a>
  18. 处理选项
  19. ql?递归匚w
  20. q有些什么东西没提到
  21. 联系作?/a>
  22. 最?来点q告...
  23. |上的资源及本文参考文?/a>
  24. 更新说明

本文目标

30分钟内让你明白正则表辑ּ是什么,q对它有一些基本的了解Q让你可以在自己的程序或|页里用它?/p>

如何使用本教E?/h2>

最重要的是——L?em>30分钟Q如果你没有使用正则表达式的l验Q请不要试图?0U?/em>内入?#8212;—除非你是h :)

别被下面那些复杂的表辑ּ吓倒,只要跟着我一步一步来Q你会发现正则表辑ּ其实q?span lang="zh-cn">没有你想像中的那么困难。当Ӟ如果你看完了q篇教程之后Q发现自己明白了很多Q却又几乎什么都C得,那也是很正常?#8212;—我认为,没接触过正则表达式的人在看完q篇教程后,能把提到q的语法C80%以上的可能性ؓ零。这里只是让你明白基本的原理Q以后你q需要多l习Q多使用Q才能熟l掌握正则表辑ּ?/p>

除了作ؓ入门教程之外Q本文还试图成ؓ可以在日常工作中使用的正则表辑ּ语法参考手册。就作者本人的l历来说Q这个目标还是完成得不错?#8212;—你看Q我自己也没能把所有的东西C来,不是吗?

清除格式 文本格式U定Q?span class="name">专业术语 元字W?语法格式 正则表达?/span> 正则表达式中的一部分(用于分析) 对其q行匚w的源字符?/span> Ҏ则表辑ּ或其中一部分的说?/span>

隐藏Ҏ 本文双有一些注释,主要是用来提供一些相关信息,或者给没有E序员背景的读者解释一些基本概念,通常可以忽略?/p>

正则表达式到底是什么东西?

字符是计机软g处理文字时最基本的单位,可能是字母,数字Q标点符PI格Q换行符Q汉字等{?span class="name">字符?/span>?个或更多个字W的序列?span class="name">文本也就是文字,字符丌Ӏ说某个字符?span class="name">匚w某个正则表达式,通常是指q个字符串里有一部分Q或几部分分别)能满辑ּl出的条件?/p>

在编写处理字W串的程序或|页Ӟl常会有查找W合某些复杂规则的字W串的需要?span class="name">正则表达?/span>是用于描述q些规则的工兗换句话_正则表达式就是记录文本规则的代码?/p>

很可能你使用qWindows/Dos下用于文件查扄通配W?wildcard)Q也是*?span class="code">?。如果你x找某个目录下的所有的Word文的话Q你会搜?span style="color: red;">*.doc。在q里Q?span class="code">*会被解释成Q意的字符丌Ӏ和通配W类|正则表达式也是用来进行文本匹配的工具Q只不过比v通配W,它能更精地描述你的需?#8212;—当然Q代价就是更复杂——比如你可以编写一个正则表辑ּQ用来查?span class="desc">所有以0开_后面跟着2-3个数字,然后是一个连字号“-”Q最后是7?位数字的字符?/span>(?span class="string">010-12345678?span class="string">0376-7654321)?/p>

入门

学习正则表达式的最好方法是从例子开始,理解例子之后再自己对例子q行修改Q实验。下面给Z不少单的例子Qƈ对它们作了详l的说明?/p>

假设你在一英文小说里查找hiQ你可以使用正则表达?span class="regex">hi?/p>

q几乎是最单的正则表达式了Q它可以_匚wq样的字W串Q?span class="desc">׃个字W组成,前一个字W是h,后一个是i。通常Q处理正则表辑ּ的工具会提供一个忽略大写的选项Q如果选中了这个选项Q它可以匚whi,HI,Hi,hIq四U情况中的Q意一U?/p>

不幸的是Q很多单词里包含hiq两个连l的字符Q比?span class="string">him,history,high{等。用hi来查扄话,q里边的hi也会被找出来。如果要_地查找hiq个单词的话Q我们应该?span class="regex">\bhi\b?/p>

\b是正则表辑ּ规定的一个特D代码(好吧Q某些h叫它元字W,metacharacterQ,代表着单词的开头或l尾Q也是单词的分界处。虽焉常英文的单词是q|标点W号或者换行来分隔的,但是\bq不匚wq些单词分隔字符中的M一个,?strong>只匹配一个位|?/strong>?/p>

如果需要更_的说法,\b匚wq样的位|:它的前一个字W和后一个字W不全是(一个是,一个不是或不存?\w?/p>

假如你要扄?span class="desc">hi后面不远处跟着一个LucyQ你应该?span class="regex">\bhi\b.*\bLucy\b?/p>

q里Q?span class="part">.是另一个元字符Q匹?span class="desc">除了换行W以外的L字符?span class="part">*同样是元字符Q不q它代表的不是字W,也不是位|,而是数量——它指?前边的内容可以连l重复出CQ意次以整个表达式得到匹?/span>。因此,.*q在一起就意味着L数量的不包含换行的字W?/span>。现?span class="regex">\bhi\b.*\bLucy\b的意思就很明显了Q?span class="desc">先是一个单词hi,然后是Q意个L字符(但不能是换行)Q最后是Lucyq个单词?/p>

换行W就?\n',ASCII~码?0(十六q制0x0A)的字W?/p>

如果同时使用其它元字W,我们p构造出功能更强大的正则表达式。比如下面这个例子:

0\d\d-\d\d\d\d\d\d\d\d匚wq样的字W串Q?span class="desc">?开_然后是两个数字,然后是一个连字号“-”Q最后是8个数?/span>(也就是中国的电话L。当Ӟq个例子只能匚w区号?位的情Ş)?/p>

q里?span class="part">\d是个新的元字W,匚w一位数?0Q或1Q或2Q或……)?span class="part">-不是元字W,只匹配它本n——q字W或者减受?/p>

Z避免那么多烦人的重复Q我们也可以q样写这个表辑ּQ?span class="regex">0\d{2}-\d{8}?q里\d后面?span class="part">{2}({8})的意思是前面\d必须q箋重复匚w2?8??/p>

试正则表达?/h2>

如果你不觉得正则表达式很难读写的话,要么你是一个天才,要么Q你不是地球人。正则表辑ּ的语法很令h头疼Q即使对l常使用它的人来说也是如此。由于难于读写,Ҏ出错Q所以找一U工具对正则表达式进行测试是很有必要的?/p>

׃在不同的环境下正则表辑ּ的一些细节是不相同的Q本教程介绍的是微Y .Net Framework 2.0下正则表辑ּ的行为,所以,我向你介l一?Net下的工具.Net Framework 2.0Q然?a title="从www.unibetter.com下蝲Regex Tester, 75KB" >下蝲Regex Tester。这是个l色软gQ下载完后打开压羃?直接q行RegexTester.exe可以了?/p>

下面是Regex Testerq行时的截图Q?/p>

Regex Testerq行时的截图

元字W?/h2>

现在你已l知道几个很有用的元字符了,?span class="code">\b,.,*Q还?span class="code">\d.正则表达式里q有更多的元字符Q比?span class="code">\s匚wL的空白符Q包括空|制表W?Tab)Q换行符Q中文全角空格等?span class="code">\w匚w字母或数字或下划U或汉字{?/span>?/p>

对中?汉字的特D处理是?Net提供的正则表辑ּ引擎支持的,其它环境下的具体情况h看相x?/p>

下面来看看更多的例子Q?/p>

\ba\w*\b匚w以字?span class="part">a开头的单词——先是某个单词开始处(\b)Q然后是字母a,然后是Q意数量的字母或数?\w*)Q最后是单词l束?\b)?/p>

好吧Q现在我们说说正则表辑ּ里的单词是什么意思吧Q就是多于一个的q箋?span class="code">\w。不错,q与学习英文时要背的成千上万个同名的东西的确关系不大 :)

\d+匚w1个或更多q箋的数?/span>。这里的+是和*cM的元字符Q不同的?span class="code">*匚w重复L?可能??Q?span class="code">+则匹?span class="desc">重复1ơ或更多?/span>?/p>

\b\w{6}\b 匚w刚好6个字?数字的单?/span>?/p>
?.常用的元字符
代码 说明
. 匚w除换行符以外的Q意字W?/span>
\w 匚w字母或数字或下划U或汉字
\s 匚wL的空白符
\d 匚w数字
\b 匚w单词的开始或l束
^ 匚w字符串的开?/span>
$ 匚w字符串的l束

元字W?span class="code">^Q和数字6在同一个键位上的符P?span class="code">$都匹配一个位|,q和\b有点cM?span class="code">^匚w你要用来查找的字W串的开_$匚wl尾。这两个代码在验证输入的内容旉常有用,比如一个网站如果要求你填写的QQ号必Mؓ5位到12位数字时Q可以用:^\d{5,12}$?/p>

q里?span class="part">{5,12}和前面介l过?span class="part">{2}是类似的Q只不过{2}匚w只能不多不少重复2?/span>Q?span class="part">{5,12}则是重复的次C能少?ơ,不能多于12?/span>Q否则都不匹配?/p>

因ؓ使用?span class="part">^?span class="part">$Q所以输入的整个字符串都要用来和\d{5,12}来匹配,也就是说整个输入必须??2个数?/span>Q因此如果输入的QQ可匚wq个正则表达式的话,那就W合要求了?/p>

和忽略大写的选项cMQ有些正则表辑ּ处理工具q有一个处理多行的选项。如果选中了这个选项Q?span class="code">^?span class="code">$的意义就变成?span class="desc">匚w行的开始处和结束处?/p>

字符转义

如果你想查找元字W本w的话,比如你查?span class="desc">.,或?span class="desc">*,出C问题Q你没办法指定它们,因ؓ它们会被解释成别的意思。这时你得使用\来取消这些字W的Ҏ意义。因此,你应该?span class="regex">\.?span class="regex">\*。当Ӟ要查?span class="desc">\本nQ你也得?span class="regex">\\.

例如Q?span class="regex">unibetter\.com匚wunibetter.comQ?span class="regex">C:\\Windows匚wC:\Windows?/p>

重复

你已l看q了前面?span class="code">*,+,{2},{5,12}q几个匹配重复的方式了。下面是正则表达式中所有的限定W?指定数量的代码,例如*,{5,12}{?Q?/p>
?.常用的限定符
代码/语法 说明
* 重复零次或更多次
+ 重复一ơ或更多?/span>
? 重复零次或一?/span>
{n} 重复n?/span>
{n,} 重复nơ或更多?/span>
{n,m} 重复n到m?/span>

下面是一些用重复的例子Q?/p>

Windows\d+匚wWindows后面?个或更多数字

^\w+匚w一行的W一个单?或整个字W串的第一个单词,具体匚w哪个意思得看选项讄)

字符c?/h2>

要想查找数字Q字母或数字Q空白是很简单的Q因为已l有了对应这些字W集合的元字W,但是如果你想匚w没有预定义元字符的字W集?比如元音字母a,e,i,o,u),应该怎么办?

很简单,你只需要在Ҏ号里列出它们p了,?span class="regex">[aeiou]匹?span class="desc">M一个英文元韛_?/span>Q?span class="regex">[.?!]匚w标点W号(.??)?/p>

我们也可以轻村֜指定一个字W?span class="name">范围Q像[0-9]代表的含意与\d是完全一致的Q?span class="desc">一位数?/span>Q同?span class="regex">[a-z0-9A-Z_]也完全等同于\wQ如果只考虑英文的话Q?/p>

下面是一个更复杂的表辑ּQ?span class="regex">\(?0\d{2}[) -]?\d{8}?/p>

“(”?#8220;)”也是元字W,后面?a >分组?/a>里会提到Q所以在q里需要?a >转义?/p>

q个表达式可以匹?span class="desc">几种格式的电话号?/span>Q像(010)88886666Q或022-22334455Q或02912345678{。我们对它进行一些分析吧Q首先是一个{义字W?span class="part">\(,它能出现0ơ或1??),然后是一?span class="part">0Q后面跟着2个数?\d{2})Q然后是)?span class="part">-?span class="part">I格中的一个,它出?ơ或不出??)Q最后是8个数?\d{8})?/p>

分枝条g

不幸的是Q刚才那个表辑ּ也能匚w010)12345678?span class="string">(022-87654321q样?#8220;不正?#8221;的格式。要解决q个问题Q我们需要用?span class="name">分枝条g。正则表辑ּ里的分枝条g指的是有几种规则Q如果满_中Q意一U规则都应该当成匚wQ具体方法是?span class="code">|把不同的规则分隔开。听不明白?没关p,看例子:

0\d{2}-\d{8}|0\d{3}-\d{7}q个表达式能匚w两种以连字号分隔的电话号码:一U是三位区号Q?位本地号(?10-12345678)Q一U是4位区P7位本地号(0376-2233445)?/p>

\(0\d{2}\)[- ]?\d{8}|0\d{2}[- ]?\d{8}q个表达?span class="desc">匚w3位区L电话LQ其中区号可以用括hhQ也可以不用Q区号与本地号间可以用连字号或空格间隔,也可以没有间?/span>。你可以试试用分枝条件把q个表达式扩展成也支?位区L?/p>

\d{5}-\d{4}|\d{5}q个表达式用于匹配美国的邮政~码。美国邮~的规则?位数字,或者用q字号间隔的9位数字。之所以要l出q个例子是因为它能说明一个问题:使用分枝条gӞ要注意各个条件的序。如果你把它Ҏ\d{5}|\d{5}-\d{4}的话Q那么就只会匚w5位的邮编(以及9位邮~的??。原因是匚w分枝条gӞ会从左到右地测试每个条Ӟ如果满了某个分枝的话,׃会去再管其它的条件了?/p>

分组

我们已经提到了怎么重复单个字符Q直接在字符后面加上限定W就行了Q;但如果想要重复多个字W又该怎么办?你可以用括h指定子表辑ּ(也叫?span class="name">分组)Q然后你可以指定这个子表达式的重复ơ数了,你也可以对子表达式进行其它一些操?后面会有介绍)?/p>

(\d{1,3}\.){3}\d{1,3}是一?span class="desc">单的IP地址匚w表达式。要理解q个表达式,h下列序分析它:\d{1,3}匚w1?位的数字Q?span class="part">(\d{1,3}\.){3}匚w三位数字加上一个英文句?q个整体也就是这?span class="name">分组)重复3?/span>Q最后再加上一个一C位的数字(\d{1,3})?/p>

IP地址中每个数字都不能大于255Q大家千万不要被?4》第三季的编剧给忽悠?..

不幸的是Q它也将匚w256.300.888.999q种不可能存在的IP地址。如果能使用术比较的话Q或许能单地解决q个问题Q但是正则表辑ּ中ƈ不提供关于数学的M功能Q所以只能用冗长的分组Q选择Q字W类来描qC个正的IP地址Q?span class="regex">((2[0-4]\d|25[0-5]|[01]?\d\d?)\.){3}(2[0-4]\d|25[0-5]|[01]?\d\d?)?/p>

理解q个表达式的关键是理?span class="part">2[0-4]\d|25[0-5]|[01]?\d\d?Q这里我׃l说了,你自己应该能分析得出来它的意义?/p>

反义

有时需要查找不属于某个能简单定义的字符cȝ字符。比如想查找除了数字以外Q其它Q意字W都行的情况Q这旉要用?span class="name">反义Q?/p>
?.常用的反义代?/caption>
代码/语法 说明
\W 匚wL不是字母Q数字,下划U,汉字的字W?/span>
\S 匚wL不是I白W的字符
\D 匚wL非数字的字符
\B 匚w不是单词开头或l束的位|?/span>
[^x] 匚w除了x以外的Q意字W?/span>
[^aeiou] 匚w除了aeiouq几个字母以外的L字符

例子Q?span class="regex">\S+匚w不包含空白符的字W串?/p>

<a[^>]+>匚w用尖括号括v来的以a开头的字符?/span>?/p>

后向引用

使用括h定一个子表达式后Q?strong>匚wq个子表辑ּ的文?/strong>(也就是此分组捕获的内?可以在表辑ּ或其它程序中作进一步的处理。默认情况下Q每个分l会自动拥有一?span class="name">l号Q规则是Q从左向叻I以分l的左括号ؓ标志Q第一个出现的分组的组号ؓ1Q第二个?Q以此类推?/p>

后向引用用于重复搜烦前面某个分组匚w的文本。例如,\1代表分组1匚w的文?/span>。难以理解?LCZQ?/p>

\b(\w+)\b\s+\1\b可以用来匚w重复的单?/span>Q像go go, 或?span class="string">kitty kitty。这个表辑ּ首先?span class="desc">一个单?/span>Q也是单词开始处和结束处之间的多于一个的字母或数?/span>(\b(\w+)\b)Q这个单词会被捕获到~号?的分l中Q然后是1个或几个I白W?/span>(\s+)Q最后是分组1中捕L内容Q也是前面匚w的那个单词)(\1)?/p>

你也可以自己指定子表辑ּ?span class="name">l名。要指定一个子表达式的l名Q请使用q样的语法:(?<Word>\w+)(或者把括h?span class="code">'也行Q?span class="code">(?'Word'\w+)),q样把\w+的组名指定ؓWord了。要反向引用q个分组捕获的内容,你可以?span class="code">\k<Word>,所以上一个例子也可以写成q样Q?span class="regex">\b(?<Word>\w+)\b\s+\k<Word>\b?/p>

使用括L时候,q有很多特定用途的语法。下面列Z最常用的一些:

?.常用分组语法
分类 代码/语法 说明
捕获 (exp) 匚wexp,q捕h本到自动命名的组?/span>
(?<name>exp) 匚wexp,q捕h本到名称为name的组里,也可以写??'name'exp)
(?:exp) 匚wexp,不捕获匹配的文本Q也不给此分l分配组?/span>
零宽断言 (?=exp) 匚wexp前面的位|?/span>
(?<=exp) 匚wexp后面的位|?/span>
(?!exp) 匚w后面跟的不是exp的位|?/span>
(?<!exp) 匚w前面不是exp的位|?/span>
注释 (?#comment) q种cd的分l不Ҏ则表辑ּ的处理生Q何媄响,用于提供注释让h阅读

我们已经讨论了前两种语法。第三个(?:exp)不会改变正则表达式的处理方式Q只是这Ll匹配的内容不会像前两种那样被捕获到某个l里面,也不会拥有组?/span>?/p>

零宽断言

地球人,是不是觉得这些术语名U太复杂Q太难记了?我也和你一栗知道有q么一U东西就行了Q它叫什么,随它dQ?#8220;无名Q万物之?..”

接下来的四个用于查找在某些内?但ƈ不包括这些内?之前或之后的东西Q也是说它们像\b,^,$那样用于指定一个位|,q个位置应该满一定的条g(xa)Q因此它们也被称?span class="name">零宽断言。最好还是拿例子来说明吧Q?/p>

断言用来声明一个应该ؓ真的事实。正则表辑ּ中只有当断言为真时才会l进行匹配?/p>

(?=exp)也叫零宽度正预测先行断言Q它断言自n出现的位|的后面能匹配表辑ּexp。比?span class="regex">\b\w+(?=ing\b)Q匹?span class="desc">以ingl尾的单词的前面部分(除了ing以外的部?Q如查找I'm singing while you're dancing.Ӟ它会匚wsing?span class="desc">danc?/p>

(?<=exp)也叫零宽度正回顾后发断言Q它断言自n出现的位|的前面能匹配表辑ּexp。比?span class="regex">(?<=\bre)\w+\b会匹?span class="desc">以re开头的单词的后半部?除了re以外的部?Q例如在查找reading a bookӞ它匹?span class="desc">ading?/p>

假如你想要给一个很长的数字中每三位间加一个逗号(当然是从双加v?Q你可以q样查找需要在前面和里面添加逗号的部分:((?<=\d)\d{3})*\bQ用它对1234567890q行查找时结果是234567890?/p>

下面q个例子同时使用了这两种断言Q?span class="regex">(?<=\s)\d+(?=\s)匚w以空白符间隔的数?再次Q不包括q些I白W??/p>

负向零宽断言

前面我们提到q怎么查找不是某个字符或不在某个字W类?/strong>的字W的Ҏ(反义)。但是如果我们只是想?strong>保某个字符没有出现Q但q不惛_匚w?/strong>时怎么办?例如Q如果我们想查找q样的单?-它里面出C字母q,但是q后面跟的不是字母u,我们可以试q样Q?/p>

\b\w*q[^u]\w*\b匚w包含后面不是字母u的字母q的单?/span>。但是如果多做测?或者你思维_敏锐Q直接就观察出来?Q你会发玎ͼ如果q出现在单词的l尾的话Q像Iraq,BenqQ这个表辑ּ׃出错。这是因?span class="part">[^u]总要匚w一个字W,所以如果q是单词的最后一个字W的话,后面?span class="part">[^u]会匚wq后面的单词分隔符(可能是空|或者是句号或其它的什?Q后面的\w*\b会匚w下一个单词,于是\b\w*q[^u]\w*\bp匚w整个Iraq fighting?span class="name">负向零宽断言能解册L问题Q因为它只匹配一个位|,q不消费M字符。现在,我们可以q样来解册个问题:\b\w*q(?!u)\w*\b?/p>

零宽度负预测先行断言(?!exp)Q?span class="desc">断言此位|的后面不能匚w表达式exp。例如:\d{3}(?!\d)匚w三位数字Q而且q三位数字的后面不能是数?/span>Q?span class="regex">\b((?!abc)\w)+\b匚w不包含连l字W串abc的单?/span>?/p>

同理Q我们可以用(?<!exp),零宽度正回顾后发断言?span class="desc">断言此位|的前面不能匚w表达式expQ?span class="regex">(?<![a-z])\d{7}匚w前面不是写字母的七位数?/span>?/p>

误l分析表辑ּ(?<=<(\w+)>).*(?=<\/\1>)Q这个表辑ּ最能表现零宽断a的真正用途?/p>

一个更复杂的例子:(?<=<(\w+)>).*(?=<\/\1>)匚w不包含属性的单HTML标签内里的内?/span>?span class="code">(<?(\w+)>)指定了这L前缀Q?span class="desc">被尖括号括v来的单词(比如可能?lt;b>)Q然后是.*(L的字W串),最后是一?span class="name">后缀(?=<\/\1>)。注意后~里的\/Q它用到了前面提q的字符转义Q?span class="part">\1则是一个反向引用,引用的正?span class="desc">捕获的第一l?/span>Q前面的(\w+)匚w的内容,q样如果前缀实际上是<b>的话Q后~是</b>了。整个表辑ּ匚w的是<b>?lt;/b>之间的内?再次提醒Q不包括前缀和后~本n)?/p>

注释

括L另一U用途是通过语法(?#comment)来包含注释。例如:2[0-4]\d(?#200-249)|25[0-5](?#250-255)|[01]?\d\d?(?#0-199)?/p>

要包含注释的话,最好是启用“忽略模式里的I白W?#8221;选项Q这样在~写表达式时能Q意的dI格QTabQ换行,而实际用时q些都将被忽略。启用这个选项后,?后面到这一行结束的所有文本都被当成注释忽略掉。例如,我们可以前面的一个表辑ּ写成q样Q?/p>

      (?<=    # 断言要匹配的文本的前~
<(\w+)> # 查找括hh的字母或数字(即HTML/XML标签)
) # 前缀l束
.* # 匚wL文本
(?= # 断言要匹配的文本的后~
<\/\1> # 查找括hh的内容:前面是一?/"Q后面是先前捕获的标{?br /> ) # 后缀l束

贪婪与懒?/h2>

当正则表辑ּ中包含能接受重复的限定符Ӟ通常的行为是Q在使整个表辑ּ能得到匹配的前提下)匚w可能多的字W。考虑q个表达式:a.*bQ它会匚w最长的以a开始,以bl束的字W串。如果用它来搜烦aabab的话Q它会匹配整个字W串aabab。这被称?span class="name">贪婪匚w?/p>

有时Q我们更需?span class="name">懒惰匚wQ也是匚w可能少的字W。前面给出的限定W都可以被{化ؓ懒惰匚w模式Q只要在它后面加上一个问?span class="code">?。这?span class="regex">.*?意味着匚wL数量的重复,但是在能使整个匹配成功的前提下用最的重复。现在看看懒惰版的例子吧Q?/p>

a.*?b匚w最短的Q以a开始,以bl束的字W串。如果把它应用于aabab的话Q它会匹?span class="desc">aabQ第一到第三个字符Q?/span>?span class="desc">abQ第四到W五个字W)?/p>

Z么第一个匹配是aabQ第一到第三个字符Q而不是abQ第二到W三个字W)Q简单地_因ؓ正则表达式有另一条规则,比懒惎ͼ贪婪规则的优先更高Q最先开始的匚w拥有最高的优先?#8212;—The match that begins earliest wins?/p>
?.懒惰限定W?/caption>
代码/语法 说明
*? 重复Lơ,但尽可能重?/span>
+? 重复1ơ或更多ơ,但尽可能重?/span>
?? 重复0ơ或1ơ,但尽可能重?/span>
{n,m}? 重复n到mơ,但尽可能重?/span>
{n,}? 重复nơ以上,但尽可能重?/span>

处理选项

在C#中,你可以?a title="MSDN 相关文" >Regex(String, RegexOptions)构造函?/a>来设|正则表辑ּ的处理选项。如QRegex regex = new Regex("\ba\w{6}\b", RegexOptions.IgnoreCase);

上面介绍了几个选项如忽略大写Q处理多行等Q这些选项能用来改变处理正则表辑ּ的方式。下面是.Net中常用的正则表达式选项Q?/p>
?.常用的处理选项
名称 说明
IgnoreCase(忽略大小? 匚w时不区分大小写?/td>
Multiline(多行模式) 更改^?span class="code">$的含义,使它们分别在L一行的行首和行֌配,而不仅仅在整个字W串的开头和l尾匚w?在此模式?$的精含意是:匚w\n之前的位|以及字W串l束前的位置.)
Singleline(单行模式) 更改.的含义,使它与每一个字W匹配(包括换行W\nQ?
IgnorePatternWhitespace(忽略I白) 忽略表达式中的非转义I白q启用由#标记的注释?/td>
RightToLeft(从右向左查找) 匚w从右向左而不是从左向双行?/td>
ExplicitCapture(昑ּ捕获) 仅捕获已被显式命名的l?/td>
ECMAScript(JavaScript兼容模式) 使表辑ּ的行Z它在JavaScript里的行ؓ一致?/td>

一个经常被问到的问题是Q是不是只能同时使用多行模式和单行模式中的一U?{案是:不是。这两个选项之间没有M关系Q除了它们的名字比较怼Q以至于让h感到疑惑Q以外?/p>

ql?递归匚w

q里介绍的^衡组语法是由.Net Framework支持的;其它语言Q库不一定支持这U功能,或者支持此功能但需要用不同的语法?/p>

有时我们需要匹配像( 100 * ( 50 + 15 ) )q样的可嵌套的层ơ性结?/span>Q这时简单地使用\(.+\)则只会匹配到最左边的左括号和最双的右括号之间的内?q里我们讨论的是贪婪模式Q懒惰模式也有下面的问题)。假如原来的字符串里的左括号和右括号出现的次C相等Q比?span class="string">( 5 / ( 3 + 2 ) ) )Q那我们的匹配结果里两者的个数也不会相{。有没有办法在这L字符串里匚w到最长的Q配对的括号之间的内容呢Q?/p>

Z避免(?span class="code">\(把你的大脑彻底搞p涂Q我们还是用括号代替圆括号吧。现在我们的问题变成了如何把xx <aa <bbb> <bbb> aa> yyq样的字W串里,最长的配对的尖括号内的内容捕获出来Q?/p>

q里需要用C下的语法构造:

  • (?'group') 把捕L内容命名为group,q压?span class="name">堆栈(Stack)
  • (?'-group') 从堆栈上弹出最后压入堆栈的名ؓgroup的捕获内容,如果堆栈本来为空Q则本分l的匚wp|
  • (?(group)yes|no) 如果堆栈上存在以名ؓgroup的捕获内容的话,l箋匚wyes部分的表辑ּQ否则l匹配no部分
  • (?!) 零宽负向先行断言Q由于没有后~表达式,试图匚wLp|

如果你不是一个程序员Q或者你自称E序员但是不知道堆栈是什么东西)Q你pL解上面的三种语法吧:W一个就是在黑板上写一?group"Q第二个是从黑板上擦掉一?group"Q第三个是看黑板上写的q有没有"group"Q如果有ql匹配yes部分Q否则就匚wno部分?/p>

我们需要做的是每碰C左括P在压入一?Open",每碰C个右括号Q就弹出一个,C最后就看看堆栈是否为空Q-如果不ؓI那p明左括号比右括号多,那匹配就应该p|。正则表辑ּ引擎会进行回?攑ּ最前面或最后面的一些字W?Q尽量整个表达式得到匹配?/p>

<                         #最外层的左括号
[^<>]* #最外层的左括号后面的不是括L内容
(
(
(?'Open'<) #到了左括号Q在黑板上写一?Open"
[^<>]* #匚w左括号后面的不是括号的内?br /> )+
(
(?'-Open'>) #到了右括号Q擦掉一?Open"
[^<>]* #匚wx号后面不是括L内容
)+
)*
(?(Open)(?!)) #在遇到最外层的右括号前面Q判断黑板上q有没有没擦掉的"Open"Q如果还有,则匹配失?br /> > #最外层的右括号

ql的一个最常见的应用就是匹配HTML,下面q个例子可以匚w嵌套?lt;div>标签Q?span class="regex"><div[^>]*>[^<>]*(((?'Open'<div[^>]*>)[^<>]*)+((?'-Open'</div>)[^<>]*)+)*(?(Open)(?!))</div>.

q有些什么东西没提到

我已l描qC构造正则表辑ּ的大量元素,q有一些我没有提到的东ѝ下面是未提到的元素的列表,包含语法和简单的说明。你可以在网上找到更详细的参考资料来学习它们--当你需要用到它们的时候。如果你安装了MSDN Library,你也可以在里面找到关?net下正则表辑ּ详细的文?/p>
?.未详细讨论的语?/caption>
代码/语法 说明
\a 报警字符(打印它的效果是电脑嘀一?
\b 通常是单词分界位|,但如果在字符c里使用代表退?/span>
\t 制表W,Tab
\r 回R
\v 竖向制表W?/span>
\f 换页W?/span>
\n 换行W?/span>
\e Escape
\0nn ASCII代码中八q制代码为nn的字W?/span>
\xnn ASCII代码中十六进制代码ؓnn的字W?/span>
\unnnn Unicode代码中十六进制代码ؓnnnn的字W?/span>
\cN ASCII控制字符。比如\cC代表Ctrl+C
\A 字符串开?cM^Q但不受处理多行选项的媄?
\Z 字符串结或行尾(不受处理多行选项的媄?
\z 字符串结?cM$Q但不受处理多行选项的媄?
\G 当前搜烦的开?/span>
\p{name} Unicode中命名ؓname的字W类Q例如\p{IsGreek}
(?>exp) 贪婪子表辑ּ
(?<x>-<y>exp) ql?/span>
(?im-nsx:exp) 在子表达式exp中改变处理选项
(?im-nsx) 辑ּ后面的部分改变处理选项
(?(exp)yes|no) 把exp当作零宽正向先行断言Q如果在q个位置能匹配,使用yes作ؓ此组的表辑ּQ否则用no
(?(exp)yes) 同上Q只是用空表达式作为no
(?(name)yes|no) 如果命名为name的组捕获C内容Q用yes作ؓ表达式;否则使用no
(?(name)yes) 同上Q只是用空表达式作为no

联系作?/h2>

好吧,我承?我骗了你,dq里你肯定花了不?0分钟.怿?q是我的?而不是因Z太笨.我之所以说"30分钟",是ؓ了让你有信心,有耐心l箋下去.既然你看Cq里,那证明我的阴谋成功了.被忽悠的感觉很爽吧?

要投诉我,或者觉得我其实可以做得更好,或者有M其它问题,Ƣ迎?a >我的博客让我知道.

                                                                      ----------------------http://unibetter.com/deerchao/zhengzhe-biaodashi-jiaocheng-se.htm



]]>jsf+spring+hibernate 整合出现的错误集?/title><link>http://www.aygfsteel.com/algz/articles/228548.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Fri, 12 Sep 2008 03:25:00 GMT</pubDate><guid>http://www.aygfsteel.com/algz/articles/228548.html</guid><wfw:comment>http://www.aygfsteel.com/algz/comments/228548.html</wfw:comment><comments>http://www.aygfsteel.com/algz/articles/228548.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/algz/comments/commentRss/228548.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/algz/services/trackbacks/228548.html</trackback:ping><description><![CDATA[一.错误信息提示:<br /> <span style="color: #99cc00;">WARN [main] (Configurator.java:126) - No configuration found. Configuring ehcache from <span style="color: #339966;">ehcache-failsafe.xml </span>found in the classpath: </span>jar:file:/E:/Users/algz/workspace/.metadata/.plugins/com.genuitec.eclipse.easie.tomcat.myeclipse/tomcat/webapps/item/WEB-INF/lib/ehcache-1.1.jar!/ehcache-failsafe.xml<br /> <br /> 解决Ҏ:<br /> ehcache-1.1.jar 包下的ehcache-failsafe.xml 文g复制?src 目录?新徏文g,复制内容). <br /> <br /> ?错误信息提示:<br /> <span style="color: #99cc00;">log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader).</span><br /> <span style="color: #339966;">log4j:WARN Please initialize the log4j system properly.</span><br /> <br /> 解决Ҏ:<br /> src 目录下创?log4j.properties 文g(具体内容,详见log4j配置文g).<br /> <br /> ?错误信息提示:<br /> <p><span style="color: #99cc00;">ERROR [main] (CGLIBLazyInitializer.java:130) - CGLIB Enhancement failed:</span> item.common.hibernate.query.partsum.Partsum<br /> <span style="color: #99cc00;">java.lang.NoSuchMethodError:</span> org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V</p> <p><span style="color: #339966;"> WARN [main] (PojoEntityTuplizer.java:173) - could not create proxy factory for:</span> item.common.hibernate.query.partsum.Partsum<br /> <span style="color: #339966;">org.hibernate.HibernateException: CGLIB Enhancement failed:</span> item.common.hibernate.query.partsum.Partsum</p> <p><span style="color: #33cccc;">Caused by: java.lang.NoSuchMethodError:</span> org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V</p> <p>///////////////////////////////////////////////////////////////////////////////////////////</p> <p>ERROR [main] (CGLIBLazyInitializer.java:130) - CGLIB Enhancement failed: item.common.hibernate.fourm.Fourm<br /> java.lang.NoClassDefFoundError</p> <p> WARN [main] (PojoEntityTuplizer.java:173) - could not create proxy factory for:item.common.hibernate.fourm.Fourm<br /> org.hibernate.HibernateException: CGLIB Enhancement failed: item.common.hibernate.fourm.Fourm</p> <p>Caused by: java.lang.NoClassDefFoundError<br />  at org.hibernate.proxy.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:116)</p> <p>////////////////////////////////////////////////////////////////////////////////////////////</p> <p>ERROR [main] (CGLIBLazyInitializer.java:130) - CGLIB Enhancement failed: item.common.hibernate.picture<br /> java.lang.NoClassDefFoundError</p> <p> WARN [main] (PojoEntityTuplizer.java:173) - could not create proxy factory for:item.common.hibernate.picture<br /> org.hibernate.HibernateException: CGLIB Enhancement failed: item.common.hibernate.picture</p> <p>Caused by: java.lang.NoClassDefFoundError<br />  at org.hibernate.proxy.CGLIBLazyInitializer.getProxyFactory(CGLIBLazyInitializer.java:116)</p> <p><br /> 解决Ҏ:<br /> Spring ?Hibernate q的一?jar 文g发生了版本冲H? 删除 WEB-INF/lib/asm-2.2.3.jar 然后重启 Tomcat.<br /> <br /> ?错误提示:<br /> <span>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'SessionFactory' defined in <span id="wmqeeuq" class="keyword">class</span><span> path resource [applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V  </span></span><br /> ...<br /> Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V<br /> <br /> 解决Ҏ:<br /> q不是真正的bean name错了,也不是找不到他的Ҏ.是asm-2.2.3.jar与asm.jar冲突.<br /> <span style="color: #339966;">正确的删除asm-2.2.3.jarҎ是到目的发布文件夹\WEB-INF\lib中删?不能用MyEclipse里删?因ؓ他在发布时仍没删?</span></p> <p><br /> </p> <p>五?/p> <p>严重: Exception sending context initialized event to listener instance of class <br /> <br /> org.springframework.web.context.ContextLoaderListener<br /> org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in <br /> <br /> ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is <br /> <br /> org.hibernate.DuplicateMappingException: Duplicate class/entity mapping Check<br />     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean<br /> <br /> (AbstractAutowireCapableBeanFactory.java:1336)<br /> <br />     ... 39 more<br /> 2009-8-21 11:52:37 org.apache.catalina.core.StandardContext start<br /> <br /> <br />         <property name="mappingResources"><br />             <list><br />                 <value>com/dao/Check.hbm.xml</value><br />                 <value>./Check.hbm.xml</value></list><br />         </property></p> <p><br /> </p> <p>六?/p> <p> <class catalog="page" name="com.dao.Check" table="check0908100816"><br />   <id name="checkid" type="java.lang.Integer"><br />    <column name="checkid"/><br />    <generator class="native"/><br />   </id><br /> <br /> <br /> 严重: Exception sending context initialized event to listener instance of class <br /> <br /> org.springframework.web.context.ContextLoaderListener<br /> org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory' defined in <br /> <br /> ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is <br /> <br /> org.hibernate.MappingException: entity class not found: Check<br />     at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean<br />     ... 52 more<br /> 2009-8-21 11:56:45 org.apache.catalina.core.StandardContext start<br /> </p> <img src ="http://www.aygfsteel.com/algz/aggbug/228548.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-09-12 11:25 <a href="http://www.aygfsteel.com/algz/articles/228548.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]sql的left join 命o详解http://www.aygfsteel.com/algz/articles/228220.html紫蝶∏飛揚↗紫蝶∏飛揚↗Wed, 10 Sep 2008 13:58:00 GMThttp://www.aygfsteel.com/algz/articles/228220.htmlhttp://www.aygfsteel.com/algz/comments/228220.htmlhttp://www.aygfsteel.com/algz/articles/228220.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/228220.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/228220.html 例表a
aid adate
1 a1
2 a2
3 a3
表b
bid bdate
1 b1
2 b2
4 b4
两个表a,b相连?要取出id相同的字D?
select * from a inner join b on a.aid = b.bidq是仅取出匹配的数据.
此时的取出的?
1 a1 b1
2 a2 b2
那么left join ?
select * from a left join b on a.aid = b.bid
首先取出a表中所有数?然后再加上与a,b匚w的的数据
此时的取出的?
1 a1 b1
2 a2 b2
3 a3 I字W?
同样的也有right join
指的是首先取出b表中所有数?然后再加上与a,b匚w的的数据
此时的取出的?
1 a1 b1
2 a2 b2
4 I字W?b4

LEFT JOIN ?LEFT OUTER JOIN?
左向外联接的l果集包?LEFT OUTER 子句中指定的左表的所有行Q而不仅仅是联接列所匚w的行。如果左表的某行在右表中没有匚w行,则在相关联的l果集行中右表的所有选择列表列均为空倹{?br />
                   ------------http://www.phpweblog.net/zwws/archive/2007/02/23/944.html


]]>
[转]SQL中的left outer join,inner join,right outer join用法http://www.aygfsteel.com/algz/articles/228219.html紫蝶∏飛揚↗紫蝶∏飛揚↗Wed, 10 Sep 2008 13:55:00 GMThttp://www.aygfsteel.com/algz/articles/228219.htmlhttp://www.aygfsteel.com/algz/comments/228219.htmlhttp://www.aygfsteel.com/algz/articles/228219.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/228219.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/228219.html 1 关系代数
合ƈ数据集合的理论基是关pM敎ͼ它是由E.F.Codd?970q提出的?br /> 在关pM数的形式化语a中:
?          用表、或者数据集合表C关pL者实体?br /> ?          用行表示元组?br /> ?          用列表示属性?br /> 关系代数包含以下8个关p运符
?          选取――返回满x定条件的行?br /> ?          投媄――从数据集合中返回指定的列?br /> ?          W卡积――是关系的乘法,它将分别来自两个数据集合中的行以所有可能的方式q行l合?br /> ?          q――关pȝ加法和减法,它可以在行的方向上合q两个表中的数据Q就像把一个表垒在另一个表之上一栗?br /> ?          交――返回两个数据集合所共有的行?br /> ?          差――返回只属于一个数据集合的行?br /> ?          q接――在水^方向上合q两个表Q其Ҏ是:两个表中在共同数据上怺匚w的那些行合ƈh?br /> ?          除――返回两个数据集之间的精匹配?br /> 此外Q作ZU实现现代关pM数运的ҎQSQLq提供了Q?br /> ?          子查询――类gq接Q但更灵z;在外部查询中Q方式可以用表辑ּ、列表或者数据集合的地方都可以用子查询的结果?br /> 本章主要讲q多U类型的q接、简单的和相关的子查询、几U类型的q、关p除以及其他的内宏V?br /> 2 使用q接
2.1 q接cd
在关pMCQ连接运是׃个笛卡尔U运和一个选取q算构成的。首先用W卡积完成对两个数据集合的乘运,然后对生成的l果集合q行选取q算Q确? 只把分别来自两个数据集合q且h重叠部分的行合ƈ在一赗连接的全部意义在于在水qx向上合ƈ两个数据集合Q通常是表Q,q生一个新的结果集合,其方 法是一个数据源中的行于另一个数据源中和它匹配的行组合成一个新元组?br /> SQL提供了多U类型的q接方式Q它们之间的区别在于Q从怺交叠的不同数据集合中选择用于q接的行时所采用的方法不同?br /> q接cd          定义
内连?nbsp;         只连接匹配的?br /> 左外q接          包含左边表的全部行(不管双的表中是否存在与它们匚w的行Q,以及双表中全部匚w的行
叛_q接          包含双表的全部行(不管左边的表中是否存在与它们匚w的行Q,以及左边表中全部匚w的行
全外q接          包含左、右两个表的全部行,不管另外一边的表中是否存在与它们匹配的行?br /> (H)(theta)q接          使用{g外的条g来匹配左、右两个表中的行
交叉q接          生成W卡积Q它不用Q何匹配或者选取条gQ而是直接一个数据源中的每个行与另一个数据源的每个行都一一匚w
在INFORMIX中连接表的查?br /> 如果FROM子句指定了多于一个表引用Q则查询会连接来自多个表的行。连接条件指定各列之_每个表至一列)q行q接的关pR因为正在比较连接条件中的列Q所以它们必d有一致的数据cd?br /> SELECT语句的FROM子句可以指定以下几种cd的连?br /> FROM子句关键?nbsp;         相应的结果集
CROSS JOIN          W卡乘U(所有可能的行对Q?br /> INNER JOIN          仅对满q接条g的CROSS中的?br /> LEFT OUTER JOIN          一个表满条g的行Q和另一个表的所有行
RIGHT OUTER JOIN          ?strong style="color: black; background-color: #ffff66;">LEFT
相同Q但两个表的角色互换
FULL OUTER JOIN        LEFT OUTER ?RIGHT OUTER中所有行的超?br />
2.2 内连接(Inner JoinQ?br /> 内连接是最常见的一U连接,它页被称为普通连接,而E.FCodd最早称之ؓ自然q接?br /> 下面是ANSI SQLQ?2标准
select *
from    t_institution i
inner join t_teller t
on i.inst_no = t.inst_no
where i.inst_no = "5801"
其中inner可以省略?br /> {h于早期的q接语法
select *
from t_institution i, t_teller t
where i.inst_no = t.inst_no
and i.inst_no = "5801"

2.3 外连?br /> 2.3.1          左外q接(Left Outer Jion)
select *
from    t_institution i
left outer join t_teller t
on i.inst_no = t.inst_no
其中outer可以省略?br /> 2.3.2          叛_q接(Rigt Outer Jion)
select *
from    t_institution i
right outer join t_teller t
on i.inst_no = t.inst_no
2.3.3          全外q接(Full Outer)
全外q接q回参与q接的两个数据集合中的全部数据,无论它们是否h与之相匹配的行。在功能上,它等价于对这两个数据集合分别q行左外q接和右外连接,然后再用消去重复行的ƈ操作上qC个结果集合ƈZ个结果集?br /> 在现实生zMQ参照完整性约束可以减对于全外连接的使用Q一般情况下左外q接p够了。在数据库中没有利用清晰、规范的U束来防范错误数据情况下Q全外连接就变得非常有用了,你可以用它来清理数据库中的数据?br /> select *
from    t_institution i
full outer join t_teller t
on i.inst_no = t.inst_no
2.3.4          外连接与条g配合使用
当在内连接查询中加入条g是,无论是将它加入到join子句Q还是加入到where子句Q其效果是完全一LQ但对于外连接情况就不同了。当把条件加入到join? 句时QSQL Server、Informix会返回外q接表的全部行,然后使用指定的条件返回第二个表的行。如果将条g攑ֈwhere子句中,SQL Server会首先q行q接操作Q然后用where子句对连接后的行q行{选。下面的两个查询展示了条件放|位子对执行l果的媄响:
条g?strong style="color: black; background-color: #99ff99;">join
子句
select *
from    t_institution i
left outer join t_teller t
on i.inst_no = t.inst_no
and i.inst_no = “5801”
l果是:
inst_no      inst_name              inst_no      teller_no    teller_name
5801         天河?nbsp;                5801         0001         tom
5801         天河?nbsp;                5801         0002         david
5802         秀?br /> 5803         白云?br /> 条g在where子句
select *
from    t_institution i
left outer join t_teller t
on i.inst_no = t.inst_no
where i.inst_no = “5801”
l果是:
inst_no      inst_name              inst_no      teller_no    teller_name
5801         天河?nbsp;                5801         0001         tom
5801         天河?nbsp;                5801         0002         david

2.4 自nq接
自nq接是指同一个表自己与自p行连接。这U一元连接通常用于从自反关p(也称作递归关系Q中抽取数据。例如h力资源数据库中雇员与老板的关pR?br /> 下面例子是在机构表中查找本机构和上机构的信息?br /> select s.inst_no superior_inst, s.inst_name sup_inst_name, i.inst_no, i.inst_name
from t_institution i
join t_institution s
on i.superior_inst = s.inst_no

l果是:
superior_inst sup_inst_name          inst_no      inst_name
800             q州?nbsp;                5801         天河?br /> 800             q州?nbsp;                5802         秀?br /> 800             q州?nbsp;                5803         白云?br />
2.5 交叉(无限? q接
交叉q接用于对两个源表进行纯关系代数的乘q算。它不用连接条件来限制l果集合Q而是分别来自两个数据源中的行以所有可能的方式q行l合。数据集合中 一的每个行都要与数据集合二中的每一个行分别l成一个新的行。例如,如果W一个数据源中有5个行Q而第二个数据源中?个行Q那么在它们之间q行交叉q接 ׃产生20个行。h们将q种cd的结果集UCؓW卡乘U?br /> 大多C叉连接都是由于错误操作而造成的;但是它们却非帔R合向数据库中填充例子数据,或者预先创Z些空行以便ؓE序执行期间所要填充的数据保留I间?br /> select *
from    t_institution i
cross join t_teller t
在交叉连接中没有on条g子句

       -----http://hi.baidu.com/llscompazz/blog/item/dc5e23d9ce2b62eb39012fb4.html


]]>[转]SQL中的各种JOINQinner join,full outer join,left join,right join,cross join Q?/title><link>http://www.aygfsteel.com/algz/articles/228218.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Wed, 10 Sep 2008 13:53:00 GMT</pubDate><guid>http://www.aygfsteel.com/algz/articles/228218.html</guid><wfw:comment>http://www.aygfsteel.com/algz/comments/228218.html</wfw:comment><comments>http://www.aygfsteel.com/algz/articles/228218.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/algz/comments/commentRss/228218.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/algz/services/trackbacks/228218.html</trackback:ping><description><![CDATA[<span style="font-size: 10pt; color: #868374;"> <p style="margin: 0cm 0cm 0pt; line-height: 150%; text-align: left;" align="left"><font color="#000000"><strong><span style="font-size: 12pt; line-height: 150%;">SQL</span></strong><strong><span style="font-size: 12pt; line-height: 150%;">中的各种JOIN</span></strong><strong><span style="font-size: 12pt; line-height: 150%;">Q?span>inner join,full outer join,left join,right join,cross join </span>Q?/span></strong></font></p> <p style="margin: 0cm 0cm 0pt; text-align: left;" align="left"><font color="#000000" size="3">SQL</font><font color="#000000" size="3">中的q接可以分ؓ内连接,外连接,以及交叉q接 <span>(xW卡积</span></font><font size="3"><font color="#000000">) <br /> <br /> a. 交叉q接</font></font><font size="3"><font color="#000000"><span>CROSS JOIN<br /> </span>如果不带WHERE条g子句Q它会q回被连接的两个表的W卡积Q返回结果的行数{于两个表行数的乘积Q?/font></font><br /> <br /> <font color="#000000" size="3">举例,下列A、B?span>C </span>执行l果相同Q但是效率不一P</font><span><br /> <font size="3"><font color="#000000">A:SELECT * FROM table1 CROSS JOIN table2<br /> B:SELECT * FROM table1,table2</font></font></span></p> </span> <p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><font size="3"><font color="#000000">C:<span>select * from table1 a inner join table2 b</span></font></font></p> <p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><span><br /> <font color="#000000" size="3">A:select a.*,b.* from table1 a,table2 b where a.id=b.id<br /> B:select * from table1 a cross join table2 b where a.id=b.id (</font></span><span><font size="3"><font color="#000000">注:<span>cross join</span>后加条g只能用where,不能用on)</font></font></span><br /> <font color="#000000" size="3">C:</font><font size="3"><font color="#000000"><span>select * from table1 a inner join table2 b on a.id=b.id</span></font></font></p> <p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><br /> <font color="#000000" size="3">一般不使用Ҏ<span>A和BQ因为如果有WHERE子句的话Q往往会先生成两个表行CU的行的数据表然后才ҎWHERE条g从中选择?/span></font><font size="3"><font color="#000000"><span> <br /> </span>因此Q如果两个需要求交际的表太大Q将会非帔R常慢Q不使用?/font></font><br /> <br /> <font color="#000000" size="3">b. </font><font color="#000000" size="3">内连?/font><font size="3"><font color="#000000"><span>INNER JOIN<br /> </span>两边表同时符合条件的l合</font></font></p> <p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><span><font color="#000000" size="3">如果仅仅使用</font><span><br /> <font size="3"><font color="#000000">SELECT * FROM table1 INNER JOIN table2</font></font></span></span></p> <p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><font color="#000000" size="3">内连接如果没有指定连接条件的话,和笛卡尔U的交叉q接l果一P但是不同于笛卡尔U的地方是,没有W卡积那么复杂要先生成行数乘积的数据表Q内q接的效率要高于W卡积的交叉连接?/font><span><br /> <br /> <font size="3"><font color="#000000">但是通常情况下,使用<span>INNER JOIN</span>需要指定连接条件?/font></font></span></p> <p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><font size="3"><font color="#000000">***************关于{D接和自然q接</font></font></p> <p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><font size="3"><font color="#000000">{D?span>(=号应用于q接条g<span>, </span>不会去除重复的列)</span></font></font></p> <p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><font size="3"><font color="#000000">自然q接(会去除重复的?</font></font></p> <p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><font color="#000000" size="3">数据库的q接q算都是自然q接Q因Z允许有重复的行(元组Q存在?/font><br /> <font size="3"><font color="#000000">例如Q?/font></font></p> <p style="margin: 0cm 0cm 0pt; background: white none repeat scroll 0% 0%; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; text-align: left;" align="left"><span><font color="#000000" size="3">SELECT * FROM table1 AS a INNER JOIN table2 AS b on a.column=b.column<br /> <br /> c. </font></span><span><font color="#000000" size="3">外连?/font><font size="3"><font color="#000000"><span>OUTER JOIN<br /> </span>指定条g的内q接Q仅仅返回符合连接条件的条目?/font></font><br /> <font color="#000000" size="3">外连接则不同Q返回的l果不仅包含W合q接条g的行Q而且包括左表(左外q接?span>), </span>双(双接时)或者两边连?全外q接?的所有数据行?/font><br /> <br /> <font color="#000000" size="3">1)</font><font color="#000000" size="3">左外q接</font><font size="3"><font color="#000000"><span>LEFT [OUTER] JOIN <br /> </span>昄W合条g的数据行Q同时显C左Ҏ据表不符合条件的数据行,双没有对应的条目显C?/font></font><font size="3"><font color="#000000">NULL<br /> 例如</font></font><span><br /> <font color="#000000" size="3">SELECT * FROM table1 AS a LEFT [OUTER] JOIN ON a.column=b.column<br /> 2)</font></span><font color="#000000" size="3">叛_q接</font><font size="3"><font color="#000000"><span>RIGHT [OUTER] JOIN<br /> </span>昄W合条g的数据行Q同时显C右Ҏ据表不符合条件的数据行,左边没有对应的条目显C?/font></font><font size="3"><font color="#000000">NULL<br /> 例如</font></font><span><br /> <font color="#000000" size="3">SELECT * FROM table1 AS a RIGHT [OUTER] JOIN ON a.column=b.column<br /> 3)</font></span><font color="#000000" size="3">全外q接</font><font size="3"><font color="#000000"><span>full [outer] join<br /> </span>昄W合条g的数据行Q同时显C左右不W合条g的数据行Q相应的左右两边昄NULLQ即昄左连接、右q接和内q接的ƈ?/font></font></span></p>                            ------http://hi.baidu.com/magickerr/blog/item/393c0a01aa13290b7aec2c63.html <img src ="http://www.aygfsteel.com/algz/aggbug/228218.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-09-10 21:53 <a href="http://www.aygfsteel.com/algz/articles/228218.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>String,int,Integer,char cd转换http://www.aygfsteel.com/algz/articles/227937.html紫蝶∏飛揚↗紫蝶∏飛揚↗Tue, 09 Sep 2008 06:18:00 GMThttp://www.aygfsteel.com/algz/articles/227937.htmlhttp://www.aygfsteel.com/algz/comments/227937.htmlhttp://www.aygfsteel.com/algz/articles/227937.html#Feedback1http://www.aygfsteel.com/algz/comments/commentRss/227937.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/227937.html 如何字?String 转换成整?int?
int i = Integer.valueOf(my_str).intValue();

int i=Integer.parseInt(str);

如何字?String 转换成Integer ?
Integer integer=Integer.valueOf(str);

如何整?int 转换成字?String ?
1.) String s = String.valueOf(i);
 
2.) String s = Integer.toString(i);
 
3.) String s = "" + i;

如何整?int 转换成Integer ?
Integer integer=new Integer(i);

如何Integer 转换成字?String ?
Integer integerQString

如何Integer 转换?int ?
int num=Integer.intValue();

如何String转换?nbsp; BigDecimal  ?
 BigDecimal d_id = new BigDecimal(str);


如何?String 转换?char ?
char[] ca="123".toCharArray();

如何char转换成String?
String s=ca.toString();      //Mcd都可以采用toString()转换成Stringcd

//-----------------日期-------------------------

Calendar calendar=Calendar.getInstance();
  int year=calendar.get(Calendar.YEAR);
  int month=calendar.get(Calendar.MONTH)+1;
  int day=calendar.get(Calendar.DATE);

获取今天的日期字W串
String today=java.text.DateFormat.getDateInstance().format(new java.util.Date());
获取今天的日?br /> new java.sql.Date(System.currentTimeMillis())



]]>
hibernate 分页查询http://www.aygfsteel.com/algz/articles/227905.html紫蝶∏飛揚↗紫蝶∏飛揚↗Tue, 09 Sep 2008 03:47:00 GMThttp://www.aygfsteel.com/algz/articles/227905.htmlhttp://www.aygfsteel.com/algz/comments/227905.htmlhttp://www.aygfsteel.com/algz/articles/227905.html#Feedback3http://www.aygfsteel.com/algz/comments/commentRss/227905.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/227905.html /**
  * 使用 hql 语句q行操作
  * @param hql       HSQL 查询语句
  * @param offset   开始取数据的下?br />   * @param length   d数据记录?br />   * @return List       l果?br />   */

 public List getListForPage ( final String hql , final int offset , final int length ) {

     List list = getHibernateTemplate().executeFind ( new HibernateCallback ( ) {
           public Object doInHibernate ( Session session ) throws HibernateException, SQLException {
                     //final String queryString = "from Fourm f where f.identity='" + property+"'";
                     Query query = session.createQuery ( hql ) ;
                     //    query.setString(0, value);  //讄查询参数
                     query.setFirstResult ( offset ) ;
                     query.setMaxResults ( length ) ;
                     List list = query.list ( ) ;
                     return list ;
           }
    }) ;
    return list ;
 }



]]>
在Spring托管的Hibernate中用二U缓存的三种Ҏhttp://www.aygfsteel.com/algz/articles/227902.html紫蝶∏飛揚↗紫蝶∏飛揚↗Tue, 09 Sep 2008 03:37:00 GMThttp://www.aygfsteel.com/algz/articles/227902.htmlhttp://www.aygfsteel.com/algz/comments/227902.htmlhttp://www.aygfsteel.com/algz/articles/227902.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/227902.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/227902.htmlQ.在spring的配|文件中 applicationContent.xmlQhibernate部分加入
xml 代码
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>  
    <prop key="hibernate.cache.use_query_cache">true</prop>  

Q.?hibernate的配|文件中讄cache{略

xml 代码
<cache usage="nonstrict-read-write"/>  

Q.在DAO中,调用findҎ查询之前Q设|用缓?/p>

java 代码
getHibernateTemplate().setCacheQueries(true); 



]]>
HIbernate的参C用说?/title><link>http://www.aygfsteel.com/algz/articles/197799.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Fri, 02 May 2008 14:43:00 GMT</pubDate><guid>http://www.aygfsteel.com/algz/articles/197799.html</guid><wfw:comment>http://www.aygfsteel.com/algz/comments/197799.html</wfw:comment><comments>http://www.aygfsteel.com/algz/articles/197799.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/algz/comments/commentRss/197799.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/algz/services/trackbacks/197799.html</trackback:ping><description><![CDATA[<strong>set节点有以下属?/strong>Q摘自Hibernate文Q:<br /> (1) name 集合属性的名称 <br />  <br /> (2) table Q可选默认ؓ属性的名称Q这个集合表的名U?不能在一对多的关联关pM使用) <br />  <br /> (3) schema (可? 表的schema的名U? 他将覆盖在根元素中定义的schema <br />  <br /> (4) lazy (可选默认ؓfalse) lazy(可?-默认为false) 允许延迟加蝲Qlazy initialization Q?不能在数l中使用) <br />  <br /> (5) inverse (可选默认ؓfalse) 标记q个集合作ؓ双向兌关系中的方向一端?nbsp;<br />  <br /> (6) cascade (可选默认ؓnone) 不进行联操?如保?修改,删除 <br />  <br /> (7) sort(可?指定集合的排序顺? 其可以ؓ自然?natural)或者给定一个用来比较的cR?nbsp;<br />  <br /> (8) order-by (可? 仅用于jdk1.4) 指定表的字段(一个或几个)再加上asc或者desc(可?, 定义Map,Set和Bag的P代顺?nbsp;<br />  <br /> (9) where (可? 指定L的SQL where条g, 该条件将在重新蝲入或者删除这个集合时使用(当集合中的数据仅仅是所有可用数据的一个子集时q个条g非常有用) <br />  <br /> (10) outer-join(可?指定q个集合,只要可能,应该通过外连?outer join)取得。在每一个SQL语句? 只能有一个集合可以被通过外连接抓?译者注: q里提到的SQL语句是取得集合所属类的数据的Select语句) <br />  <br /> (11) batch-size (可? 默认?) 指定通过延迟加蝲取得集合实例的批处理块大("batch size"Q?nbsp;<br />  <br /> (12) access(可?默认为属性property):Hibernate取得属性值时使用的策?nbsp;<br />  <br /> <strong>many-to-one节点有以下属?/strong>Q摘自Hibernate文Q:<br /> (1) name: 属性名?nbsp;<br />  <br /> (2) column (可?: 字段名?nbsp;<br />  <br /> (3) class (可?nbsp;- 默认是通过反射得到属性类?: 兌的类的名字?nbsp;<br />  <br /> (4) cascadeQ联) (可?: 指明哪些操作会从父对象联到兌的对象?nbsp;<br />  <br /> (5) outer-joinQ外q接Q?nbsp;(可?nbsp;- 默认?nbsp;自动): 当设|hibernate.use_outer_join的时候,对这个关联允许外q接抓取?nbsp;<br />  <br /> (6) update, insert (可?nbsp;- defaults to true) 指定对应的字D|否在用于UPDATE ??nbsp;INSERT的SQL语句中包含。如果二者都是false,则这是一个纯_的“外源性(derivedQ?#8221;兌Q它的值是通过映射到同一个(或多个)字段的某些其他属性得到的Q或者通过trigger(除法器)Q或者是其他E序?nbsp;<br />  <br /> (7) property-ref: (可? 指定兌cȝ一个属性,q个属性将会和本外键相对应。如果没有指定,会用对方关联类的主键?nbsp;<br />  <br /> (8) access (可?nbsp;- 默认?nbsp;property): Hibernate用来讉K属性的{略?nbsp;<br />  <br /> cascade 属性允怸列| all, save-update, delete, none。设|除了none以外的其它g传播特定的操作到兌的(子)对象中。参见后面的“Lifecycle Objects(自动理生命周期的对象)”?nbsp;<br /> <br /> outer-join参数允许下列三个不同| <br /> <br /> auto (默认) 使用外连接抓取关联(对象Q,如果被关联的对象没有代理(proxy) <br /> <br /> true 一直用外q接来抓取关?nbsp;<br /> <br /> false 永远不用外q接来抓取关?nbsp;<img src ="http://www.aygfsteel.com/algz/aggbug/197799.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-05-02 22:43 <a href="http://www.aygfsteel.com/algz/articles/197799.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Hibernate HQL 语法 及相关的外键兌http://www.aygfsteel.com/algz/articles/191835.html紫蝶∏飛揚↗紫蝶∏飛揚↗Thu, 10 Apr 2008 05:33:00 GMThttp://www.aygfsteel.com/algz/articles/191835.htmlhttp://www.aygfsteel.com/algz/comments/191835.htmlhttp://www.aygfsteel.com/algz/articles/191835.html#Feedback1http://www.aygfsteel.com/algz/comments/commentRss/191835.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/191835.htmlpa.equipmentaccount.id=?pa.equipmentaccount.idpa.equipmentaccount.idHQL

例如对于TUserc?br />
1.实体查询
String hql = " from User";

执行q条语句?span style="color: #339966">q回User以及User子类?span style="color: #339966">U录?br /> ?  如果 TUser cd有外? 查询l果不会报错,但结果中的外键ؓI?讉K报I指针错?
解决Ҏ:  select 别名.属?from c?as 别名. 没有别名.属性仍然报?  //此方法不一定能解决,但不会错.


hql = "from java.lang.Object"
会返回数据库中所有库表的U录?br />
where 语句Qas可以省略
hql = "from User as user where user.name='yyy'";    //user.name为类的属?/font>

hql = "from User user where user.name='yyy'";

where子句中,我们可以通过比较q算W设定条Ӟ如:
=, <>, >, <, >=, <=, between XX and XX, not between, in (xx,xx), not in, is, like %XX% {?br />
2.属性查?br /> (1)List list = session.createQuery("select user.name, user.age from User  user").list();

q可以在HQL中动态构造对象实例的ҎQ将数据装?br /> (2)List list = session.createQuery("select new User(user.name, user.age) from TUser as user").list();

Iterator it = list.iterator();
while(it.hasNext() ) {
      User user = (User)it.next();
      System.out.println(user.getName());
}

但是要注意这里的User对象只是对name和age属性的装Q其他状态均未赋|所以不能用它来q行更新操作?br />
也可以在HQL的Select子句中用统计函?br /> "select count(*) ,min(user.age) from User as user"

也可以用distinct关键字来删除重复U录?br /> select distinct user.name from User as user;

3.实体的更C删除

hibernate 3中,提供了更灉|的方?bulk(集体) delete/update)
更新Q?br />      Query query = session.createQuery("update User set age=18 where id=1"); //age==User.age
     query.executeUpdate();
删除Q?br />
     session.createQuery("delete User where age>=18");
     query.executeUpdate();

?不支持联表更?x处的User对象不能外键兌.因ؓ更新操作不允许多表联接更?只能更新一张表(SQL规定).
?
update TbPartaccount pa set inoutflag=9 where pa.equipmentaccount.id=:id instr(pa.equipmentaccount.id,'Z')=1
pa.equipmentaccount.inoutcode报错,
pa.equipmentaccount.idq是
TbPartaccount 的字D?外键兌)

Hibernate 不能像我们想像的那样转换成以下方?所以还是需要手工写子查?
UPDATE TB_PARTACCOUNT pa set PA.INOUTFLAG=9 where pa.equipmentaccount.id=? and pa.eaccount_code=(
SELECT ea.id from TB_EQUIPMENTACCOUNT ea 
where ea.id=pa.EACCOUNT_CODE and INSTR(ea.inoutcode, 'Z')=1)
而是转成以下形式q报异常:没有扑ֈSET关键?
UPDATE TB_PARTACCOUNT pa set PA.INOUTFLAG=9 where 
pa.equipmentaccount.id=? and INSTR(pa.eaccount_code, 'Z')=1
 
  

  

4.分组与排?br /> Order by子句Q?br />      from User user order by user.name, user.age desc
Group by子句和Having子句
     "select count(user), user.age from User user group by user.age having count(user)>10"

5.参数邦定
通过序占位W?来填充参敎ͼ
1)hibernate 2 中通过session.findҎ来填?br />         session.find("from User user where user.name=?", "Erica", Hibernate.STRING);
   多个参数的情况:
        Object[] args = new Object[] {"Erica", new Integer(20)};
        Type[] types = new Type{Hibernate.STRING, Hibernate.INTEGER};
        session.find("from TUser user where user.name=? and user.age=?", args, types);

2)通过Query接口q行参数填充Q?br />          Query query = session.createQuery("from User user where user.name=? and user.age>?");
         query.setString(0,"Erica");
         query.setInteger(1, 20);

通过引用占位W来填充参数Q?br />          String hql = "from User where name=:name";
         Query query = session.createQuery(hql);
         query.setParameter("name","Erica");

甚至可以查询条件封装ؓ一个JavaBean
class UserQuery {
     private String name;
     private Integer age;
     //getter and setter
}
String hql = "from TUser where name=:name and age=:age";
Query query = session.createQuery(hql);
UserQuery uq = new UserQuery();
uq.setName("Erica");
uq.setAge(new Integer(20));

query.setProperties(uq); //会调用里面的getter?
query.iterate();

6.联合查询
(org.hibernate.LazyInitializationException: could not initialize proxy - no Session 异常,可能是HQL语句没有q行联表查询,产生讉K的属性不存在.)
   User? id, name
   Addresses? user_id, addresses
(1)自然联接(内联?:  inner join [fetch]
1.HQL: from User u inner join fetch u.addresses
   SQL: select * from User?u inner join Addresses a on u.id=a.user_id //u.id=a.user_id在XML中已配置,所以可以省?
   fetch: Addresses对象d?立即填充到User对象对应的外?集合)?

2.HQL: from User u inner join  u.addresses 
   不加fetch,则返回的l果集中的每一条记录是一个Object数组,数组包括User和Addresses两个对象, q且User对象.addresses集合已被Addresses对象自动填充.

(2)左连?  left outer join [fetch]
    ?1), q回的结果不同而已.

(3)双?  right out join 
    fetch无效,因ؓUser对象可能为NULL,无法q行填充,但返回结果里的记录是数组.

(4)W卡交? full join (使用很少) 
    ?3), q回l果不同而已.

(5)W卡集:  排列l合Qform User, Address

联合查询如有不懂, 详见SQL联合语句:
SQL中的left outer join,inner join,right outer join用法:   http://www.aygfsteel.com/algz/articles/228219.html
SQL中的各种JOINQinner join,full outer join,left join,right join,cross join Q?a href="http://www.aygfsteel.com/algz/articles/228218.html">:http://www.aygfsteel.com/algz/articles/228218.html
sql的left join 命o详解 : http://www.aygfsteel.com/algz/articles/228220.html



]]>webapps JSF+Spring+Hibernate目开发流E?/title><link>http://www.aygfsteel.com/algz/articles/190077.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Tue, 01 Apr 2008 06:48:00 GMT</pubDate><guid>http://www.aygfsteel.com/algz/articles/190077.html</guid><wfw:comment>http://www.aygfsteel.com/algz/comments/190077.html</wfw:comment><comments>http://www.aygfsteel.com/algz/articles/190077.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/algz/comments/commentRss/190077.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/algz/services/trackbacks/190077.html</trackback:ping><description><![CDATA[<h:outputText value="主题Q?{index.appinfo.maxdocsum} value里不能加入HTML代码但可以加入EL" /><br /> <br /> ?LE图.<br /> <span style="color: #008000">一.创徏数据?</span><br /> ?<br /> 1.数据库中设计INT(java.lang.Interger),  VARCHAR(N)(java.lang.String),  DATE(java.lang.Date)<br /> 2.1:N的情况下, 数据库中设计外键(N?和集?一?.<br /> 2.hibernate q向工程.<br /> <br /> <span style="color: #008000">?dJSF, Spring, Hibernate 库引?<br /> <span style="color: #000000">Spring d如下Q?/span><br /> </span><img height="98" alt="" src="http://www.aygfsteel.com/images/blogjava_net/algz/addspring1.jpg" width="397" border="0" /><br /> <img height="95" alt="" src="http://www.aygfsteel.com/images/blogjava_net/algz/addspring2.jpg" width="394" border="0" /><br /> <br /> <span style="color: #008000">? 为spring 配置 web.xml ?faces-config.xml .</span><br /> (1)web.xml<br />  <context-param><br />   <param-name><span style="color: #339966">contextConfigLocation</span></param-name><br />   <param-value>/WEB-INF/applicationContext.xml</param-value><br />  </context-param><br /> <br /> (2)web.xml<br /> <listener><br />        <listener-class><span style="color: #339966">org.springframework.web.context.ContextLoaderListener</span></listener-class><br /> </listener>              //Servlet API 2.3以后<br /> ?<br />  <servlet><br />   <servlet-name>context</servlet-name><br />   <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class><br />   <load-on-startup>1</load-on-startup><br />  </servlet> <p><br /> (3)faces-config.xml<br /> <application><br /> <variable-resolver><span style="color: #339966">org.springframework.web.jsf.DelegatingVariableResolver</span></variable-resolver><br /> </application><br /> <br /> (4)讄qo?解决q问题<br /> 详见:<a href="http://www.aygfsteel.com/algz/articles/201833.html ">http://www.aygfsteel.com/algz/articles/201833.html </a>W二?br /> <br /> 以上配置完成?<span style="color: #33cccc">JSF</span>可以访?span style="color: #33cccc">SPRING理的BEAN</span>.<br /> <br /> <span style="color: #339966"><span style="color: #339966"><span style="color: #008000">?spring+hiberante集成?asm-2.2.3.jar与asm.jar冲突:</span><br /> </span></span><span>org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'SessionFactory' defined in <span id="wmqeeuq" class="keyword">class</span><span> path resource [applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V  </span></span><br /> ...<br /> Caused by: java.lang.NoSuchMethodError: org.objectweb.asm.ClassVisitor.visit(IILjava/lang/String;Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;)V<br /> <br /> 正确的解x?<br /> <span style="color: #000000">是到目的发布文件夹\WEB-INF\lib下删?span style="color: #339966">asm-2.2.3.jar</span>,不能用MyEclipse里删?因ؓ他在发布时仍没删?</span><br /> <br /> <span style="color: #008000">?创徏q行分类的包.<br /> </span>com.dao(数据讉K?, com.service(业务?, com.web(表示?<br /> <br /> <span style="color: #008000">?创徏c?(完成MODEL层设?.   <br />     <br /> <span style="color: #000000">*****************************(<u>也可以利用MyEclipse反向ORM功能自动产生,<span style="color: #339966">但应注意自动配置引v?cd全名"的错?/span></u>)*******************</span><br /> <br /> </span>  (一)数据讉K?<span style="color: #008000">DAO</span>)开? <br /> <br />          Spring 配置文gQ附加) <br />            (1)配置数据?nbsp;         <span style="color: #000000"><</span><span style="color: #000000">bean id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">dataSource</span><span style="color: #000000">"</span> ...>      //Myeclipse Hibernate自动反{工具自动配置<br />            (2)配置会话工厂     <span style="color: #000000"><</span><span style="color: #000000">bean id</span><span style="color: #000000">=</span><span style="color: #000000">"</span><span style="color: #000000">sessionFactory</span><span style="color: #000000">" ...>  //Myeclipse Hibernate自动反{工具自动配置<br />            (3)<span style="color: #000000"><span style="color: #000000"><span style="color: #000000">配置事务理?/span>  </span><bean id="transactionManager" ...><br /> </span></span>           (4)配置事务代理      <a href="http://www.aygfsteel.com/algz/articles/163236.html">www.aygfsteel.com/algz/articles/163236.html</a><br /> <span style="color: #339966">          <span style="color: #808000"> <span style="color: #000000">(5)数据讉K?span style="color: #808000">Bean</span>作ؓ属性注入业务层<span style="color: #808000">Property</span>? </span></span>(?不要用NEW创徏数据讉K层对?否则得不到ServletContext而报?)<br /> </span>?<br /> /**数据讉K层BeanQMyeclipse Hibernate自动反{工具配置Q?/<br />  <bean id="<span style="color: #99cc00">userDao</span>" class="com.data.dao.impl.UserDaoImpl"><br />   <property name="sessionFactory"><br />    <ref local="sessionFactory" /><br />   </property><br />  </bean><br /> <br />  /**业务层BeanQMyeclipse Spring配置文中可以配|,但需先定义好相关c)*/<br />  <bean id="<span style="color: #33cccc">userService</span>" class="com.model.service.impl.UserServiceImpl"><br />   <property name="userDao"><br />    <ref bean="<span style="color: #99cc00">userDao</span>" /><br />   </property><br />  </bean><br /> <br />         1. 创徏 <span style="color: #99cc00">数据讉K层接?    </span><span style="color: #008080">必须创徏</span>,详见:<a href="http://www.aygfsteel.com/algz/articles/262893.html">http://www.aygfsteel.com/algz/articles/262893.html</a><br />             public interface <span style="color: #99cc00">数据讉K层接?</span>{   //在类已存在的情况?d其接?Refactor(重构Q?>Extract Interfaces提取接口<br />                 public String add...();<br />                 public String save...();<br />                   ......                                            //update, delete, load<br />             }<br /> <br />         2 .创徏<span style="color: #33cccc">数据讉K层实现类</span>    //<span style="color: #000000"><span style="color: #000000">ORM反向功能自动配置<br /> </span></span><span style="color: #339966">           <span style="color: #000000"> public class </span><span style="color: #33cccc">数据讉K层实现类</span> <span style="color: #000000">extends <span style="color: #339966">HibernateDaoSupport</span> implements </span><span style="color: #99cc00">数据讉K层接?</span></span>{<br />             ......                                          //getHibernateTemplate().save(user)<br />             }<br />              在实现类的方?throw DataAccessException)中封?getHibernateTemplate().save(user) {Spring已封装的持久化方?(?如果使用Hibernate API 要用try{...}catch{...}自行处理导常.)         <br /> <br />         3.注意事项:<span style="color: #3366ff"> could not initialize proxy - no Session </span>异常,  可能是没有联表查?详见<a href="http://www.aygfsteel.com/algz/articles/191835.html"><font color="#000000">: </font>http://www.aygfsteel.com/algz/articles/191835.html</a><br /> <br /> <br /> <span style="color: #000000"><span style="color: #000000">*****************************(<u>也可以利用MyEclipse反向ORM功能自动产生</u>)***********************************</span></span><br /> <br />    (?业务逻辑?<span style="color: #33cccc"><span style="color: #008000">Service</span></span>)开?<br />          1.创徏<span style="color: #99cc00">业务逻辑层接?/span>. <br /> package com.service;<br /> import com.dao.CheckDAO;<br /> public interface <span style="color: #99cc00">ICheckService </span>{<br />     public abstract CheckDAO getCheckDAO();<br />     public abstract void setCheckDAO(CheckDAO checkDAO);<br />     public abstract String searchCheck();<br /> }<br /> <br />          2.创徏<span style="color: #33cccc">业务逻辑层实现类</span> <br /> <span style="color: #339966">             public class <span style="color: #33cccc">业务逻辑层实现类</span> implements <span style="color: #99cc00">业务逻辑层接?/span></span>.<br />              在实现类? 引用的数据访问层对象实例采用DI的设值方式注?br />                                    在业务逻辑Ҏ(throw DataAccessException)?使用数据讉K层对象实例来讉K数据?  <br /> package com.service;<br /> import java.util.List;<br /> import org.json.simple.JSONArray;<br /> import org.json.simple.JSONObject;<br /> import com.dao.Check;<br /> import com.dao.CheckDAO;<br /> import com.dao.ICheckDAO;<br /> <br /> public class <span style="color: #33cccc">CheckService </span>implements <span style="color: #99cc00">ICheckService </span>{<br /> private CheckDAO checkDAO;</p> <p>public CheckDAO getCheckDAO() {<br />  return checkDAO;<br /> }</p> <p>public void setCheckDAO(CheckDAO checkDAO) {<br />  this.checkDAO = checkDAO;<br /> }<br /> <br /> public String searchCheck(){<br />  List<Check> l=checkDAO.findAll();<br />  JSONArray ja=new JSONArray();<br />  JSONObject jo=new JSONObject();<br /> for(Check c:l){<br /> //  jo.put("department", c.getDepartment());<br /> //  jo.put("checkid", c.getCheckid());<br /> //  jo.put("nam", c.getNam());<br /> //  jo.put("num", c.getNum());<br /> //  jo.put("ondutytime", c.getOndutytime());<br /> //  jo.put("offdutytime", c.getOffdutytime1());<br /> //  jo.put("registerdate", c.getRegisterdate());<br /> //  jo.put("overtime", c.getOvertime());<br /> //  ja.add(jo.clone());<br /> //  jo.clear();<br />  }<br />   return "";<br /> }</p> <p>}<br /> <br />          <span style="color: #808000"><span style="color: #000000">3.数据</span><span style="color: #000000">讉K?span style="color: #808000">Bean</span>作ؓ属性注?span style="color: #33cccc">业务逻辑层实现类</span>?span style="color: #808000">Property</span>? </span></span>(?不要用NEW创徏数据讉K层对?否则得不到ServletContext而报?)<br /> ?<br /> /**数据讉K层BeanQHibernate自动反{工具<span style="color: #008000">自动</span>配置Q?/<br />  <bean id="<span style="color: #99cc00">userDao</span>" class="com.data.dao.impl.UserDaoImpl"><br />   <property name="sessionFactory"><br />    <ref local="sessionFactory" /><br />   </property><br />  </bean><br /> <br />  /**业务逻辑层BeanQSpring配置文?span style="color: #008000">手动</span>配置Q但需先定义好相关c)*/<br />  <bean id="<span style="color: #33cccc">userService</span>" class="com.model.service.impl.UserServiceImpl"><br />   <property name="userDao"><br />    <ref bean="<span style="color: #99cc00">userDao</span>" /><br />   </property><br />  </bean><br /> <br /> <span style="color: #008000">   (?.表示层开?br /> <br />        <span style="color: #000000">(1)?faces-config.xml 中配|托BEAN</span></span>.(实现<font color="#008000">控制?/font>层设? <br /> <span style="color: #339966">           业务层bean作ؓ属性注入CONTROL层中.<br /> </p> <p><span style="color: #000000"><br /> package com.web;</span><span style="color: #000000"><br /> import com.service.ICheckService;<br /> </span><span style="color: #000000"><br /> public class SearchAll {<br />  private <span style="color: #339966">ICheckService </span>searchService;<br />  private String searchData;</span></p> <p><span style="color: #000000"> public SearchAll() {<br />  }</span></p> <p><span style="color: #000000"> public <span style="color: #339966">ICheckService </span>getSearchService() {<br />   return searchService;<br />  }</span></p> <p><span style="color: #000000"> public void setSearchService(<span style="color: #339966">ICheckService </span>searchService) {<br />   this.searchService = searchService;<br />  }</span></p> <p><span style="color: #000000"> public String getSearchData() {<br />   searchData = searchService.searchCheck();<br />   return searchData;<br />  }</span></p> <p><span style="color: #000000"> public void setSearchData(String searchData) {<br />   this.searchData = searchData;<br />  }<br /> }</span><br /> <br /> <span style="color: #000000"> <managed-bean><br />     <managed-bean-name><span style="color: #3366ff">userBean</span></managed-bean-name><br />     <managed-bean-class>com.web.SearchAll</managed-bean-class><br />     <managed-bean-scope>session</managed-bean-scope><br />     <managed-property><br />        <property-name>searchService</property-name><br />           <value> <span style="color: #33cccc">#{userService}</span></value>   <span style="color: #3366ff"><span style="color: #008080"> //直接引用spring定义的bean</span><br /> </span>    </managed-property><br />     <managed-property><br />        <property-name>searchData</property-name>    //面?userBean.name讉K属性的数据<br />           <value>123</value>                                      //属性默认?br />     </managed-property><br />  </managed-bean></span><br /> <br />         <span style="color: #000000">(2)Bean讉K客户端传来的参数?br /> </span>  <span style="color: #000000">          HttpServletRequest request=(HttpServletRequest)<span style="color: #008000"> FacesContext</span>.<span style="color: #008000">getCurrentInstance</span>().<span style="color: #008000">getExternalContext</span>().<span style="color: #008000">getRequest</span>();<br />             String s=request.<span style="color: #008000">getParameter</span>("webnam");</span><br /> <br /> </span><span style="color: #008000">?面设计</span>.(实现<span style="color: #008000">VIEW</span>层设? <br /> <br /> index.facesQ?׃?<br /> <span style="color: #008000"><span style="color: #99cc00"><%@ page language="java" pageEncoding="UTF-8"%>     //解决EXTJS 接收数据中有中文出现"?????"{ؕ?br />  ${searchAll.searchData}                                                    //解决JS接收数据.Ext.store({urlQindex.facesQ?..})</span></span><br /> <br />     面中访问Bean的二U方?br /> <span style="color: #99cc00">    <span style="color: #3366ff">Ҏ一Q直接在.faces面中?{<span style="color: #00ccff">userBean</span>.property} <strong>(推荐) </strong></span><strong> //property:get/set methord</strong></span><br />          ?不能使用${<span style="color: #00ccff">userBean</span>.method}<br /> <span style="color: #339966"><br /> </span>    <f:view>        //JSF标签必须攑֜里面<br />             名稱1: ${userBean.searchData}                              //正确<br />                  <span style="color: #339966">  <span style="color: #008080">//#{userBean.searchData}                           //报错</span><br /> </span>            名稱2: <h:inputText value="#{userBean.searchData}"/>      //正确<br />                     <span style="color: #008080">//<h:inputText value="${userBean.searchData}"/>      //报错<br />                     //<input value="#{userBean.searchData}"/>               //报错<br />              <span style="color: #000000">名稱3:</span> <span style="color: #000000"><input value="${userBean.searchData}"/>               //正确,而且仍然可以使用JSF的ManagedBean</span><br /> </span>    </f:view><br /> JSF表达?span style="color: #339966">#{...}</span>只能用在JSF标签里,JSP表达?span style="color: #339966">${...}</span>也只能用JSP面?<br /> JSP EL的语法格?${...} 不能攑֜<%...%>? <span style="color: #008000"><span style="color: #99cc00"><br /> <br />      <span style="color: #3366ff">Ҏ二: ?JSP面?直接获取业务层定义的BEAN<br /> </span></span></span><%@ page import="javax.servlet.ServletContext" %><br /> <%@ page import="org.springframework.context.ApplicationContext" %><br /> <%@ page import="org.springframework.web.context.support.WebApplicationContextUtils" %><br /> <br /> <% <br /> <span style="color: #339966">//获取ApplicationContext对象</span><br /> ServletContext   servletContext   =   request.getSession().getServletContext();           <br /> ApplicationContext   ac   =   WebApplicationContextUtils.getWebApplicationContext(servletContext); </p> <p><span style="color: #339966">//获取ApplicationContext.xml文g中定义的BEAN</span><br /> userServiceps=(userService)ac.getBean("userService");<br /> <br /> <span style="color: #339966">?导出war</span><br />       File->Export->J2EE->WAR file</p> <img src ="http://www.aygfsteel.com/algz/aggbug/190077.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-04-01 14:48 <a href="http://www.aygfsteel.com/algz/articles/190077.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>映射对象标识W?http://www.aygfsteel.com/algz/articles/187212.html紫蝶∏飛揚↗紫蝶∏飛揚↗Wed, 19 Mar 2008 04:11:00 GMThttp://www.aygfsteel.com/algz/articles/187212.htmlhttp://www.aygfsteel.com/algz/comments/187212.htmlhttp://www.aygfsteel.com/algz/articles/187212.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/187212.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/187212.html       2)identity 代理主键,由底层数据库生成标识W?前提是底层的数据库支持自动增长的类?
      3)sequence 代理主键,hibernateҎ底层数据库生成的标识W?前提是底层数据库支持序列
      4)hilo 代理主键,hibernateҎhigg/low法来生成的标识W?把特定表的字D作为high的?默认选用hibernate_unique_key表的next_hi字段
      5)native 代理主键,Ҏ底层数据库对自动生成标识W的支持能力,q选择identity,sequence,或hilo.
      6)uuid.hex 代理主键,hibernate采用128位的UUID法生成标识W?UUID法能够在网l环境下生成唯一字符串标识符.不过字符串要比数据占用的I间多的?所以不行使用.
      7)assigned 适用于自然主?由JAVA应用E序负责生成标识W?Z能让JAVA讄OID.不能吧setIdҎ讄为非公共cd?q种方式也尽量避免?
      q里个h觉得W一U方?也就是说由Hibernate来生成对象标识符的方式比较好.但是q种方式的缺Ҏ只能一个Hibernate对应一个数据库的表.当同时创ZSeesionFactory实例的时?两个或者更多的Hibernate对应同一个数据库的时候就会插入出?q个时候我们可以选择W二U方式把标识W的生成工作交给底层数据?q有一个小知识点要注意是OID必须定义为long,int,shortcd,如果定义为byte会报异常,q里推荐用long.
      ȝ一?q?中生成OID标识W的Ҏ,increment 比较常用,把标识符生成的权力交lHibernate处理.但是当同时多个Hibernate应用操作同一个数据库,甚至同一张表的时?推荐用identity 依赖底层数据库实?但是数据库必L持自动增?sequence 以来底层数据库实?但是数据库必L持系?hilo Ҏ特定的表实现.q三U方式了.当然针对不同的数据库选择不同的方?如果你不能确定你使用的数据库具体支持什么的情况?可以选择W三U?或者用native 让Hibernate来帮选择identity,sequence,或hilo.后边的自然主键不推荐使用,因ؓ自然主键是h业务含义的主?在现在的软g开发结构中,已经很少有h用了.下面ȝ一下几U常用数据库,可以使用的标识符cd.
      MySQL:identity数据库底层实?需要支持自动增?increment由Hibernate实现,hilo用特定的表实?
      MSSQL:identity数据库底层实?需要支持自动增?increment由Hibernate实现,hilo用特定的表实?
      Oracle:sequence数据库底层实?需要支持序?increment由Hibernate实现,hilo用特定的表实?
      以上不难发现,所有的数据库都支持Hibernate用increment实现OID的生?MYSQL和MSSQL数据库底层实现支持自动增?而Oracle支持序列,q有用特D表的实现方式这三个数据库都支持.q有一U实现方式适用于所有的数据?是native,由Hibernate去选择使用什么样的方式来生成IOD对象标识W?q种方式也是跨^台的.

                                                                                     --------------摘自:http://www.aygfsteel.com/action/archive/2007/05/22/119134.html

]]>
Hibernate 瞬? Transient )对象,持久? Persistence )对象,游离( Detached )对象http://www.aygfsteel.com/algz/articles/186924.html紫蝶∏飛揚↗紫蝶∏飛揚↗Tue, 18 Mar 2008 02:08:00 GMThttp://www.aygfsteel.com/algz/articles/186924.htmlhttp://www.aygfsteel.com/algz/comments/186924.htmlhttp://www.aygfsteel.com/algz/articles/186924.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/186924.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/186924.html        瞬态对? 没有q行持久化操作的新对?
                    User user=new User();
                            user.name="name";         //Transient 对象

        持久化对? 持久化操作过?Transient 对象. 
                             Persistence 对象与数据库记录相关?持久化对象的属性变?同时数据库中相关联的记录也变?
                      session.save(user);        //持久化操?同时数据库中name="name";现在user为Persistence 对象
                      user.name="name1";     //user对象属性直接媄响数据库中记录name="name1";

        游离对象: 失去与数据库中记录相兌?Persistence 对象(主键已存?,或有主键(ID)的瞬?
                    new 对象====>瞬态对?=持久化操?save() ( INSERT )==>持久对象==数据库中记录失去兌( tx.commit() )==>游离对象==对象.属性修?UPDATE)==>持久化对?br />



]]>
Hiberante 中多对一,一对多,多对多映文件的h不清楚讲?/title><link>http://www.aygfsteel.com/algz/articles/186709.html</link><dc:creator>紫蝶∏飛揚↗</dc:creator><author>紫蝶∏飛揚↗</author><pubDate>Mon, 17 Mar 2008 02:50:00 GMT</pubDate><guid>http://www.aygfsteel.com/algz/articles/186709.html</guid><wfw:comment>http://www.aygfsteel.com/algz/comments/186709.html</wfw:comment><comments>http://www.aygfsteel.com/algz/articles/186709.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/algz/comments/commentRss/186709.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/algz/services/trackbacks/186709.html</trackback:ping><description><![CDATA[        在多对一和一对多的映中.如一个部门对应多个h?既可以看成是多个人员对应一个部?所以在一对多或多对一映射关系?没有区别.<br /> 以多对一映射文g说明:<br />         多的一??span style="color: #339966;">人员持久化类</span>映射文g需加入多对一元素:  <many-to-one class="<span style="color: #99cc00;">部门c?/span>" colum="<span style="color: #00ff00;">外键</span>" />    //<span style="color: #33cccc;"><span style="color: #3366ff;">外键的定义方?代替<property />定义.</span></span><br />         一的一??span style="color: #99cc00;">部门持久化类</span>映射文g.׃Z<span style="color: #33cccc;">体现一一对应的原?/span>(个h理解),需把多的一Ҏؓ一个集?因ؓ一的一方要把多的一方看成一个整?所以集合当然就攑֜一的一?) , 需加入:<br />         <set name="集合?/>                                                              //集合中name 属性必?<br />            <key>   <colum name="<span style="color: #00ff00;">外键</span>" not-null="true/>  </key>          //在集合中<span style="color: #3366ff;">指定多的一方的外键元素</span>(集合?span style="color: #33cccc;">两个子元?/span>的一?,<span style="color: #3366ff;">不代?lt;property />定义.</span><br />            <one-to-many class="<span style="color: #339966;">人员c?/span>" />                                                        //一对多元素(集合?span style="color: #33cccc;">两个子元?/span>的一?.<br />         </set> <br />                                     (有外键的那一?即ؓ多方)   (持久化即序列?<br /> <br />         多对多的映射讲解:<br />         多对多的映射文g?׃JAVAcL法表C多对多的映?所以把他们分解成两个多对一/一对多,在中间引入一个JAVA BEAN 对象q行兌.q个中间BEAN除了主键?lt;id />定义,其他属性由于均为外?所以采用外键定义方?--<many-to-one />.<br /> <br /> <br /> 以上讲解有问?丄例子是一对多?多对一比一对多单些.<br /> <img src ="http://www.aygfsteel.com/algz/aggbug/186709.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/algz/" target="_blank">紫蝶∏飛揚↗</a> 2008-03-17 10:50 <a href="http://www.aygfsteel.com/algz/articles/186709.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Spring+Hibernate DAO 持久层开? Spring ?Hibernate 讉K数据库的三种Ҏ.推荐使用回调.http://www.aygfsteel.com/algz/articles/162578.html紫蝶∏飛揚↗紫蝶∏飛揚↗Fri, 23 Nov 2007 03:30:00 GMThttp://www.aygfsteel.com/algz/articles/162578.htmlhttp://www.aygfsteel.com/algz/comments/162578.htmlhttp://www.aygfsteel.com/algz/articles/162578.html#Feedback0http://www.aygfsteel.com/algz/comments/commentRss/162578.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/162578.html
?
(1)以下两者都需在Spring XML配置文g?注册Bean(实现c?来依赖注入SessionFactory.
(2.1)Spring 中进行事务管理的通常方式是利用AOPQ面向切片编E)的方式,为普通javacd装事务控Ӟ它是通过动态代理实现的Q由于接口是
        延迟实例化的Q?spring在这D|间内通过拦截器,加蝲事务切片。原理就是这P具体l节请参考jdk中有兛_态代理的文。本文主要讲?br />         如何在spring中进行事务控制?br /> (2.2)动态代理的一个重要特征是Q它是针Ҏ口的,所以我们的DAO要通过动态代理来让spring接管事务Q就必须在DAO前面抽象Z个接?  当然
       如果没有q样的接口,那么spring会用CGLIB来解决问题,但这不是spring推荐的方?

(一)直接使用Hibernate API (不推荐?
public class DaoImp implate Dao{
         private SessionFactory sessionFactory;
         private static String hql = "from User u where u.username=? ";

          public void setSessionFactory(SessionFactory sessionFactory){
                    this.sessionFactory=sessionFactory;
          }

           public boolean isValidUser(String username) { 
                try{
                     List userList = sessionFactory.getCurrentSession().creatQuery(hql).setParameter(0,username).list();
                     if (userList.size() > 0) {
                     return true; 
                 } catch (HibernateException ex){
                     throw converHibernaterAccessException(ex);
                  }   
             } 
}
 
优点:与Spring框架完全分离
~点:(1)无法使用Spring框架装所提供的额外功??直接使用Hibernate API 需用try...catch()处理HibernateException异常.
         (2)需在实现类中加入setSessionFactory(SessionFactory sessionFactory)属?接收依赖注入的SessionFactory.

(?l承 Spring ?HibernateDaoSupport 使用 HibernateTemplate (不推荐用getSession())
public class DaoImp extend HibernateDaoSupport implates Dao{
         //private SessionFactory sessionFactory;
         private static String hql = "from User u where u.username=? ";

          //public void setSessionFactory(SessionFactory sessionFactory){
          //          this.sessionFactory=sessionFactory;
          //}


           public boolean isValidUser(String username) { 
              //  try{
              //     List userList = sessionFactory.getCurrentSession().creatQuery(hql).setParameter(0,username).list(); 

                     List userList = getHibernateTemplate().find(hql,username); 
                     if (userList.size() > 0) {
                     return true; 
               // } catch (HibernateException ex){
              //     throw converHibernaterAccessException(ex);
             //  }  
 
             }
 
           public boolean isValidUser(String username,String password) throw DataAccessException { 
                     Session session = getSession();                 //不推荐?用完后需手动关闭
                     String[] userlist=new String[2];
                     userlist[0]=username;
                     userlist[1]=password;
                 try{
                     List userList = session.find(hql,userlist);       //Hibernate语句; 
                     session.close();
                     if (userList.size() > 0) {
                     return true; 
                  } catch (HibernateException ex){
                     throw converHibernaterAccessException(ex);
                  }   
             } 
}

特点:对HibernateTemplate没有提供的功?可以直接调用HibernateDaoSuppor对象?span style="color: #339966">getSession()Ҏ(极其不推荐?得到Session对象实例用try{ Hibernate API }catch (HibernateException ex )操作.

(??HibernateTemplate 没有提供的功? q可以用HibernateCallback 回调的方法管理数据库. (极其推荐)

 /**
  * 使用 hql 语句q行操作
  * @param hql       HSQL 查询语句
  * @param offset   开始取数据的下?br />   * @param length   d数据记录?br />   * @return List       l果?br />   */
 public List getListForPage ( final String hql , final int offset , final int length ) {

     List list = getHibernateTemplate().executeFind ( new HibernateCallback ( ) {
           public Object doInHibernate ( Session session ) throws HibernateException, SQLException {
                     Query query = session.createQuery ( hql ) ;
                     query.setFirstResult ( offset ) ;
                     query.setMaxResults ( length ) ;
                     List list = query.list ( ) ;
                     return list ;
           }
    }) ;
    return list ;
 }


//---------------------------------------------------------------------------

final String queryString = "from Fourm";                 //必须定义finalcd
   List l= getHibernateTemplate().executeFind(new HibernateCallback(){
    public Object doInHibernate ( Session session ) throws HibernateException, SQLException {
                    Query query = session.createQuery ( queryString ) ;
                    query.setFirstResult ( 0 ) ;
                    query.setMaxResults ( 10 ) ;
                    List list = query.list ( ) ;
                    return list ;
          }

//------------------------------------------------------------



Z么不使用getSession(),而用回调的详细说明:

紫蝶∏飛揚?br /> 听个SPRING+HIBERNATE开发的问题.
SPRING惌用HIBERNATE的方法有两种,一U是使用getSession();一U是:HibernateCallback回调.
他们有什么不?
L♂宝?br /> 前者没有事务管控,Spring把Hibernate最原始的Sessionl你Q但是它不被声明式事务管理的服务Q?br /> 紫蝶∏飛揚?br /> ...声明式事务不会对他进行事务管?
L♂宝?br /> 后者也是把Sessionq给你,但是通过闭包回调的Ş式给你用,Spring会在l你之前做一下手脚,例如Q添加声明式事务理中声明的事务属性!
L♂宝?br /> 因ؓ你写的方法通过匿名函数闭包Q然后由Spring去负责执行闭包体内的ҎQ?br /> L♂宝?br /> Java里的借口回调基本都是借用匿名内部cd现的闭包Q?br /> L♂宝?br /> 你看一下Spring的HibernateDaoSupport的源代码q道运行过E了Q?br /> L♂宝?br /> 直接使用getSession()q不享有Spring提供的模板支持,也就是说你得手动关闭q接Q否则会一直挂在那儿,直到时q接池才会回收这个连接!
L♂宝?br /> q样很容器连接池q接数量溢出Q你懂了啊?
紫蝶∏飛揚?br /> ?
紫蝶∏飛揚?br /> new HibernateCallback(){
    public Object doInHibernate ( Session session ) throws HibernateException, SQLException {
必须q样的方式吗?
L♂宝?br /> 补习一下编E中的闭包、回调的知识Q再看看Spring的那D代码就可以d理解了!
L♂宝?br /> 恩!
紫蝶∏飛揚?br /> ?明白?
L♂宝?br /> 如果你觉得getHibernateTemplate()提供的方法不以满你的要求Q你得q么使用Q?br /> 紫蝶∏飛揚?br /> 明白.不够用的情况下用回调.
L♂宝?br /> 闭包JavaScript支持的比较好Q因为它是以函数为单元的QJavaq于面向对象Q所以只能用匿名内部cL有限的支持闭包!标准的回调都是方法回调,也就是闭包到Ҏ中,而不是类中!所以Java中的闭包和其他的语言有一些区别的Q例如访问外部变量必Lfinal的!
L♂宝?br /> 据说JDK1.7会加入对函数闭包调用的支持!
紫蝶∏飛揚?br /> ...历害.
紫蝶∏飛揚?br /> 偶只知道q样?不知道ؓ什么这L.
L♂宝?br /> 那可不行啊!呵呵Q我最一开始也不大明白Q后来仔l研I了闭包、回调的知识懂了!
其实q种用法在Swing~程里天天都用啊Q把一个匿名的监听器实现类注册C件源Q只不过那个时候没有注意到q是闭包和回调Ş了!
紫蝶∏飛揚?br /> 看来有时间得好好看看?..



]]>
hibernate核心API及其查询分析http://www.aygfsteel.com/algz/articles/162112.html紫蝶∏飛揚↗紫蝶∏飛揚↗Wed, 21 Nov 2007 08:02:00 GMThttp://www.aygfsteel.com/algz/articles/162112.htmlhttp://www.aygfsteel.com/algz/comments/162112.htmlhttp://www.aygfsteel.com/algz/articles/162112.html#Feedback3http://www.aygfsteel.com/algz/comments/commentRss/162112.htmlhttp://www.aygfsteel.com/algz/services/trackbacks/162112.html(一)  org.hibernate.cfg.Configurationc?/span>
        d配置文gq创建唯一的SessionFactory对象.(一?E序初始化hibernate时创?)
        Configuration config=new Configuration().config();     //自动查找CLASS指定路径下的hibernate.cfg.xml文g.

(?  org.hibernate.SessionFactory接口
         主要作用是创建Session对象.(N个数据库只有N个SessionFactory对象q过N个Configuration实例Ҏ不同的配|文件创?因此对象是不可改变的,所以ؓ接口.)
        SessionFactory sessionFactory=config.buildSessionFactory();

(?  org.hibernate.Session接口
        持久化操作的核心API,javaE序与hibernateq行交互时所使用的主要接?他有生命周期,以事务开始和l束?
        主要功能是读?创徏和删除映的实体对象的实?q一pd的操作会转化为对数据库表中数据的增加,修改,查询和删除操?
        Session session =sessionFactory.openSession();

        (实体对象:与数据库中表q行映射的类.)
        操作实体Ҏ:所有方法都是在事务提交l束时才真正执行相应操作.
        void save(Object object) :用于瞬态对象实例的转持久化操作,相当于INSERT.

        void update(Object object):必须讄标识W?object.setId(....)),Ҏ标识W更新数?相当于UPDATE.

        void delete(Object object) :相当于DELETE.

   (1)创徏查询对象:调用Ҏ获得持久对象.(l果?数据库中的数?)
        Query createQuery(String queryString)    //用的最?可用HQL语句直接更新,删除数据.

        Criteria createCriteria(Class persistentClass)  

         SQLQuery createSQLQuery(String queryString) 

    (2)创徏事务
         Transaction beginTransaction()

(?  org.hibernate.Transaction接口
        
用于事务理.
         void commit():提交事务. 

(?  org.hibernate.Query接口
         setXxx:讄HQL语句中的输入参数.
         
        Query  setMaxResults (int maxResults)  :l果集的最大记?span style="color: #33cccc">L.
         ****************以下两属?常用于分处?****************
        Query  setFirstResult(int firstResult)       :从结果集?span style="color: #33cccc">W几?/span>记录开?/span>.
        Query  setFetchSize(int fetchSize)          :从结果集?span style="color: #33cccc">?fetch)多少?/span>记当出来.
-------------------------------------------------------------------------------------------------------
         List list():q回查询l果集ؓListcd.(d全部数据映射为内存的实体对象(卛_存中的数据库).资源消耗大, 但可?span style="color: #33cccc">按烦?/span>位置随机查找数据.)

         Iterator iterate():q回查询l果集ؓIteratorcd.(只能按照从前向后的顺序查找数?但节省资?只对查找的数据映?/span>为实体对?)

         Object uniqueResult():只返回查询结果集?满W一个条件的数据.

         ScrollableResults scroll():q回查询l果集ؓIteratorcd. 

]]>
վ֩ģ壺 | | | | | | ɳ| | | ƽ| | | | | | | | ɽ| ʡ| | | | ں| ˮ| ʩ| | | ׶| | | Ů| | ν| | ˳| | Ļ| Ͻ| | | |