1. 程式人生 > 其它 >Mybatis 持久層使用的註解API

Mybatis 持久層使用的註解API

技術標籤:mybatisJeesitemybatis註解mybatis持久層SqlMap

**專案背景:使用的springboot+mybatis技術框架,持久層通過【註解】配置資料表關係,實現業務條件查詢。

一. 物理表屬性 @Table

/**
 * 指定實體的物理表屬性 
 */
public @interface Table {

	/**
	 * 物理表名
	 */
	String name() default "";
	
	/**
	 * 當前表別名
	 */
	String alias() default "a";
	
	/**
	 * 表列定義
	 */
	Column[] columns();
	
	/**
	 * 查詢,關聯表
	 */
	JoinTable[] joinTable() default {};
	
	/**
	 * 指定排序
	 */
	String orderBy() default "";
	
	/**
	 * 表說明
	 */
	String comment() default "";
	
	/**
	 * 擴充套件ColumnSQL,在這裡指定sqlMap的key。<br>
	 * 例如:\@Table(extColumnKeys="dataScopeColumn");<br>
	 * Service裡設定:sqlMap.put("extColumn", "column_name AS \"columnName\"");<br>
	 * 在執行查詢的時候,該語句放到自動會加到Where最後並執行。<br>
	 * <b>注意:</b>如果設定,必須後臺程式碼中設定,否則可能造成sql注入漏洞<br>
	 */
	String extColumnKeys() default "";
	
	/**
	 * 擴充套件FromSQL,在這裡指定sqlMap的key。<br>
	 * 例如:\@Table(extFromKeys="dataScopeFrom");<br>
	 * Service裡設定:sqlMap.put("dataScopeFrom", "JOIN table_name t on t.pk=a.pk");<br>
	 * 在執行查詢的時候,該語句放到自動會加到Where最後並執行。<br>
	 * <b>注意:</b>如果設定,必須後臺程式碼中設定,否則可能造成sql注入漏洞<br>
	 */
	String extFromKeys() default "";
	
	/**
	 * 擴充套件WhereSQL,在這裡指定sqlMap的key。<br>
	 * 例如:\@Table(extWhereKeys="dataScopeWhere");<br>
	 * Service裡設定:sqlMap.put("dataScopeWhere", "AND column_name='value'");<br>
	 * 在執行查詢的時候,該語句放到自動會加到Where最後並執行。<br>
	 * <b>注意:</b>如果設定,必須後臺程式碼中設定,否則可能造成sql注入漏洞<br>
	 */
	String extWhereKeys() default "";
	
}

二.物理表列屬性 @Column

/**
 * 定義物理表列屬性(不繼承父類註解)
 * @author ThinkGem
 */
public @interface Column {
 
	/**
	 * 欄位名(例如:config_key)
	 */
	String name() default "";
 
	/**
	 * 屬性名,若不指定,則根據name()欄位名進行駝峰命名法轉換(例如:config_key 轉換為   configKey)
	 */
	String attrName() default "";
 
	/**
	 * 屬性名,定義的型別
	 */
	Class<?> type() default Class.class;
	
	/**
	 * 標籤名
	 */
	String label() default "";
	
	/**
	 * 欄位備註
	 */
	String comment() default "";
 
	/**
	 * 是否主鍵(update、delete時的條件)
	 */
	boolean isPK() default false;
	
	/**
	 * 是否插入欄位
	 */
	boolean isInsert() default true;
	
	/**
	 * 是否更新欄位
	 */
	boolean isUpdate() default true;
	
	/**
	 * 是否是查詢欄位
	 */
	boolean isQuery() default true;
	
	/**
	 * 查詢型別
	 */
	QueryType queryType() default QueryType.EQ;
	
	/**
	 * 包含嵌入一個實體
	 */
	Class<?> includeEntity() default Class.class;
}

三.關聯表屬性 @JoinTable

/**
 * 指定實體的物理表的關聯表屬性 
 */
public @interface JoinTable {
	
	/**
	 * 連線型別
	 */
	Type type() default Type.JOIN;
	public enum Type{
		JOIN("JOIN"), // INNER JOIN
		LEFT_JOIN("LEFT JOIN"),
		RIGHT_JOIN("RIGHT JOIN");
		private final String value;
		Type(String value) { this.value = value; }
		public String value() { return this.value; }
	}
	
	/**
	 * 連線的表,指定實體Class
	 */
	Class<?> entity();
	
	/**
	 * 當前表別名
	 */
	String alias();
	
	/**
	 * 連線表條件
	 */
	String on();
	
	/**
	 * 對應主表中對應的屬性名,若不指定,則根據entity()進行首字母小寫得到屬性名(例如:Config 轉換為   config)
	 */
	String attrName() default "";
	
	/**
	 * 連線表,返回的列,若不指定,則讀取entity()的所有列。
	 */
	Column[] columns() default {};
	
}

四.查詢型別 @QueryType

public enum QueryType{

	EQ("="),
	NE("!="),
	GT(">"),
	GTE(">="),
	LT("<"),
	LTE("<="),
	IN("IN"),
	NOT_IN("NOT IN"),
	LIKE("LIKE", "%", "%"),
	LEFT_LIKE("LIKE", "%", ""),
	RIGHT_LIKE("LIKE", "", "%"),
	IS_NULL("IS NULL"),
	IS_NOT_NULL("IS NOT NULL"),
	
	// 強制條件,不管值是不是空字串都載入這個查詢條件
	EQ_FORCE("=", true),
	NE_FORCE("!=", true),
;
}