Hibernate查詢語(yǔ)句統(tǒng)一配置管理
你以前所參與的項(xiàng)目里面,SQL、HQL,是否滿天飛呢?在邏輯層,顯示層那里都可以看到隨手寫的Hibernate查詢語(yǔ)句?這樣的做法極度的破壞了分層的架構(gòu),無(wú)論如何的XP也應(yīng)該遵循一定的管理與規(guī)范,那么統(tǒng)一管理查詢語(yǔ)句的重要性就凸現(xiàn)了。
統(tǒng)一管理查詢語(yǔ)句有何優(yōu)點(diǎn)?
1、保持系統(tǒng)的分層架構(gòu),管理語(yǔ)句是持久層的責(zé)任,由它自己管理是最適合不過(guò)。松散的耦合總是我們向往的目標(biāo)。
2、統(tǒng)一管理方便修改,可以減小人手修改帶來(lái)的低級(jí)錯(cuò)誤。
OK,接下來(lái)要考慮如何管理這些語(yǔ)句來(lái)了。
1、配置文件管理
在Hibernate查詢語(yǔ)句的mapping文件內(nèi)使用<query>
Xml代碼
- <query name='findUserById'>
- from User eo where eo.id = ?
- </query>
- <query name='findUserById'>
- from User eo where eo.id = ?
- </query> <query>里面就是要使用的hql語(yǔ)句 屬性name就是語(yǔ)句保存在容器里的別名。
- 在hibernate的mapping文件內(nèi)使用<sql-query>
- Xml代碼
- <sql-query name="findUserByName">
- <return alias="user" class="hibernate.entity.User"/>
- SELECT user.id AS {user.id},
- user.name AS {user.name}
- FROM t_user user WHERE user.name = ?
- </sql-query>
- <sql-query name="findUserByName">
- <return alias="user" class="hibernate.entity.User"/>
- SELECT user.id AS {user.id},
- user.name AS {user.name}
- FROM t_user user WHERE user.name = ?
- </sql-query>
<sql-query>里面的語(yǔ)句必須是sql語(yǔ)句,屬性name就是語(yǔ)句保存在容器里的別名,<reruen>里面的東東標(biāo)明了返回對(duì)象的類型與別名,別名主要用于對(duì)應(yīng)sql里面{}的內(nèi)容。
寫好mapping文件后當(dāng)然要告訴hibernate將這些語(yǔ)句加入到容器里面咯,配置方法有很多種,這里只列了使用spring結(jié)合hibernate的配置方式,在SessionFactoryBean的配置里面加入
Xml代碼
- <property name="mappingLocations">
- <list>
- <value>
- classpath:hbm/name-query.hbm.xml
- </value>
- </list>
- </property>
- <property name="mappingLocations">
- <list>
- <value>
- classpath:hbm/name-query.hbm.xml
- </value>
- </list>
- </property>
<sql-query>的使用比較復(fù)雜,所以不是遇到復(fù)雜的跨表查詢時(shí),不推薦使用。
2、標(biāo)簽管理
Hibernate查詢語(yǔ)句中,一般的習(xí)慣都是使用@NamedQueries將與自己相關(guān)的語(yǔ)句統(tǒng)一在實(shí)體里面,如查詢User的語(yǔ)句都是放到User對(duì)象里面
Java代碼
- @Entity
- @Table(name = "t_user")
- @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) @NamedQueries( {
- @NamedQuery(name = "User.findById",
- query = "FROM User eo where eo.id=? ") })
- public class User implements java.io.Serializable {
- private int id;
- private String name;
- @Entity
- @Table(name = "t_user")
- @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) @NamedQueries( {
- @NamedQuery(name = "User.findById",
- query = "FROM User eo where eo.id=? ") })
- public class User implements java.io.Serializable {
- private int id;
- private String name;
使用標(biāo)簽管理可以比較好的分類Hibernate查詢語(yǔ)句,也不用搞麻煩的配置文件,雖然說(shuō)修改配置文件的Hibernate查詢語(yǔ)句可以不用重新編譯就能生效,但是查詢語(yǔ)句修改也不會(huì)十分頻繁,所以標(biāo)簽管理是一個(gè)不錯(cuò)的選擇。
【編輯推薦】