Nutz Dao實體中索引注解的使用(@TableIndexes@Index)


         Nutz是一組輕便小型的框架的集合, 各個部分可以被獨立使用,把SSH的精華封裝在一個1M左右的jar包中,Nutz不對其他任何第三方庫產生依賴,如果不考慮數據庫鏈接和日志的話,創建完美的Web應用只需要一個Nutz的jar包。

         作為產品而言,就算是再優秀,如果沒有優良的使用文檔,也是白搭。這也是Nutz的優勢所在,很少見到文檔像Nutz這樣詳細的開源框架。

         總之,小菜認為Nutz乃國產良心精品。

         但是,Nutz 再怎么好,也是個人維護的開源框架,總會遇到種種問題。

         今天小菜在實體索引注解方面遇到了點問題,啥問題呢:根本不知道索引注解怎么用。。。

         但令小菜意外的是,整個度娘和谷歌,竟然搜不到一丁點答案,官方也沒有說明。。。

         最后還是在GitHub里找到了點線索,現在把使用方法共享一下!

         假設有如下實體:

 

 1 /**
 2  * 用戶
 3  * @author xx
 4  *
 5  */
 6 @Table("t_user")
 7 public class User {
 8     /**
 9      * 主鍵
10      */
11     @Id
12     private long id;
13     
14     //其他屬性......
15     
16 }
17 
18 /**
19  * 用戶操作記錄
20  * @author xx
21  *
22  */
23 @Table("t_user_record")
24 public class UserRecord {
25     
26     /**
27      * 主鍵
28      */
29     @Id
30     private long id;
31     /**
32      * 用戶id(外鍵)
33      */
34     @Column("user_id")
35     private long userId;
36     /**
37      * 創建時間
38      */
39     @Column("create_date")
40     private Date createDate;
41     
42     //其他屬性......
43     
44 }
View Code

 

         這兩個實體描述了用戶和用戶使用系統而產生的記錄,很明顯的關聯關系。

         雖然小菜沒有配置一對多映射,但是我們也應該清楚UserRecord實體中的userId屬性是一個外鍵,會在關聯兩個表的時候使用,而userId又可能有很多很多,不具備有限性,所以這個字段必須加索引。

         既然提到索引,就多介紹一點,索引不是亂加的,加多了嚴重影響寫入的速度,這個大家應該都知道,有些字段,可能只有有限的幾個值,比如性別,加上索引意義不太。

         廢話太多了。。。進入正題。。。

         我們現在要在UserRecord實體的userId屬性上加索引,這么寫:

 

 1 /**
 2  * 用戶操作記錄
 3  * @author xx
 4  *
 5  */
 6 @Table("t_user_record")
 7 @TableIndexes({@Index(name="idx_user_record_user_id",fields={"userId"},unique=false)})
 8 public class UserRecord {
 9     
10     /**
11      * 主鍵
12      */
13     @Id
14     private long id;
15     /**
16      * 用戶id(外鍵)
17      */
18     @Column("user_id")
19     private long userId;
20     /**
21      * 創建時間
22      */
23     @Column("create_date")
24     private Date createDate;
25     
26     //其他屬性......
27     
28 }
View Code

 

         只需在實體類上加@TableIndexes注解即可,然后里邊每一個@Index注解可以理解成一個索引的聲明。

         比如說想定義多個索引:

 

1 @TableIndexes({@Index(name="idx_user_record_user_id",fields={"userId"},unique=false),
2                 @Index(name="index_name",fields={"fieldName1","fieldName2"},unique=false)})
View Code

 

         @Index注解中具體參數說明如下:

 

         name 索引名稱。由於索引是全局的,為了避免沖突,名稱中建議加上表名。

         fields 索引屬性集合,也就是說在哪些屬性上創建索引。因為索引不僅僅可以加在一個字段上,加在多個字段上叫聯合索引。注意,小菜一直在強調屬性,fields中的值是實體屬性名稱,而不是數據庫表中的字段名稱。

         unique 是否是唯一索引。索引大致有三種類型:普通索引、唯一索引、全文索引。普通索引沒得說,就是簡單的加一個索引,unique=false就是普通索引;唯一索引就是在普通索引的基礎上加了一個唯一性約束,保證該字段不重復,unique=true就是唯一索引;全文索引比較復雜,一個表只能建一個,針對超長字符串搜索優化,Nutz不支持,一般也用不到,小菜就不多說啦!

 

         文末,小菜再多說點聯合索引的知識。

         我們經常會用到這樣的SQL語句:

 

1 SELECT * FROM T_TABLE WHERE FIELD1=? AND FIELD2=? AND FIELD3=?

 

         如果這樣的查詢非常頻繁,數據量又比較大,我們就得考慮在FIELD1、FIELD2、FIELD3上加索引,但是一下子加三個單獨的索引很浪費,所以可以在FIELD1、FIELD2、FIELD3上加一個聯合索引。

         另外,在加聯合索引時,如果某個字段被單獨查詢的概率比較大,那么要把這個字段靠前。就拿剛剛的例子說,如果FIELD2會經常被單獨查詢,那么就按照FIELD2、FIELD1、FIELD3的順序加聯合索引。

         本來挺簡單的一件事,小菜說了這么多,文章到此結束,祝讀者學習順利!

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM