首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用JDBC和Spring Boot创建java.sql.Connection

使用JDBC和Spring Boot创建java.sql.Connection
EN

Stack Overflow用户
提问于 2018-10-17 07:50:49
回答 1查看 4.3K关注 0票数 0

我想创建两个静态函数:java.sql.Connection Connection.getConnection()void Connection.closeConection()来获取和终止连接,这样我就可以在远程RDS实例上执行JDBC查询。下面是我写的内容:

application.properties

代码语言:javascript
复制
spring.datasource.url=jdbc:mysql://myRDSEndpoint:3306/mySchemaName
spring.datasource.username=myUsername
spring.datasource.password=myPassword
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

RDSConnection.java:

代码语言:javascript
复制
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class RDSConnection {
    public static String driver;
    public static String url;
    public static String user;
    public static String pass;

    @Autowired
    public RDSConnection getRDSConnection(@Value("${spring.datasource.driver-class-name}") String driver,
                                          @Value("${spring.datasource.url}") String url,
                                          @Value("${spring.datasource.username}") String user,
                                          @Value("${spring.datasource.password}") String pass) {
        RDSConnection.driver = driver;
        RDSConnection.url = url;
        RDSConnection.user = user;
        RDSConnection.pass = pass;

        return this;
    }
}

Connection.java

代码语言:javascript
复制
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.sql.DriverManager;
import java.sql.SQLException;

@Component
@Slf4j
public class Connection {
    private static java.sql.Connection sqlConnection;

    public static java.sql.Connection getConnection() {
        String driver = RDSConnection.driver;
        String url = RDSConnection.url;
        String user = RDSConnection.user;
        String pass = RDSConnection.pass;

        if(sqlConnection != null) return sqlConnection;

        try {
            Class.forName(driver);
            sqlConnection =  DriverManager.getConnection(url, user, pass);
        } catch (ClassNotFoundException | SQLException e) {
            log.error(e.getMessage());
        }

        return sqlConnection;
    }

    public static void closeConnection(java.sql.Connection sqlConnection) {
        try {
            sqlConnection.close();
        } catch (SQLException e) {
            log.error(e.getMessage());
        }
    }
}

这是可行的,但我想知道是否有更好的方法来做到这一点。既然我知道spring.datasource.*的值不会改变,有没有办法让RDSConection中的静态变量也变成final呢?如果是这样,如何从application.properties注入值

EN

回答 1

Stack Overflow用户

发布于 2018-10-17 08:41:13

有一些东西是可以改进的。

首先,我建议您使用SPRING DATA,您可以使用EntityManager并通过以下方式获得连接:

代码语言:javascript
复制
@PersistenceContext
private EntityManager entityManager;

public void method() {
    ... entityManager.unwrap(Session.class) ...
}

有关更多信息,请访问:https://docs.spring.io/spring-data/jpa/docs/current/reference/html/

要在spring boot中使用spring数据,只需使用:

代码语言:javascript
复制
@SpringBootApplication
@EntityScan(basePackages = {
            "com.your.project"
            })
@EnableJpaRepositories(basePackages = {
            "com.your.project"
            })
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);    
    }

}

其次,如果您真的想使用JDBC,我希望您使用Java7/+

在这种情况下,首先使用try-with-resources,这将自动关闭连接。

类似于:

代码语言:javascript
复制
try (Connection sqlConnection  =  DriverManager.getConnection(url, user, pass);
         PreparedStatement ps = sqlConnection.createPreparedStatement(sql); 
         ResultSet rs = ps.executeQuery()) {

         // process the resultset here, all resources will be cleaned up

    } catch (SQLException e) {
        log.error(e.getMessage());
    }
}

有关更多信息,请访问:How should I use try-with-resources with JDBC?

Class.forName(driver);它不再是必要的。在Java 6+中,因为DriverManager会自动加载类路径上的驱动程序。有关更多信息,请访问:Why do I need to explicitly write Class.forName() when using JDK 8?

最后,如果您确实不想使用Spring设置,那么就没有理由使用application.properties。您可以使用将是静态和最终的常量。

注:请记住,作为预防措施,您必须关闭所有ResultSet和PreparedStatement,而不仅仅是连接。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52845453

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档