Как мне в этом коде, сделать так, чтобы я верно использовал PrepareStatement?
Я уже всю реализацию ДАО не скидываю, так как очень много кода. В моем коде PrepareStatement замедляет работу, а нужно чтобы ускорял. Я его использую не верно. Я так понимаю, мне его как то открыть надо один раз, потом использовать везде как-то, и потом закрыть? Буду рад любой помощи.
public class MySqlDaoStudent implements DaoStudent {
private PreparedStatement stm=null;
private final Connection connection;
private ResultSet rs=null;
public MySqlDaoStudent(Connection connection) {
this.connection = connection;
}
@Override
public Student read(int key) throws SQLException {
String sql="SELECT * FROM student_db.student where id = ?;";
Student student = new Student();
try {
stm = connection.prepareStatement(sql);
stm.setInt(1, key);
rs = stm.executeQuery();
rs.next();
student.setId(rs.getInt("ID"));
student.setFirst_name(rs.getString("FIRST_NAME"));
student.setSecond_name(rs.getString("SECOND_NAME"));
} catch (SQLException e) {
e.printStackTrace();
} finally {
if(rs!=null){
rs.close();
}
if(connection!=null){
connection.close();
}
if (stm!=null){
stm.close();
}
}
return student;
}
@Override
public List
Ответ
Верное использование PreparedStatement заключается в том, что необходимо подготовить запрос в СУБД, прежде, чем он будет отправлен. Его нужно подготовить, сохранить в поле, а потом использовать, таким образом достигается максимальная скорость обработки любых запросов в любом кол-ве. Вот код решения моего вопроса:
(sql запрос сохранил в константу)
/* Константа sql запроса */
private static final String SQL_SELECT_ALL_STUDENT =
"SELECT id, first_name, second_name FROM student_db.student";
/* поле подключения */
private Connection connection = null;
/* поле PS */
private PreparedStatement psSelectAllStudent = null;
// использую Properties для чтения user,password,driver,url
// подключаюсь к СУБД
private Connection getConnection() throws DaoException {
Properties property = new Properties();
InputStream inputStream = null;
try {
inputStream = this.getClass().getResourceAsStream("/config.properties");
property.load(inputStream);
String url = property.getProperty("url");
String user = property.getProperty("user");
String password = property.getProperty("password");
String driver = property.getProperty("driver");
Class.forName(driver);
if (connection == null) {
connection = DriverManager.getConnection(url, user, password);
}
} catch (IOException ex) {
DaoException er = new DaoException("ошибка загрузки файла ", ex);
throw er;
} catch (ClassNotFoundException ex) {
DaoException er = new DaoException("ошибка Class.forName(driver) ", ex);
throw er;
} catch (SQLException ex) {
DaoException er = new DaoException("ошибка соединения с СУБД ", ex);
throw er;
}
return connection;
}
//подготавливаю PS в СУБД и сохраняю в поле
private void selectAllStudentPs(String sql) throws DaoException {
getConnection();
try {
if (psSelectAllStudent == null) {
psSelectAllStudent = connection.prepareStatement(sql);
}
} catch (SQLException er) {
DaoException ex = new DaoException("ошибка подготовки запроса в selectStudentPs ", er);
throw ex;
}
}
//получаю список того, что было необходимо сделать в задании
@Override
public List
Таким образов и получается именно ускорение PreparedStatement !
Комментариев нет:
Отправить комментарий