** Project background: using the springboot+mybatis technical framework, the persistence layer configures the data table relationship through [annotation] to realize business condition query.
1. Physical table attributes @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 "";
}
2. Physical table column attributes @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;
}
3. Related table attributes @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 {};
}
Four. Query Type @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),
;
}