当前位置: 首页 > 知识库问答 >
问题:

在Spring应用程序中使用JDBCTemplate处理不同的表名

江佐
2023-03-14

我正在与Spring Boot合作一个项目。JdbcNamedTemplates在我的DAO中用于访问数据。我在DAO中编写查询,然后在运行时映射一些参数以获得正确的数据。

现在,我必须根据请求从多个相同的表中检索数据。检索逻辑是相同的,只是我需要使用不同的表名。JdbcTemplate不允许使用表名作为参数。我不想使用字符串格式,因为我希望我的查询是最终的。

我可以创建具有大部分功能的抽象类和扩展它以处理表名差异的具体类(基本上,有方法“getTableName()”)。这很有效。但是,看起来我正在创建很多类,我想创建更少的类。

有更好的方法吗?

我在想,为特定的表名使用接口会很好,但我不知道如何使用Spring和Autowiring。

更新:

只是给出一个我想改进的示例。到目前为止,我有两个这样的抽象DAO。他们做数据库谈话。

public abstract class Dao1 {
    private static final String PARAM = "p";
    private final String QUERY1 = " SELECT * FROM " + getTableName() + " WHERE something";
    //here we would also have autowired jdbcNamedTemplate and maybe some other stuff.
    public getAll() {
        //map parameters, do query return results
    }
    protected abstract String getTableName();
}

接下来,我有几个实现抽象方法getTableName()的数据访问对象。所以如果桌子是“秋天”,我会的。

@Component
public class AutumnDao1 extends Dao1 {
    @Override
    protected String getTableName() {
        return "AUTUMN";
    }
}

所以从上面的例子可以看出,对于每一个抽象道,我必须制作几个具体的道(秋、冬、春、夏)。目前这是可以接受的,但在某种程度上,这可能会增长到相当大的DAO集合。

我想知道是否有办法避免这种情况,例如,为每个“季节”/名称只创建一个类/接口,并根据需要将其附加到Dao1、Dao2等。我只知道当用户请求到达时哪个名称是相关的。

共有1个答案

王棋
2023-03-14

使用@Qualifier("nameOfBean"),您可以注入您正在寻找的实例。

例如,如果您有:

@Component
public class AutumnDao1 extends Dao1 {
    @Override
    protected String getTableName() {
        return "AUTUMN";
    }
}

@Component
public class SummerDao1 extends Dao1 {
    @Override
    protected String getTableName() {
        return "SUMMER";
    }
}

在本例中,您将创建两个可以注入父类Dao1中的bean。要注入正确的,您应该执行以下操作:

@Autowire
@Qualifier("autumnDao1")
private Dao1 autumnDao;

@Autowire
@Qualifier("summerDao1")
private Dao1 summerDao;

试试这个!

 类似资料:
  • 我有一个带post请求的控制器。我试图用一个简单的NotNull注释验证POJO。我正在使用ControllerAdvice来处理异常。 所以我尝试使用它,但当我启动应用程序时,我得到了以下信息: 因此,我想为BindException创建自己的处理程序,但当我为BindException类创建ExceptionHandler时,spring应用程序不会启动。如果我注释掉handleBindExc

  • 我有一个gradle项目。在那里,我尝试启动一个Eureka服务器。以下是我的设置: //compileOnly('org.springframework.cloud:spring cloud starter netflix eureka server:')] 通过这种方式,我尝试启动应用程序: @EnableEurekaServer公共类EurekaServer{ } 但不幸的是,报告出现了一些

  • 在我的Spring Boot应用程序中,我喜欢使用带有特定模式的Spring Batch元表。留档建议使用表前缀。 我尝试将添加到属性文件中。我还尝试覆盖配置: 但我总是得到错误:由:org引起。h2。jdbc。JdbcSQLException:未找到表“批处理作业实例”;SQL语句:从批处理作业实例中选择作业实例ID、作业名称,其中作业名称=?而JOB_KEY=?[42102-182]

  • 我使用Spring初始化器、嵌入式Tomcat、Thymeleaf模板引擎和作为可执行JAR文件的包生成了一个Spring Boot web应用程序。 使用的技术: 错误:

  • 我试图在完全使用JavaConfig配置的Spring MVC应用程序中使用处理404错误。 Spring MVC版本为4.1.5 我读过这样的话: null SpringConfigurationInitializer 请注意,我正在使用 而且 MVC配置 存储配置 安全配置

  • 我正在学习Spring boot application,并且有使用xml和java配置的Spring应用程序的经验。 我使用的应用程序具有包含UI、服务和DAO的代码基体系结构。所有这些组件都有单独的上下文文件,即。web-applicationcontext.xml或application-servlet-context.xml、service-context.xml和data-context