package MyAnnotation;
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 DataFieldName {
String columnname();
String columntype();
int size();
}
@是元注解,表示给自己这个自定义的注解进行的说明和条件使用限制
@Target(ElementType.FIELD):表示DataFieldName这个注解只能给属性执行
@Retention(RetentionPolicy.RUNTIME):表示作用范围是java的整个运行期,还能设置只能在编译期间有效;
注解的使用:
package MyAnnotation;
import java.lang.annotation.Retention;
import java.time.LocalDate;
import java.util.Date;
@DataTableName(tablename = "Emp")
public class Emp {
@DataFieldName(columnname = "EMPNO",columntype = "int",size = 11)
private Integer empno;
@DataFieldName(columnname = "ENAME",columntype = "varchar",size = 50)
private String ename;
@DataFieldName(columnname = "JOB",columntype = "varchar",size = 50)
private String job;
@DataFieldName(columnname = "MGR",columntype = "int",size = 11)
private Integer mgr;
@DataFieldName(columnname = "HIREDATE",columntype = "date",size = 0)
private Date hiredate;
@DataFieldName(columnname = "SAL",columntype = "double",size = 7)
private Double sal;
@DataFieldName(columnname = "COMM",columntype = "double",size = 7)
private Double comm;
@DataFieldName(columnname = "DEPTNO",columntype = "int",size = 11)
private Integer deptno;
@Override
public String toString() {
return "Emp{" +
"empno=" + empno +
", ename='" + ename + '\'' +
", job='" + job + '\'' +
", mgr=" + mgr +
", hiredate=" + hiredate +
", sal=" + sal +
", comm=" + comm +
", deptno=" + deptno +
'}';
}
}
对应权限的注解只能放在对应 属性、类、方法上,注解使得Java源代码中不但可以包含功能性的实现代码,还可以添加元数据。 注解的功能类似于代码中的注释,所不同的是注解不是提供代码功能的说明,而是实现程序功能的重要组成部分,这是一个在jdbc对数据库中数据进行查询的一个和数据库表相对应的实体类,我们在注解中表示了,对应的表名字段名、类型长度等,这样就可以在查询数据时,将这些注解中的名字拿出来进行匹配,这样就能顺利进行查询,最后存入实体类对象中,再以实体类的形式进行打印展示数据!
具体实现:这里面给的是Student类,懒得改了,道理是一样的
package StudentMannageSystem.dao;
import StudentMannageSystem.bean.DbTableColumName;
import StudentMannageSystem.bean.Student;
import util.DBUtil;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.sql.*;
public class LoginDao {
//登录模块
Connection con = DBUtil.getConnection();
public Student findStudent(String sql,Class<Student> stu,Object...args) throws SQLException, InstantiationException, IllegalAccessException {
PreparedStatement ps = con.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i+1,args[i]);
}
ResultSet resultSet = null;
resultSet = ps.executeQuery();
//结果集获取属性对象
ResultSetMetaData rsd = resultSet.getMetaData();
Field[] fields = stu.getDeclaredFields();
/* Annotation annotation = stu.getAnnotation(DbTableColumName.class);
DbTableColumName columName=(DbTableColumName)annotation;*/
//注解对象
Student student = null;
while (resultSet.next()){
student = stu.newInstance();
for (Field field:fields) {
//获取到注解对象(这是属性注解对象,所以通过这个对象能拿到注解里面对应的内容,也就是我们给定的字段名)
DbTableColumName cName = field.getAnnotation(DbTableColumName.class);
//调用自定义注解里方法就能拿到字段名
String name = cName.tableColumnName();
//通过字段名对结果集进行获取数据
Object value = resultSet.getObject(name);
//通过反射机制给实体类的属性赋值,最后通过实体类打印出数据库中的表数据
field.setAccessible(true);
field.set(student,value);
}
}
return student;
}
}