Создание java.sql.Connection с использованием JDBC и Spring Boot - PullRequest
0 голосов
/ 17 октября 2018

Я хотел создать две статические функции: java.sql.Connection Connection.getConnection() и void Connection.closeConection() для получения и завершения соединений, чтобы я мог выполнять запросы JDBC на моем удаленном экземпляре RDS.Вот что я написал:


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());
        }
    }
}

Это работает, но мне было интересно, есть ли лучший способ сделать это.Есть ли способ сделать статические переменные в RDSConection также окончательными, поскольку я знаю, что значения spring.datasource.* не изменятся?Если да, то как мне ввести значения из application.properties?

1 Ответ

0 голосов
/ 17 октября 2018

Есть некоторые вещи, которые можно улучшить ...

Во-первых, я рекомендую вам использовать 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/

Для использования данных пружины с пружинной загрузкой просто используйте:

@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());
    }
}

Для получения дополнительной информации: Как мне использовать try-with-resources с JDBC?

И Class.forName (драйвер); Больше не нужно.В Java 6+ DriverManager будет автоматически загружать драйверы, найденные в пути к классам.Для получения дополнительной информации: Зачем мне явно писать Class.forName () при использовании JDK 8?

Наконец, если вы действительно не хотите использовать настройки Spring, вы неесть причина использовать application.properties.Вы можете использовать константы, которые будут статическими и окончательными.

PS: Помните, что вы должны закрыть все ResultSet и PreparedStatement, а не просто соединение в качестве меры предосторожности.

...