通过自定义注解方式 对每个字段或者字段组合进行条件检索
项目需求
有一张表 包含 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();
}
}