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 实例。

四、总结

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

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

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

相关文章

  • Java的IO流实现文件和文件夹的复制

    Java中的IO流可以实现文件和文件夹的复制,下面是实现这个过程的完整攻略: 1. 复制文件 1.1 创建文件输入流和文件输出流 在Java中,文件的复制过程可以通过创建文件输入流和文件输出流实现。可以使用Java IO的File类提供的构造函数来打开文件输入流和输出流,然后使用缓冲区逐个字节的复制文件内容。 示例代码: File inputFile = n…

    Java 2023年5月19日
    00
  • Java File类的概述及常用方法使用详解

    Java File类的概述及常用方法使用详解 File类的简介 在Java程序中,File类是用来操作文件和目录的一种标准化方法,它提供了一系列方法用来获取文件或目录的信息,以及对它们进行读写操作。File类提供了很多的方法来操作文件和目录,能够满足大多数文件和目录的基本操作需求。 File类的常用方法 File类提供了很多方法,但常用的方法主要有以下几个:…

    Java 2023年5月20日
    00
  • java使用jacob实现word转pdf

    Java使用Jacob可以实现将Word文档转换为PDF格式的功能。下面是具体的步骤: 准备工作 首先,需要在Java项目中引入Jacob的jar包。可以从官方网站(https://sourceforge.net/projects/jacob-project/ )下载,或者使用Maven进行依赖管理: <dependency> <group…

    Java 2023年6月15日
    00
  • 详解Http请求中Content-Type讲解以及在Spring MVC中的应用

    详解HTTP请求中Content-Type讲解以及在Spring MVC中的应用 Content-Type是什么? 在HTTP协议中,Content-Type是一个请求头部和响应头部必不可少的属性,用来标识HTTP请求或响应体中的数据类型。常见的Content-Type类型有: text/html (html格式) application/json (jso…

    Java 2023年5月20日
    00
  • JSP中使用JDBC连接MySQL数据库的详细步骤

    下面是使用 JSP 连接 MySQL 数据库的详细步骤: 1.下载JDBC驱动 首先,你需要下载与你的 MySQL 数据库版本匹配的 JDBC 驱动。你可以从 MySQL 官方网站下载。以下是 MySQL Connector/J 的下载链接。 选择正确的版本,将其下载并解压缩到本地。 2.导入JDBC驱动 将解压的驱动jar包导入到您的项目中。可以通过以下两…

    Java 2023年6月15日
    00
  • 详解SpringCloud服务认证(JWT)

    详解Spring Cloud服务认证(JWT) 简介 随着微服务架构的广泛应用,越来越多的服务被拆分成多个小的服务来实现业务逻辑。在这些服务之间进行调用时,我们需要确保服务之间的安全性和认证性。JWT(JSON Web Token)是目前流行的一种跨服务认证机制,它基于无状态性的架构,不需要在服务端记录用户状态,能够承载一些声明信息,以相对较为安全的方式在服…

    Java 2023年5月20日
    00
  • table中点击表头实现排序的功能示例介绍

    实现table中点击表头实现排序的功能是一个常见的需求,通过JavaScript和jQuery实现非常方便。下面是具体的步骤和代码示例。 1. HTML结构 首先需要在HTML中定义一个table,并将需要进行排序的数据展示在其中。其中,包括表头和表身两个部分。示例代码如下: <table id="myTable"> <…

    Java 2023年6月15日
    00
  • WebSocket实现数据库更新时前端页面刷新

    实现WebSocket实时刷新前端页面的步骤如下: 前端客户端通过WebSocket与服务器端建立连接。 在前端,可以使用WebSocket API来建立与服务器端的连接。例如: const ws = new WebSocket(‘ws://localhost:3000’); 服务端通过WebSocket与数据库建立连接。 服务端需要监听客户端的WebSoc…

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