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 }
這兩個實體描述了用戶和用戶使用系統而產生的記錄,很明顯的關聯關系。
雖然小菜沒有配置一對多映射,但是我們也應該清楚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 }
只需在實體類上加@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)})
@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的順序加聯合索引。
本來挺簡單的一件事,小菜說了這么多,文章到此結束,祝讀者學習順利!