下面是详细的Java利用自定义注解、反射实现简单BaseDao实例的攻略:
一、什么是自定义注解?
自定义注解是一种特殊的interface,它和普通接口有些类似,但是它仅仅是一种标记,没有任何具体的方法。Java提供了元注解来为注解提供信息,元注解可以放在注解前面,用于描述注解本身的信息。
二、自定义注解的作用?
自定义注解常用于标记,其作用就是给编译器、解释器或其他工具罗列有关程序元素的额外信息,告诉这些工具如何处理程序元素。注解在编写程序时并不会发挥作用,只有在某些工具下,才能让工具发挥作用。
三、利用自定义注解、反射实现简单BaseDao实例
在数据库开发中,许多相似的操作需要写很多相似的方法,比如增加、删除、修改、查询等。这类方法的本质是一致的,区别在于表名、字段名等属性,因此可以通过反射和自定义注解,复用代码。
具体实现步骤如下:
1. 定义自定义注解
在Java代码中,使用关键字 "@interface" 来定义注解类型。注解类型的名称应以大写字母开头,遵守驼峰命名法。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table {
String value();
}
在上述代码中,定义了一个名为 Table 的注解类型,它有一个名为 value 的属性。
2. 注解到实体类上
@Table(value = "student")
public class Student {
private int id;
private String name;
private int age;
// getter/setter方法省略
}
在上述代码中,注解 @Table 被注解到了实体类 Student 上,并且指定了表名 student。
3. 实现 BaseDao
BaseDao 是所有 Dao 类的基类,其中封装了一些通用的数据库操作方法,并且利用反射和自定义注解实现了对表名和字段名的获取。
public abstract class BaseDao<T> {
private Class<T> clazz;
private String tableName;
private Map<String, String> fieldMap;
public BaseDao() {
Type type = getClass().getGenericSuperclass();
ParameterizedType parameterizedType = (ParameterizedType) type;
clazz = (Class<T>) parameterizedType.getActualTypeArguments()[0];
tableName = clazz.getAnnotation(Table.class).value();
fieldMap = new HashMap<>();
for (Field field : clazz.getDeclaredFields()) {
field.setAccessible(true);
String fieldName = field.getName();
String columnName = fieldName;
if (field.isAnnotationPresent(Column.class)) {
columnName = field.getAnnotation(Column.class).value();
}
fieldMap.put(fieldName, columnName);
}
}
public void insert(T entity) {
// Insert data into database
}
public void deleteById(int id) {
// Delete data from database by ID
}
public void update(T entity) {
// Update data in database
}
public T findById(int id) {
// Find data from database by ID
return null;
}
public List<T> findAll() {
// Find all data from database
return null;
}
}
在上述代码中,首先获取泛型 T 的类型,然后利用反射获取注解 Table 上的表名。接着,遍历 T 中所有字段,如果某个字段被注解 @Column 修饰,则获取 @Column 的 value 属性作为对应的字段名。最终得到一个字段名与属性名的对应关系。通过此关系,就可以在数据库操作时直接使用属性名,而不需要显式地指定字段名了。
4. 实现 StudentDao
public class StudentDao extends BaseDao<Student> {
public void insert(Student student) {
super.insert(student);
}
public void deleteById(int id) {
super.deleteById(id);
}
public void update(Student student) {
super.update(student);
}
public Student findById(int id) {
return super.findById(id);
}
public List<Student> findAll() {
return super.findAll();
}
}
在上述代码中,从 BaseDao 继承得到了增删改查的通用方法。
5. 示范
在终端输入以下代码:
StudentDao dao = new StudentDao();
Student student = new Student();
student.setId(1001);
student.setName("张三");
student.setAge(18);
dao.insert(student);
这样就向 student 表插入了一条数据。
再输入以下代码:
StudentDao dao = new StudentDao();
Student student = dao.findById(1001);
System.out.println(student.getName());
这样就从 student 表中查询了 ID 为 1001 的记录,并输出其名字。
至此,Java利用自定义注解、反射实现了简单的 BaseDao 实例。
四、总结
通过自定义注解、反射,我们可以大幅减少代码量,实现代码的复用和灵活性。此外,注解为我们提供了一种有力的、基于元数据的编程方式,使得代码更加规范、易于维护。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java利用自定义注解、反射实现简单BaseDao实例 - Python技术站