如何为数据库连接创建不同的 class

How to make different class for DB connections

我正在开发一个 spring 引导应用程序,我需要一个通用的 class 来为我提供所有控制器的数据库连接所以我创建了一个单独的 class 如下:

@RestController
public class DataBaseConnector{


     @Autowired
     @Qualifier("dataSource")
     public static DataSource dataSource;

        @Bean
        @Primary
        @ConfigurationProperties(prefix = "spring.ds")
        public DataSource DataSourcePGStreet() {
            return DataSourceBuilder.create().build();
        }

       @Autowired
       public Connection giveConnection() throws SQLException{
           return dataSource.getConnection();
       }


}

然后在另一个控制器中我调用连接如下:

@Autowired
    @Qualifier("dbc")
    private static DataBaseConnector obj;
@Autowired
 private Connection connectionDatabase;

.../// Rest Code
    @RequestMapping(value="/path",produces={MediaType.APPLICATION_JSON_VALUE},method=RequestMethod.GET)
     public ResponseEntity<?> getStreetScore(){


     obj=new DataBaseConnector();
     connectionDatabase=obj.giveConnection();



}

但这会给我一个

的错误

感谢 DataBaseConnector.Any 帮助创建名称时出错

完整堆栈跟踪

描述:

Field dataSource in com.dmmltasmu.controller.DataBaseConnector required a bean of type 'javax.sql.DataSource' that could not be found.
    - Bean method 'dataSource' not loaded because @ConditionalOnClass did not find required class 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType'
    - Bean method 'dataSource' not loaded because @ConditionalOnClass did not find required classes 'javax.transaction.TransactionManager', 'org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType'

您不能自动装配静态字段。丑但是如果你想尝试下面的一个

@Component
public class AnotherController {

private static DataBaseConnectionProvider obj;

@Autowired
public void setDataBaseConnectionProvider(DataBaseConnectionProvider obj) {
    AnotherController.obj = obj;
}}

您使用静态

 @Autowired
 @Qualifier("dataSource")
 public static DataSource dataSource;

Spring 无法自动装配 static。删除 static

您可以尝试通过方法自动装配并分配给静态,但这是糟糕的方法。

中相同
@Autowired
@Qualifier("dbc")
private static DataBaseConnector obj;

去除静电。

BTW java 命名约定假定方法名称从小写字母开始。更正

DataSourcePGStreet

不要尝试注入 Connection 这会导致错误和难以调试的问题。只需使用 JdbcTemplate 进行 JDBC 访问不会让您的生活更艰难。

旁边 @Autowired 上的 static 字段将不起作用,您只能注入非 static 字段。

假设您已经相应地配置了您的 spring.datasource 属性(如果没有将您的 spring.ds 属性重命名为 spring.datasource)这样 Spring 将自动配置一个 DataSourceJdbcTemplate.

从您的代码来看,只需删除您的 DataBaseConnector

要使用 JdbcTemplate 只需注入它。

@Autowired
private JdbcTemplate jdbc;

@RequestMapping(value="/path",produces={MediaType.APPLICATION_JSON_VALUE},method=RequestMethod.GET)
public ResponseEntity<?> getStreetScore(){
    Obj result = jdbc.queryForObject(<your-query>, new RowMapper() { ... });
    return ResponseEntity.ok(result);
}

或者您的实施是什么。