日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
介紹Hibernate使用UserType

Hibernate有很多值得學(xué)習(xí)的地方,這里我們主要介紹Hibernate使用UserType,包括介紹UserType就是用戶自定義類型等方面。

創(chuàng)新互聯(lián)專注于永濟(jì)網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供永濟(jì)營(yíng)銷型網(wǎng)站建設(shè),永濟(jì)網(wǎng)站制作、永濟(jì)網(wǎng)頁(yè)設(shè)計(jì)、永濟(jì)網(wǎng)站官網(wǎng)定制、微信小程序服務(wù),打造永濟(jì)網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供永濟(jì)網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

1、建立數(shù)據(jù)庫(kù)的時(shí)候***建立一個(gè)跟業(yè)務(wù)邏輯完全沒有關(guān)系的id,這樣的好處就是以后當(dāng)數(shù)據(jù)量大的時(shí)候可以容易的建立索引,而且當(dāng)業(yè)務(wù)邏輯變化的時(shí)候底層的數(shù)據(jù)結(jié)構(gòu)不用變化很大。

2、代碼的干凈是非常非常的重要的,從現(xiàn)在開始盡量讓自己的代碼寫的漂亮把!因?yàn)楦蓛舻拇a不僅容易維護(hù),而且容易發(fā)現(xiàn)bug,在Hibernate使用UserType是很好用的。舉個(gè)經(jīng)典的例子:

實(shí)現(xiàn)Hibernate使用UserType接口的email 類

比如 你需要在 TUSER 表中記錄一個(gè)人的 email ,單獨(dú)為其建立一張數(shù)據(jù)庫(kù)表是很浪費(fèi)資源的,一般的方法是將TUSER 一欄 varchar 的來記錄email ,多個(gè) email 之間用 " ; "號(hào)分開,我曾經(jīng)做的項(xiàng)目中采取的方法是:取出一個(gè)記錄著多條 email 的 string然后再來用 ; 號(hào)拆開,但是這樣子就有個(gè)不好,在一堆整齊的 get 方法用出來一個(gè)有 bad smell 的代碼。

有兩個(gè)方法,一個(gè)是修改映射TUSER的 java 類在其中增加一個(gè) getEmail 方法,返回一個(gè) list ,該方法對(duì)原先的 getEmail 方法進(jìn)行二次處理。第二個(gè)方法就是采用UserType 。

UserType就是用戶自定義類型,這里的類型指的是除了Hibernate定義的那些類型之外的用戶自己定義的。

一個(gè)實(shí)現(xiàn)Hibernate使用UserType接口的 email 類如下(里面的每個(gè)方法都是必須實(shí)現(xiàn)的接口方法,許多都可以復(fù)制粘貼的,不復(fù)雜):

 
 
 
  1. public class Email implements UserType  
  2. ...{  
  3.  
  4. // 表示本類型實(shí)例是否可變,一般是不可變  
  5. public boolean isMutable()  
  6. ...{  
  7. return false;  
  8. }  
  9.  
  10. //該類型對(duì)應(yīng)的 sql 類型  
  11. public int[] sqlTypes()  
  12. ...{  
  13. return new int[]......{Types.VARCHAR};  
  14. }  
  15.  
  16. // 改類型對(duì)應(yīng)的 java 類型  
  17. public Class returnedClass()  
  18. ...{  
  19. return List.class;  
  20. }  
  21.  
  22. // 完全復(fù)制的方法,由于是用戶自己定義的類型
  23. //所以hibernate并不知道要如何來復(fù)制這個(gè)類,需要用戶自己定義  
  24. public Object deepCopy(Object value)throws HibernateException  
  25. ...{  
  26. List source = (List)value;  
  27. List target = new ArrayList();  
  28. target.addAll(source);  
  29. return target;  
  30. }  
  31.  
  32. //equals方法,這個(gè)就不用多說了吧,肯定是要用戶自定義的  
  33. public boolean equals(Object x,Object y) throws HibernateException  
  34. ...{  
  35. //這部分不寫出來了,自己實(shí)現(xiàn)吧,這個(gè)不是我要講的重點(diǎn)  
  36. }  
  37.  
  38. /** *//**//*  
  39. 這才是重頭戲!nullSafeGet 和nullSafeSet 是核心所在,對(duì)數(shù)據(jù)的后期處理都在這兩個(gè)方法里面  
  40. nullSafeGet 是讀取的方法  
  41. owner 目前沒用到過。  
  42. names 是對(duì)應(yīng)的數(shù)據(jù)庫(kù)列名,UserType是可以對(duì)應(yīng)多個(gè)列的  
  43. */  
  44. public Object nullSafeGet(ResultSet rs,String[] names,Object owner) 
    throws HibernateException,SQLException  
  45. ...{  
  46. String value = (String)Hibernate.STRING.nullSafeGet(rs,names[0]);  
  47. if(value != null)  
  48. ...{  
  49. //把 string 拆開成 list 的代碼放在這里  
  50. }  
  51. return resultList;//得到了拆開的 郵件列表  
  52. }  
  53.  
  54. /**//*  
  55. 保存的方法  
  56. index 是那個(gè) PreparedStatement 的參數(shù)序號(hào),一般來說不用管直接往下傳  
  57. value 就是要保存的數(shù)據(jù),在這邊是一個(gè)保存著 email 列表的 List  
  58. */  
  59. public void nullSafeSet(PreparedStatement st,Object value,int index) 
    throws HibernateException,SQLException  
  60. ...{  
  61. if(value != null)  
  62. ...{  
  63. String email = assemble(value);//將 List 拼合成 String 的 Email 的方法  
  64. Hibernate.STRING.nullSafeSet(st,email,index);  
  65. }  
  66. else  
  67. ...{  
  68. Hibernate.STRING.nullSafeSet(st,value,index);  
  69. }  
  70. }  

在TUser.hbm.xml 中如此設(shè)置:

 
 
 
  1.  
  2.  name="entity.TUser" table="T_USER"> 
  3.  
  4. ..............  
  5.  name = "emali"column = "email"type = "mytype.Email"/> 
  6.  

在TUser.java中如此設(shè)置

 
 
 
  1. public class TUser implement Serializable  
  2. ...{  
  3. private Integer id;  
  4. privarte Stirng name;  
  5. //看,這邊的 email 可以大膽的使用 List 了  
  6. private List email;  
  7.  
  8. //下面是一些 getter 和 setter 了  

這樣設(shè)置后你使用 TUser的時(shí)候要取出  email 直接 getEmail 出來的就是一個(gè)List 了,而且前臺(tái)根本不知道后臺(tái)干了什么,這樣代碼就簡(jiǎn)潔多了。


本文名稱:介紹Hibernate使用UserType
URL地址:http://www.dlmjj.cn/article/cdhocoe.html