[英]Getting java.sql.connection from Spring jdbc : getJdbcTemplate()
[英]Creating a java.sql.Connection using JDBC and Spring Boot
我想创建两个静态函数: java.sql.Connection Connection.getConnection()
和void Connection.closeConection()
以获取和终止连接,以便可以在远程RDS实例上执行JDBC查询。 这是我写的:
application.properties
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:
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
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
的静态变量最终化吗? 如果是这样,如何从application.properties
注入值?
有一些可以改进的地方...
首先,我建议您使用SPRING DATA,可以使用EntityManager并与此建立连接:
@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数据,只需使用:
@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,希望您使用JAVA 7 / +
在这种情况下,请先使用try-with-resources,这将自动关闭连接。
就像是:
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());
}
}
有关更多信息: 如何在JDBC中使用try-with-resources?
和Class.forName(driver); 不再需要。 在Java 6+中,因为DriverManager将自动加载在类路径中找到的驱动程序。 有关更多信息: 为什么在使用JDK 8时需要显式编写Class.forName()?
最后,如果您确实不想使用Spring设置,则没有理由使用application.properties。 您可以使用静态的和最终的常量。
PS:请记住,您必须关闭所有ResultSet和PreparedStatement,而不仅仅是关闭连接。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.