26 Ekim 2021 Salı

DbUtils

Giriş
Bu kütüphanede az sınıf var. Kullanması kolay. Tasarım açısından 2 çeşit API sağlıyor
1. JDBC kaynaklarını DbUtils'in yönettiği API. Bu kullanımda Connection, PreparedStatement ve ResultSet'i kütüphane kapatır.
2. Connection'ın dışarıdan verildiği API. Bu kullanımda Connection nesnesini bizim kapatmamız gerekir.

Kötü Tasarım
Bir seferinde Connection, PreparedStatement ve ResultSet'i sarmalayıp dışarı veren bir kütüphane görmüştüm. Bu sarmalanan nesneyi kapatmayı unutunca bir sürü resource leak oluyor ve "ORA-01000: Maximum Open Cursors Exceeded" hatası geliyordu.

Yani en güzeli, kaynakları kapatma işini kütüphanenin kendisinin yapması

Maven
Şu satırı dahil ederiz
<dependency>
  <groupId>commons-dbutils</groupId>
  <artifactId>commons-dbutils</artifactId>
  <version>1.6</version>
</dependency>
QueryRunner Sınıfı
insert metodu
Örnek
Şöyle yaparız
QueryRunner runner = new QueryRunner();
    String insertSQL
      = "INSERT INTO employee (firstname,lastname,salary, hireddate) "
        + "VALUES (?, ?, ?, ?)";

int numRowsInserted = runner.update(connection, insertSQL, "Leia", "Kane", 60000.60,
  new Date());
query metodu - String sql, ResultSetHandler<T> rsh, Object... params
Şöyle yaparız
// Create a ResultSetHandler implementation to convert the first row into an Object[].
ResultSetHandler<Object[]> h = new ResultSetHandler<>() {
  public Object[] handle(ResultSet rs) throws SQLException {
    ...
  }
};

// Create a QueryRunner that will use connections from the given DataSource
QueryRunner run = new QueryRunner(dataSource);

// Execute the query and get the results back from the handler
Object[] result = run.query("SELECT * FROM Person WHERE name=?", h, "John Doe");
query metodu - Connection + String sql, ResultSetHandler<T> rsh, Object... params
Şöyle yaparız
ResultSetHandler<Object[]> h = ... // Define a handler the same as above example

// No DataSource so we must handle Connections manually
QueryRunner run = new QueryRunner();
Connection conn = ... // open a connection try { Object[] result = run.query(conn, "SELECT * FROM Person WHERE name=?", h, "John Doe");
// do something with the result } finally { // Use this helper method so we don't have to check for null DbUtils.close(conn); }
update metodu
Örnek
Şöyle yaparız
double salary = 35000;

QueryRunner runner = new QueryRunner();
String updateSQL = "UPDATE employee SET salary = salary * 1.1 WHERE salary <= ?";
int numRowsUpdated = runner.update(connection, updateSQL, salary);
BeanListHandler Sınıfı
Şu satırı dahil ederiz
import org.apache.commons.dbutils.handlers.BeanListHandler;
Örnek
Elimizde şöyle bir kod olsun
public class EmployeeHandler extends BeanListHandler<Employee> {

  public EmployeeHandler() {
    super(Employee.class,
          new BasicRowProcessor(new BeanProcessor(getColumnsToFieldsMap())));
    // ...
  }
  protected Map<String, String> getColumnsToFieldsMap() {
    Map<String, String> columnsToFieldsMap = new HashMap<>();
    columnsToFieldsMap.put("FIRST_NAME", "firstName");
    columnsToFieldsMap.put("LAST_NAME", "lastName");
    columnsToFieldsMap.put("HIRED_DATE", "hiredDate");
    return columnsToFieldsMap;
  }

}
Şöyle yaparız
EmployeeHandler employeeHandler = new EmployeeHandler();

QueryRunner runner = new QueryRunner();
String query = "SELECT * FROM employee_legacy";
List<Employee> employees = runner.query(connection, query, employeeHandler);
MapListHandler Sınıfı
Şu satırı dahil ederiz
import org.apache.commons.dbutils.handlers.MapListHandler;
Örnek
Şöyle yaparız
MapListHandler beanListHandler = new MapListHandler();

QueryRunner runner = new QueryRunner();
List<Map<String, Object>> list = runner.query(connection, 
                                               "SELECT * FROM employee", 
                                               beanListHandler);


Hiç yorum yok:

Yorum Gönder