GitHub
Github地址:AnnoDao
注解的老话题
首先我们要介绍一下注解是什么,有什么用?
java JDK中的几个注解就可以帮助到我们去理解
@Override:重写注解
@Deprecated: 使其无效
@SuppressWarnings: 忽略警告
通过以上几种我们可以大致了解了注解的作用,方便开发,提高逼格,如果你能自定义注解来实现功能那就是又强又牛皮呀!
相关介绍
注解是Annotation,是由元注解定义出来的,元注解有以下几种
- @Documented —— 指明拥有这个注解的元素可以被javadoc此类的工具文档化。这种类型应该用于注解那些影响客户使用带注释的元素声明的类型。如果一种声明使用Documented进行注解,这种类型的注解被作为被标注的程序成员的公共API。
- @Target——指明该类型的注解可以注解的程序元素的范围。该元注解的取值可以为TYPE,METHOD,CONSTRUCTOR,FIELD等。如果Target元注解没有出现,那么定义的注解可以应用于程序的任何元素。
- @Inherited——指明该注解类型被自动继承。如果用户在当前类中查询这个元注解类型并且当前类的声明中不包含这个元注解类型,那么也将自动查询当前类的父类是否存在Inherited元注解,这个动作将被重复执行知道这个标注类型被找到,或者是查询到顶层的父类。
- @Retention——指明了该Annotation被保留的时间长短。RetentionPolicy取值为SOURCE,CLASS,RUNTIME。
代码演练
需求:
1、方便的对每个字段或字段组合条件进行检索,并打印出sql
分别定义两个注解类
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String value();
}
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Column {
String value();
}
这时直接使用即可
@Data
@NoArgsConstructor
@AllArgsConstructor
@Table("filter")
class Filter {
@Column("id")
private int id;
@Column("user_name")
private String username;
@Column("pass_word")
private String password;
@Column("age")
private int age;
@Column("city")
private String city;
@Column("email")
private String email;
@Column("mobile")
private String mobile;
}
主要在注解的反射处理,你需要按照自己的要求去处理业务
public static void main(String[] args) {
Filter f1 = new Filter();
f1.setId(10);
Filter f2 = new Filter();
f2.setUsername("小龙");
Filter f3 = new Filter();
f3.setEmail("123123123@qq.com,llll@qq.com");
String q1 = query(f1);
String q2 = query(f2);
String q3 = query(f3);
System.out.println(q1);
System.out.println(q2);
System.out.println(q3);
}
private static String query(Object filter){
StringBuilder sb = new StringBuilder();
//1、获取到class
Class c = filter.getClass();
//2、获取table的名字
boolean isexist = c.isAnnotationPresent(Table.class);
if (!isexist){
return null;
}
Table table = (Table) c.getAnnotation(Table.class);
String tableName = table.value();
sb.append("select * from ").append(tableName).append(" where 1=1");
//3、便利所有字段
Field[] fields = c.getDeclaredFields();
for (Field field:fields){
//4、处理每个字段对应的sql
//4.1、拿到字段名
boolean fExist = field.isAnnotationPresent(Column.class);
if (!fExist){
continue;
}
Column column = field.getAnnotation(Column.class);
String columnName = column.value();
//4.2、拿到字段值
String fieldName = field.getName();
String getMethodName = "get"+fieldName.substring(0,1).toUpperCase()+
fieldName.substring(1);
Object fieldValue = null;
try {
Method getMehtod = c.getMethod(getMethodName);
fieldValue = getMehtod.invoke(filter);
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
//4.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 value:values){
sb.append("'").append(value).append("'").append(",");
}
sb.deleteCharAt(sb.length()-1);
sb.append(")");
}else{
sb.append(" = ").append("'").append(fieldValue).append("'");
}
}else if (fieldValue instanceof Integer){
sb.append(" = ").append(fieldValue);
}
}
return sb.toString();
}
效果
select * from filter where 1=1 and id = 10
select * from filter where 1=1 and username = '小龙'
select * from filter where 1=1 and email in( '123123123@qq.com','llll@qq.com')
如果本文对你有所帮助,欢迎关注本人技术公众号,或者点赞,谢谢。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。