Java教程

【备战春招】第21天 全面解析Java注解

本文主要是介绍【备战春招】第21天 全面解析Java注解,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

课程名称:全面解析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();

}

运行结果:

https://img4.sycdn.imooc.com/63fcd0a100011ed214480814.jpg

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));

运行结果:

https://img1.sycdn.imooc.com/63fcd0ab000184b714520814.jpg

课程收获:

本次课程知道了注解的定义、注解的作用范围、生命周期,认识了注解的一些强大的功能,非常的方便实用。


这篇关于【备战春招】第21天 全面解析Java注解的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!