通過自定義註解方式 對每個字段或者字段組合進行條件檢索
項目需求
有一張表 包含 id username nickName age等字段,爲了方便對每個字段或者字段的組合進行條件檢索,並打印sql語句
項目實現
代碼中註釋寫的比較全,就不在囉嗦了,直接看代碼
實體類
/**
* Create by marven
* Create date for 14:45 2020/3/12
* Description: 人員實體
**/
@Table("user")
public class PersoBean {
/**
* 用戶id
*/
@Column("id")
private Integer id;
/**
* 用戶名稱
*/
@Column("username")
private String username;
/**
* 用戶暱稱
*/
@Column("nickname")
private String nickname;
/**
* 用戶年齡
*/
@Column("age")
private Integer age;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
Table註解類
package com.example.demo.demo.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Create by marven
* Create date for 14:49 2020/3/12
* Description:數據庫表
**/
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String value();
}
Column註解類
package com.example.demo.demo.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* Create by marven
* Create date for 14:51 2020/3/12
* Description:數據庫列
**/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD})
public @interface Column {
String value();
}
測試類 程序入口類
public static void main(String args[]){
PersoBean bean1 = new PersoBean();
bean1.setId(10);
PersoBean bean2 = new PersoBean();
bean2.setNickname("marven");
PersoBean bean3 = new PersoBean();
bean3.setAge(18);
String sql1 = sql(bean1);
String sql2 = sql(bean2);
String sql3 = sql(bean3);
System.out.println(sql1);
System.out.println(sql2);
System.out.println(sql3);
}
private static String sql(PersoBean bean){
StringBuilder stringBuilder = new StringBuilder();
try {
// 獲取類加載器
Class c = bean.getClass();
stringBuilder.append("select * from ");
// 拼接表名
// 獲取到表的註解
boolean isTableAnnotationExist = c.isAnnotationPresent(Table.class);
if(!isTableAnnotationExist){
return null;
}
// 獲取到Table的註解
Table tableAnnotation = (Table) c.getAnnotation(Table.class);
// 獲取到註解的值
String tableName = tableAnnotation.value();
// 拼接表名
stringBuilder.append(tableName);
// select * from user where 1= 1
stringBuilder.append(" where 1 = 1");
// 獲取到所有的字段
Field[] arrayFields = c.getDeclaredFields();
// 對所有的字段進行遍歷
for(Field field : arrayFields){
boolean isFieldAnnotationExist = field.isAnnotationPresent(Column.class);
if(!isFieldAnnotationExist){
continue;
}
Column column = field.getAnnotation(Column.class);
// 獲取到表字段名稱
String columnName = column.value();
// 獲取到字段方法名 eg getId
String methodName = "get"+columnName.substring(0,1).toUpperCase()+columnName.substring(1);
// 獲取到這個類中的方法
Method method = c.getMethod(methodName);
// 調用這個方法 invoke 獲取到屬性值
Object obj = method.invoke(bean);
if(obj == null || (obj instanceof Integer && (Integer)obj == 0)){
continue;
}
stringBuilder.append(" and ").append(columnName);
// 如果值是字符串 在sql中使用‘’包裝
if(obj instanceof String){
stringBuilder .append("=").append("'").append(obj).append("'");
}else if(obj instanceof Integer){
stringBuilder.append("=").append(obj);
}
//
}
} catch (Exception e) {
e.printStackTrace();
}
return stringBuilder.toString();
}
}