Java利用自定义注解、反射实现简单BaseDao实例

下面是详细的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 实例。

四、总结

通过自定义注解、反射,我们可以大幅减少代码量,实现代码的复用和灵活性。此外,注解为我们提供了一种有力的、基于元数据的编程方式,使得代码更加规范、易于维护。

阅读剩余 70%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java利用自定义注解、反射实现简单BaseDao实例 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • 一文让你了解透彻Java中的IO模型

    一文让你了解透彻Java中的IO模型 IO模型简介 在计算机中,IO模型是处理输入输出数据流的方法。在Java中,提供了多种IO模型,包括BIO、NIO、AIO。 BIO: 同步阻塞IO,采用传统的输入输出流,每一个线程并发处理一个客户端的请求。 NIO: 同步非阻塞IO,采用通道和缓冲区的概念,可以用一个线程并发处理多个客户端的请求。 AIO: 异步非阻塞…

    Java 2023年5月26日
    00
  • java利用Ant脚本生成war包全过程

    生成war包是Java Web开发中的重要过程之一。为了优化这个过程,可以使用Ant脚本来自动化这个过程。以下是Java利用Ant脚本生成war包的详细攻略。 1. 创建Ant脚本 首先需要创建一个Ant脚本,脚本需要包含以下几个步骤: 清空目标目录,以准备生成新的war包。 将源代码和依赖库编译成Java字节码。 将字节码打包成war包。 以下是示例Ant…

    Java 2023年5月26日
    00
  • Java使用正则表达式检索、替换String中特定字符和正则表达式的一切

    Java中使用正则表达式进行字符串的检索、替换等操作主要依靠Java.util.regex包中提供的类和方法。下面将从如下几个方面,介绍Java使用正则表达式进行检索、替换操作的完整攻略: 正则表达式的基础知识 在使用Java进行正则表达式操作之前,我们需要先了解一些正则表达式的基础知识,包括常用的正则表达式符号/语法、匹配模式等。下面给出一个简单的正则表达…

    Java 2023年5月27日
    00
  • Java获取json数组对象的实例讲解

    获取JSON数组对象是Java中常见的操作,通常在与API交互、解析数据等场景中经常需要使用。下面是步骤: 步骤 引入相关依赖 首先需要引入相关的依赖,包括JSON解析库和HTTP库,通常使用的是Jackson库和HttpClient库。 <dependencies> <dependency> <groupId>com.f…

    Java 2023年5月26日
    00
  • SpringMvc直接接收json数据自动转化为Map的实例

    讲解SpringMvc直接接收json数据自动转化为Map的实例的完整攻略如下: 1. 添加相关依赖 首先,我们需要添加SpringMvc相关的依赖。在pom.xml文件中添加以下依赖: <dependency> <groupId>org.springframework</groupId> <artifactId&g…

    Java 2023年5月26日
    00
  • servlet的url-pattern匹配规则详细描述(小结)

    当用tomcat作为web服务器时,在web.xml文件里配置servlet时需要指定url-pattern,它表示客户端请求的url与该servlet匹配的规则。servlet的url-pattern支持多种方式匹配,如下所示。 精确匹配 servlet的url-pattern可以配置具体的url,例如: <servlet> <servl…

    Java 2023年6月15日
    00
  • 一篇文章让你弄懂Java运算符

    一篇文章让你弄懂 Java 运算符 作为一名 Java 开发者,运算符是我们经常要用到的基本语法。在这篇文章中,我将详细讲解 Java 运算符,包括算术运算符、赋值运算符、比较运算符、逻辑运算符、位运算符等。 算术运算符 Java 中包含了常见的算术运算符,如加法、减法、乘法、除法和取模(求余数)。我们可以通过一个简单的例子来理解这些运算符的使用: int …

    Java 2023年5月23日
    00
  • httpclient 请求http数据,json转map的实例

    下面我将详细讲解“httpclient 请求http数据,json转map的实例”的完整攻略: 使用httpclient发送http请求 Apache的HttpComponents库提供了一个HttpClient类,可以用来发送HTTP请求。下面是使用httpclient发送http请求的步骤: 创建HttpClient对象。HttpClient是线程安全的…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部