涉及到的类
- Filter.java 该类为一个JavaBean,有属性id,name,age,sex······
- Column.java 该类为一个注解,对应数据库的表的列名
- Table.java 该类为一个注解,对应数据库的表的名字
- Test.java 测试类,有一个主函数入口,还有一个query函数,拼接sql语句,模仿从数据库获取信息
Filter类在声明时加上注解 @Table(“对应数据库名”) ,并且每个自己声明的私有变量在声明时加上注解 @Column(“对应数据列名”),还有一些 getter/setter 方法
query(Object obj) 方法(主要思路是通过注解获取成员变量的名字,然后通过方法反射获取成员变量的属性值)
先讲一些方法的作用
Class c = obj.getClass(); // 获取obj对象的类类型
c.getDeclaredFields() // 获取obj对象的类中自己声明成员变量
c.isAnnotationPresent(Table.class) // 判断c类的 Table 注解是否存在
(Table)c.getAnnotation(Table.class) // 获取 Table 注解
String tableName = table.value(); // 获取注解的值
先获取obj对象的类类型,然后判断注解是否存在,存在了就获取注解的值(表名,或者列名)。然后加上 ‘get’, 把注解值的第一个字母变成大写,就变成Fileter相应的getter方法,通过方法反射来获取成员变量的值。剩下的就是拼接sql语句
Filter.java
package com.immoc.test;
@Table("user")
public class Filter {
@Column("id")
private int id;
@Column("userName")
private String userName;
@Column("age")
private int age;
@Column("city")
private String city;
@Column("email")
private String email;
@Column("mobile")
private String mobile;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getMobile() {
return mobile;
}
public void setMobile(String mobile) {
this.mobile = mobile;
}
}
Table.java
package com.immoc.test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String value();
}
Column.java
package com.immoc.test;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String value();
}
Test.java
package com.immoc.test;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Test {
public static void main(String[] args) {
Filter f1 = new Filter();
f1.setId(10);
Filter f2 = new Filter();
f2.setUserName("张三");
f2.setCity("成都");
Filter f3 = new Filter();
f3.setEmail("[email protected],[email protected],[email protected]");
System.out.println(query(f1));
System.out.println(query(f2));
System.out.println(query(f3));
}
/**
* 拼装sql语句
* @param obj 过滤条件的对象
* @return
*/
public static String query(Object obj) {
StringBuilder sBuilder = new StringBuilder();
// 获取obj对象的类的类类型
Class c = obj.getClass();
// 遍历所有的字段
Field []fields = c.getDeclaredFields();
// 获取表名
if(!c.isAnnotationPresent(Table.class)) {
return null;
}
Table table = (Table)c.getAnnotation(Table.class);
String tableName = table.value(); // 获取注解的值
sBuilder.append(" select * from ").append(tableName).append(" where 1=1 ");
for (Field field : fields) {
// 拼装字段对应的sql语句
if(!field.isAnnotationPresent(Column.class)) {
continue;
}
// 获取字段名
Column column = (Column)field.getAnnotation(Column.class);
String fieldName = column.value();
// 获取字段值
String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
Object fieldValue = null;
try {
Method method = c.getMethod(getMethodName);
fieldValue = method.invoke(obj);
} catch (Exception e) {
e.printStackTrace();
}
// 拼装sql语句
// 字段值为空则排除
if(fieldValue==null ||
((fieldValue instanceof Integer) && (Integer)fieldValue==0)) {
continue;
}
sBuilder.append(" and ").append(fieldName);
if(fieldValue instanceof String) {
if(((String)fieldValue).contains(",")) {
String[] values = ((String) fieldValue).split(",");
sBuilder.append(" in( ");
for (String v : values) {
sBuilder.append("'").append(v).append("', ");
}
// 将最后一个逗号去掉
sBuilder.deleteCharAt(sBuilder.length()-2);
sBuilder.append(")");
}else {
sBuilder.append(" = ").append("'").append(fieldValue).append("'");
}
}else if(fieldValue instanceof Integer) {
sBuilder.append(" = ").append(fieldValue);
}
}
return sBuilder.toString();
}
}