课程名称:全面解析Java注解
课程章节:第5章 注解实战
课程讲师: 刘果国
课程内容:
1、注解实战
需求:
1)有一张用户表,字段包括用户ID、用户名、昵称、年龄、性别、所在城市、邮箱、手机号;
2)方便的对每个字段或字段的组合条件进行检索,并打印出SQL;
3)使用方式要足够简单。
2、代码实现
//Filter.class
@Table("User")
public class Filter {
@Column("id")
private int id;
@Column("user_name")
private String userName;
@Column("nick_name")
private String nickName;
@Column("age")
private int age;
@Column("city")
private String city;
@Column("email")
private String email;
……
}
//Table.class
@Target({ElementType.TYPE}) //表示作用域是类或接口
@Retention(RetentionPolicy.RUNTIME) //
public @interface Table {
String value();
}
//Column.class
@Target({ElementType.FIELD}) //表示作用域是类或接口
@Retention(RetentionPolicy.RUNTIME) //
public @interface Column {
String value();
}
3、需求实现
private static String query(Filter f){
StringBuilder sb = new StringBuilder();
//1.获取到class
Class c = f.getClass();
//2.获取到table的名字
boolean exists = c.isAnnotationPresent(Table.class);
if(!exists){
return null;
}
Table t = (Table)c.getAnnotation(Table.class);
String tableName = t.value();
sb.appent("select * from ").append(tableName).append(" where 1=1");
//3.遍历所有的字段
Field[] fArray = c.getDeclaredFields();
for(Field field : fArray){
//3.1拿到字段名
boolean fExists = field.isAnnotationPresent(Column.class);
if(!fExists){
continue;
}
Column column = field.getAnnotation(Column.class);
String columnName = column.value();
//3.2拿到字段的值
String fieldName = field.getName();
String getColumnName = "get" + fieldName.substring(0,1).toUpperCase()+fieldName.substring(1);
Object fieldValue = null;
try{
Method getMethod = c.getMethod(getColumnName);
fieldValue = getMethod.invoke(f);
}catch(Exception e){
e.printStackTrace();
}
//3.3拼接SQL
if(fieldValue==null ||
(fieldValue instanceof Integer && (Integer)fieldValue == 0){
continue;
}
sb.append(" and ").append(fieldName)
if(fieldValue instanceof String){
if(((String)fieldValue).contains(",")){
String[] values = ((String) fieldValue).split(",");
sb.append(" in (");
for(String v:values){
sb.append("'").append(v).append("',");
}
sb.deleteCharAt(sb.length()-1);
sb.append(")");
}
sb.append("='").append(fieldValue).append("'");
}else if(fieldValue instanceof Integer){
sb.append("=").append(fieldValue);
}
}
return sb.toString();
}
运行结果:
4、新的表查询
//Filter2.class
@Table("department")
public class Filter2 {
@Column("id")
private int id;
@Column("name")
private String name;
@Column("leader")
private String leader;
@Column("amount")
private int amount;
……
}
//Test.class
Filter2 filter2 = new Filter2();
filter2.setAmount(10);
filter2.setName("技术部");
System.out.println(query(filter2));
运行结果:
课程收获:
本次课程知道了注解的定义、注解的作用范围、生命周期,认识了注解的一些强大的功能,非常的方便实用。