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日

相关文章

  • springmvc集成shiro登录权限示例代码

    下面是关于SpringMVC集成Shiro登录权限的完整攻略,包含两个示例说明。 SpringMVC集成Shiro登录权限示例代码 Shiro是一个强大的Java安全框架,它提供了身份验证、授权、加密等功能。在SpringMVC中集成Shiro可以帮助我们更好地管理用户的登录和权限。在本文中,我们将介绍如何在SpringMVC中集成Shiro,并提供两个示例…

    Java 2023年5月17日
    00
  • 浅谈在Spring中如何使用数据源(DBCP、C3P0、JNDI)

    在Spring框架中,我们可以通过不同的数据源来操作数据库,包括DBCP、C3P0和JNDI等。下面将详细介绍在Spring中使用这些数据源的方法。 DBCP DBCP(DataBase Connection Pool)是Apache提供的数据库连接池技术。在Spring中,我们可以通过配置文件来使用DBCP数据源。具体步骤如下: 步骤1:添加依赖 在Mav…

    Java 2023年5月20日
    00
  • Windows下Java调用可执行文件代码实例

    Windows下Java调用可执行文件代码实例 在Windows系统下,Java程序可以通过调用可执行文件(exe文件)来实现一些特定功能。本文将详细讲解如何在Java程序中调用可执行文件的步骤和过程。 准备工作 在开始之前,需要确保Java和可执行文件均已安装并配置好环境变量。 第一步:创建ProcessBuilder对象 在Java程序中调用可执行文件,…

    Java 2023年5月19日
    00
  • SpringBoot2.3新特性优雅停机详解

    SpringBoot2.3新特性优雅停机详解 简介 在以往的项目中,我们在正常停止服务时,往往都是使用kill的方式来停止,这种方式虽然简单,但是可能会导致一些问题,比如程序被强制关闭时,可能会导致正在处理的请求直接中断等问题。SpringBoot2.3中新增了一个优雅停机的功能,可以让我们在停止服务时,更加安全和优雅。 优雅停机的原理 在之前的Spring…

    Java 2023年5月15日
    00
  • SpringBoot实现钉钉机器人消息推送的示例代码

    下面是 Spring Boot 实现钉钉机器人消息推送的完整攻略。 1. 准备工作 在开始之前,需要完成以下几个步骤: 在钉钉工作台上创建一个自定义机器人。 获取钉钉机器人的 Webhook 值。 2. 新建 Spring Boot 项目 使用 Spring Initializr 创建一个新的 Spring Boot 项目。在这个项目中,我们需要引入以下依赖…

    Java 2023年6月1日
    00
  • Mybatis中xml的动态sql实现示例

    关于”Mybatis中xml的动态sql实现示例”,以下是完整攻略: 什么是动态SQL 动态SQL是指根据条件动态拼接生成SQL语句的过程。它通常用于动态查询、更新或删除数据库中的数据。 在Mybatis中,我们可以使用XML文件来动态生成SQL语句,以实现更加精确的数据库操作。 Mybatis中动态SQL的实现方式 在Mybatis中,我们可以使用if、c…

    Java 2023年5月20日
    00
  • 怎么运行用记事本写的java程序

    当我们使用记事本来编写Java程序时,需要注意一些细节,例如设置环境变量、保存文件格式、编译运行指令等等。下面是详细讲解如何在Windows操作系统中使用记事本运行Java程序的攻略: 环境变量配置 为了让操作系统知道我们的Java程序在哪里,我们需要设置Java环境变量。可以按照如下步骤进行设置: 在桌面上用鼠标右键点击“此电脑”图标,然后选择“属性”选项…

    Java 2023年5月19日
    00
  • Java数组的声明与创建示例详解

    下面我来详细讲解“Java数组的声明与创建示例详解”。 Java数组的声明 Java数组的声明方式有两种: 声明数组类型后再声明数组变量 声明数组时直接初始化 下面分别来看这两种方式的示例。 声明数组类型后再声明数组变量 // 声明一个整型数组 int[] arr; // 声明一个字符串数组 String[] strArr; 在这种方式下,只声明了数组类型并…

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