BAEL-970 A Guide to Apache Commons DbUtils (#2125)
* BAEL-970 A Guide to Apache Commons DbUtils * BAEL-970 A Guide to Apache Commons DbUtils * BAEL-970 A Guide to Apache Commons DbUtils - Added employeeId to Email class - Minor corrections
This commit is contained in:
parent
1b9353c83e
commit
9c643cd652
|
@ -227,6 +227,11 @@
|
||||||
<artifactId>commons-io</artifactId>
|
<artifactId>commons-io</artifactId>
|
||||||
<version>${commons.io.version}</version>
|
<version>${commons.io.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
<dependency>
|
||||||
|
<groupId>commons-dbutils</groupId>
|
||||||
|
<artifactId>commons-dbutils</artifactId>
|
||||||
|
<version>${commons.dbutils.version}</version>
|
||||||
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>org.apache.flink</groupId>
|
<groupId>org.apache.flink</groupId>
|
||||||
<artifactId>flink-core</artifactId>
|
<artifactId>flink-core</artifactId>
|
||||||
|
@ -369,7 +374,7 @@
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>com.h2database</groupId>
|
<groupId>com.h2database</groupId>
|
||||||
<artifactId>h2</artifactId>
|
<artifactId>h2</artifactId>
|
||||||
<version>1.4.195</version>
|
<version>${h2.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>pl.pragmatists</groupId>
|
<groupId>pl.pragmatists</groupId>
|
||||||
|
@ -530,6 +535,8 @@
|
||||||
<jetty.version>9.4.3.v20170317</jetty.version>
|
<jetty.version>9.4.3.v20170317</jetty.version>
|
||||||
<httpclient.version>4.5.3</httpclient.version>
|
<httpclient.version>4.5.3</httpclient.version>
|
||||||
<commons.io.version>2.5</commons.io.version>
|
<commons.io.version>2.5</commons.io.version>
|
||||||
|
<commons.dbutils.version>1.6</commons.dbutils.version>
|
||||||
|
<h2.version>1.4.196</h2.version>
|
||||||
<jetty.version>9.4.2.v20170220</jetty.version>
|
<jetty.version>9.4.2.v20170220</jetty.version>
|
||||||
<httpclient.version>4.5.3</httpclient.version>
|
<httpclient.version>4.5.3</httpclient.version>
|
||||||
<commons.io.version>2.5</commons.io.version>
|
<commons.io.version>2.5</commons.io.version>
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
package com.baeldung.commons.dbutils;
|
||||||
|
|
||||||
|
public class Email {
|
||||||
|
private Integer id;
|
||||||
|
private Integer employeeId;
|
||||||
|
private String address;
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getEmployeeId() {
|
||||||
|
return employeeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEmployeeId(Integer employeeId) {
|
||||||
|
this.employeeId = employeeId;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public String getAddress() {
|
||||||
|
return address;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAddress(String address) {
|
||||||
|
this.address = address;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Email{" + "id=" + id + ", address=" + address + '}';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,67 @@
|
||||||
|
package com.baeldung.commons.dbutils;
|
||||||
|
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class Employee {
|
||||||
|
private Integer id;
|
||||||
|
private String firstName;
|
||||||
|
private String lastName;
|
||||||
|
private Double salary;
|
||||||
|
private Date hiredDate;
|
||||||
|
private List<Email> emails;
|
||||||
|
|
||||||
|
public Integer getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Integer id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getFirstName() {
|
||||||
|
return firstName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setFirstName(String firstName) {
|
||||||
|
this.firstName = firstName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getLastName() {
|
||||||
|
return lastName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setLastName(String lastName) {
|
||||||
|
this.lastName = lastName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Double getSalary() {
|
||||||
|
return salary;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSalary(Double salary) {
|
||||||
|
this.salary = salary;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Date getHiredDate() {
|
||||||
|
return hiredDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHiredDate(Date hiredDate) {
|
||||||
|
this.hiredDate = hiredDate;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<Email> getEmails() {
|
||||||
|
return emails;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setEmails(List<Email> emails) {
|
||||||
|
this.emails = emails;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Employee{" + "id=" + id + ", firstName=" + firstName + ", lastName=" + lastName + ", salary=" + salary + ", hiredDate=" + hiredDate + '}';
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,45 @@
|
||||||
|
package com.baeldung.commons.dbutils;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import org.apache.commons.dbutils.BasicRowProcessor;
|
||||||
|
import org.apache.commons.dbutils.BeanProcessor;
|
||||||
|
|
||||||
|
import org.apache.commons.dbutils.QueryRunner;
|
||||||
|
import org.apache.commons.dbutils.handlers.BeanListHandler;
|
||||||
|
|
||||||
|
public class EmployeeHandler extends BeanListHandler<Employee> {
|
||||||
|
|
||||||
|
private Connection connection;
|
||||||
|
|
||||||
|
public EmployeeHandler(Connection con) {
|
||||||
|
super(Employee.class, new BasicRowProcessor(new BeanProcessor(getColumnsToFieldsMap())));
|
||||||
|
this.connection = con;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Employee> handle(ResultSet rs) throws SQLException {
|
||||||
|
List<Employee> employees = super.handle(rs);
|
||||||
|
|
||||||
|
QueryRunner runner = new QueryRunner();
|
||||||
|
BeanListHandler<Email> handler = new BeanListHandler<>(Email.class);
|
||||||
|
String query = "SELECT * FROM email WHERE employeeid = ?";
|
||||||
|
for (Employee employee : employees) {
|
||||||
|
List<Email> emails = runner.query(connection, query, handler, employee.getId());
|
||||||
|
employee.setEmails(emails);
|
||||||
|
}
|
||||||
|
return employees;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static 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;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,160 @@
|
||||||
|
package com.baeldung.commons.dbutils;
|
||||||
|
|
||||||
|
import java.sql.Connection;
|
||||||
|
import java.sql.DriverManager;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.concurrent.Executors;
|
||||||
|
import java.util.concurrent.Future;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
import org.apache.commons.dbutils.AsyncQueryRunner;
|
||||||
|
import org.apache.commons.dbutils.DbUtils;
|
||||||
|
import org.apache.commons.dbutils.QueryRunner;
|
||||||
|
import org.apache.commons.dbutils.handlers.BeanListHandler;
|
||||||
|
import org.apache.commons.dbutils.handlers.MapListHandler;
|
||||||
|
import org.apache.commons.dbutils.handlers.ScalarHandler;
|
||||||
|
import org.junit.After;
|
||||||
|
import static org.junit.Assert.*;
|
||||||
|
import org.junit.Before;
|
||||||
|
import org.junit.Test;
|
||||||
|
|
||||||
|
public class DbUtilsUnitTest {
|
||||||
|
|
||||||
|
private Connection connection;
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setupDB() throws Exception {
|
||||||
|
Class.forName("org.h2.Driver");
|
||||||
|
String db = "jdbc:h2:mem:;INIT=runscript from 'classpath:/employees.sql'";
|
||||||
|
connection = DriverManager.getConnection(db);
|
||||||
|
}
|
||||||
|
|
||||||
|
@After
|
||||||
|
public void closeBD() {
|
||||||
|
DbUtils.closeQuietly(connection);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenResultHandler_whenExecutingQuery_thenExpectedList() throws SQLException {
|
||||||
|
MapListHandler beanListHandler = new MapListHandler();
|
||||||
|
|
||||||
|
QueryRunner runner = new QueryRunner();
|
||||||
|
List<Map<String, Object>> list = runner.query(connection, "SELECT * FROM employee", beanListHandler);
|
||||||
|
|
||||||
|
assertEquals(list.size(), 5);
|
||||||
|
assertEquals(list.get(0)
|
||||||
|
.get("firstname"), "John");
|
||||||
|
assertEquals(list.get(4)
|
||||||
|
.get("firstname"), "Christian");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenResultHandler_whenExecutingQuery_thenEmployeeList() throws SQLException {
|
||||||
|
BeanListHandler<Employee> beanListHandler = new BeanListHandler<>(Employee.class);
|
||||||
|
|
||||||
|
QueryRunner runner = new QueryRunner();
|
||||||
|
List<Employee> employeeList = runner.query(connection, "SELECT * FROM employee", beanListHandler);
|
||||||
|
|
||||||
|
assertEquals(employeeList.size(), 5);
|
||||||
|
assertEquals(employeeList.get(0)
|
||||||
|
.getFirstName(), "John");
|
||||||
|
assertEquals(employeeList.get(4)
|
||||||
|
.getFirstName(), "Christian");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenResultHandler_whenExecutingQuery_thenExpectedScalar() throws SQLException {
|
||||||
|
ScalarHandler<Long> scalarHandler = new ScalarHandler<>();
|
||||||
|
|
||||||
|
QueryRunner runner = new QueryRunner();
|
||||||
|
String query = "SELECT COUNT(*) FROM employee";
|
||||||
|
long count = runner.query(connection, query, scalarHandler);
|
||||||
|
|
||||||
|
assertEquals(count, 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenResultHandler_whenExecutingQuery_thenEmailsSetted() throws SQLException {
|
||||||
|
EmployeeHandler employeeHandler = new EmployeeHandler(connection);
|
||||||
|
|
||||||
|
QueryRunner runner = new QueryRunner();
|
||||||
|
List<Employee> employees = runner.query(connection, "SELECT * FROM employee", employeeHandler);
|
||||||
|
|
||||||
|
assertEquals(employees.get(0)
|
||||||
|
.getEmails()
|
||||||
|
.size(), 2);
|
||||||
|
assertEquals(employees.get(2)
|
||||||
|
.getEmails()
|
||||||
|
.size(), 3);
|
||||||
|
assertNotNull(employees.get(0).getEmails().get(0).getEmployeeId());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenResultHandler_whenExecutingQuery_thenAllPropertiesSetted() throws SQLException {
|
||||||
|
EmployeeHandler employeeHandler = new EmployeeHandler(connection);
|
||||||
|
|
||||||
|
QueryRunner runner = new QueryRunner();
|
||||||
|
String query = "SELECT * FROM employee_legacy";
|
||||||
|
List<Employee> employees = runner.query(connection, query, employeeHandler);
|
||||||
|
|
||||||
|
assertEquals((int) employees.get(0).getId(), 1);
|
||||||
|
assertEquals(employees.get(0).getFirstName(), "John");
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenInserting_thenInserted() throws SQLException {
|
||||||
|
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());
|
||||||
|
|
||||||
|
assertEquals(numRowsInserted, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenHandler_whenInserting_thenExpectedId() throws SQLException {
|
||||||
|
ScalarHandler<Integer> scalarHandler = new ScalarHandler<>();
|
||||||
|
|
||||||
|
QueryRunner runner = new QueryRunner();
|
||||||
|
String insertSQL = "INSERT INTO employee (firstname,lastname,salary, hireddate) VALUES (?, ?, ?, ?)";
|
||||||
|
|
||||||
|
int newId = runner.insert(connection, insertSQL, scalarHandler, "Jenny", "Medici", 60000.60, new Date());
|
||||||
|
|
||||||
|
assertEquals(newId, 6);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenSalary_whenUpdating_thenUpdated() throws SQLException {
|
||||||
|
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);
|
||||||
|
|
||||||
|
assertEquals(numRowsUpdated, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void whenDeletingRecord_thenDeleted() throws SQLException {
|
||||||
|
QueryRunner runner = new QueryRunner();
|
||||||
|
String deleteSQL = "DELETE FROM employee WHERE id = ?";
|
||||||
|
int numRowsDeleted = runner.update(connection, deleteSQL, 3);
|
||||||
|
|
||||||
|
assertEquals(numRowsDeleted, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void givenAsyncRunner_whenExecutingQuery_thenExpectedList() throws Exception {
|
||||||
|
AsyncQueryRunner runner = new AsyncQueryRunner(Executors.newCachedThreadPool());
|
||||||
|
|
||||||
|
EmployeeHandler employeeHandler = new EmployeeHandler(connection);
|
||||||
|
String query = "SELECT * FROM employee";
|
||||||
|
Future<List<Employee>> future = runner.query(connection, query, employeeHandler);
|
||||||
|
List<Employee> employeeList = future.get(10, TimeUnit.SECONDS);
|
||||||
|
|
||||||
|
assertEquals(employeeList.size(), 5);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
CREATE TABLE employee(
|
||||||
|
id int NOT NULL PRIMARY KEY auto_increment,
|
||||||
|
firstname varchar(255),
|
||||||
|
lastname varchar(255),
|
||||||
|
salary double,
|
||||||
|
hireddate date
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE email(
|
||||||
|
id int NOT NULL PRIMARY KEY auto_increment,
|
||||||
|
employeeid int,
|
||||||
|
address varchar(255)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE employee_legacy(
|
||||||
|
id int NOT NULL PRIMARY KEY auto_increment,
|
||||||
|
first_name varchar(255),
|
||||||
|
last_name varchar(255),
|
||||||
|
salary double,
|
||||||
|
hired_date date
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
INSERT INTO employee (firstname,lastname,salary,hireddate) VALUES ('John', 'Doe', 10000.10, to_date('01-01-2001','dd-mm-yyyy'));
|
||||||
|
INSERT INTO employee (firstname,lastname,salary,hireddate) VALUES ('Kevin', 'Smith', 20000.20, to_date('02-02-2002','dd-mm-yyyy'));
|
||||||
|
INSERT INTO employee (firstname,lastname,salary,hireddate) VALUES ('Kim', 'Smith', 30000.30, to_date('03-03-2003','dd-mm-yyyy'));
|
||||||
|
INSERT INTO employee (firstname,lastname,salary,hireddate) VALUES ('Stephen', 'Torvalds', 40000.40, to_date('04-04-2004','dd-mm-yyyy'));
|
||||||
|
INSERT INTO employee (firstname,lastname,salary,hireddate) VALUES ('Christian', 'Reynolds', 50000.50, to_date('05-05-2005','dd-mm-yyyy'));
|
||||||
|
|
||||||
|
INSERT INTO employee_legacy (first_name,last_name,salary,hired_date) VALUES ('John', 'Doe', 10000.10, to_date('01-01-2001','dd-mm-yyyy'));
|
||||||
|
INSERT INTO employee_legacy (first_name,last_name,salary,hired_date) VALUES ('Kevin', 'Smith', 20000.20, to_date('02-02-2002','dd-mm-yyyy'));
|
||||||
|
INSERT INTO employee_legacy (first_name,last_name,salary,hired_date) VALUES ('Kim', 'Smith', 30000.30, to_date('03-03-2003','dd-mm-yyyy'));
|
||||||
|
INSERT INTO employee_legacy (first_name,last_name,salary,hired_date) VALUES ('Stephen', 'Torvalds', 40000.40, to_date('04-04-2004','dd-mm-yyyy'));
|
||||||
|
INSERT INTO employee_legacy (first_name,last_name,salary,hired_date) VALUES ('Christian', 'Reynolds', 50000.50, to_date('05-05-2005','dd-mm-yyyy'));
|
||||||
|
|
||||||
|
INSERT INTO email (employeeid,address) VALUES (1, 'john@baeldung.com');
|
||||||
|
INSERT INTO email (employeeid,address) VALUES (1, 'john@gmail.com');
|
||||||
|
INSERT INTO email (employeeid,address) VALUES (2, 'kevin@baeldung.com');
|
||||||
|
INSERT INTO email (employeeid,address) VALUES (3, 'kim@baeldung.com');
|
||||||
|
INSERT INTO email (employeeid,address) VALUES (3, 'kim@gmail.com');
|
||||||
|
INSERT INTO email (employeeid,address) VALUES (3, 'kim@outlook.com');
|
||||||
|
INSERT INTO email (employeeid,address) VALUES (4, 'stephen@baeldung.com');
|
||||||
|
INSERT INTO email (employeeid,address) VALUES (5, 'christian@gmail.com');
|
Loading…
Reference in New Issue