| 
20 | 20 |  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN  | 
21 | 21 |  * THE SOFTWARE.  | 
22 | 22 |  */  | 
 | 23 | + | 
23 | 24 | package com.iluwatar.dao;  | 
24 | 25 | 
 
  | 
 | 26 | +import java.sql.Connection;  | 
 | 27 | +import java.sql.SQLException;  | 
 | 28 | +import java.sql.Statement;  | 
25 | 29 | import java.util.ArrayList;  | 
26 | 30 | import java.util.List;  | 
 | 31 | +import java.util.stream.Stream;  | 
 | 32 | + | 
 | 33 | +import javax.sql.DataSource;  | 
27 | 34 | 
 
  | 
28 | 35 | import org.apache.log4j.Logger;  | 
 | 36 | +import org.h2.jdbcx.JdbcDataSource;  | 
29 | 37 | 
 
  | 
30 | 38 | /**  | 
31 |  | - *   | 
32 | 39 |  * Data Access Object (DAO) is an object that provides an abstract interface to some type of  | 
33 | 40 |  * database or other persistence mechanism. By mapping application calls to the persistence layer,  | 
34 | 41 |  * DAO provide some specific data operations without exposing details of the database. This  | 
35 | 42 |  * isolation supports the Single responsibility principle. It separates what data accesses the  | 
36 | 43 |  * application needs, in terms of domain-specific objects and data types (the public interface of  | 
37 | 44 |  * the DAO), from how these needs can be satisfied with a specific DBMS.  | 
38 |  | - * <p>  | 
39 |  | - * With the DAO pattern, we can use various method calls to retrieve/add/delete/update data without  | 
40 |  | - * directly interacting with the data. The below example demonstrates basic CRUD operations: select,  | 
41 |  | - * add, update, and delete.  | 
 | 45 | + *  | 
 | 46 | + * <p>With the DAO pattern, we can use various method calls to retrieve/add/delete/update data   | 
 | 47 | + * without directly interacting with the data source. The below example demonstrates basic CRUD   | 
 | 48 | + * operations: select, add, update, and delete.  | 
 | 49 | + *   | 
42 | 50 |  *   | 
43 | 51 |  */  | 
44 | 52 | public class App {  | 
45 |  | - | 
 | 53 | +  private static final String DB_URL = "jdbc:h2:~/dao:customerdb";  | 
46 | 54 |   private static Logger log = Logger.getLogger(App.class);  | 
47 |  | - | 
 | 55 | +    | 
48 | 56 |   /**  | 
49 | 57 |    * Program entry point.  | 
50 | 58 |    *   | 
51 | 59 |    * @param args command line args.  | 
 | 60 | +   * @throws Exception if any error occurs.   | 
52 | 61 |    */  | 
53 |  | -  public static void main(final String[] args) {  | 
54 |  | -    final CustomerDao customerDao = new CustomerDaoImpl(generateSampleCustomers());  | 
55 |  | -    log.info("customerDao.getAllCustomers(): " + customerDao.getAllCustomers());  | 
56 |  | -    log.info("customerDao.getCusterById(2): " + customerDao.getCustomerById(2));  | 
 | 62 | +  public static void main(final String[] args) throws Exception {  | 
 | 63 | +    final CustomerDao inMemoryDao = new InMemoryCustomerDao();  | 
 | 64 | +    performOperationsUsing(inMemoryDao);  | 
 | 65 | +      | 
 | 66 | +    final DataSource dataSource = createDataSource();  | 
 | 67 | +    createSchema(dataSource);  | 
 | 68 | +    final CustomerDao dbDao = new DbCustomerDao(dataSource);  | 
 | 69 | +    performOperationsUsing(dbDao);  | 
 | 70 | +    deleteSchema(dataSource);  | 
 | 71 | +  }  | 
 | 72 | + | 
 | 73 | +  private static void deleteSchema(DataSource dataSource) throws SQLException {  | 
 | 74 | +    try (Connection connection = dataSource.getConnection();  | 
 | 75 | +        Statement statement = connection.createStatement()) {  | 
 | 76 | +      statement.execute(CustomerSchemaSql.DELETE_SCHEMA_SQL);  | 
 | 77 | +    }  | 
 | 78 | +  }  | 
 | 79 | + | 
 | 80 | +  private static void createSchema(DataSource dataSource) throws SQLException {  | 
 | 81 | +    try (Connection connection = dataSource.getConnection();  | 
 | 82 | +        Statement statement = connection.createStatement()) {  | 
 | 83 | +      statement.execute(CustomerSchemaSql.CREATE_SCHEMA_SQL);  | 
 | 84 | +    }  | 
 | 85 | +  }  | 
 | 86 | + | 
 | 87 | +  private static DataSource createDataSource() {  | 
 | 88 | +    JdbcDataSource dataSource = new JdbcDataSource();  | 
 | 89 | +    dataSource.setURL(DB_URL);  | 
 | 90 | +    return dataSource;  | 
 | 91 | +  }  | 
 | 92 | + | 
 | 93 | +  private static void performOperationsUsing(final CustomerDao customerDao) throws Exception {  | 
 | 94 | +    addCustomers(customerDao);  | 
 | 95 | +    log.info("customerDao.getAllCustomers(): ");  | 
 | 96 | +    try (Stream<Customer> customerStream = customerDao.getAll()) {  | 
 | 97 | +      customerStream.forEach((customer) -> log.info(customer));  | 
 | 98 | +    }  | 
 | 99 | +    log.info("customerDao.getCustomerById(2): " + customerDao.getById(2));  | 
57 | 100 |     final Customer customer = new Customer(4, "Dan", "Danson");  | 
58 |  | -    customerDao.addCustomer(customer);  | 
59 |  | -    log.info("customerDao.getAllCustomers(): " + customerDao.getAllCustomers());  | 
 | 101 | +    customerDao.add(customer);  | 
 | 102 | +    log.info("customerDao.getAllCustomers(): " + customerDao.getAll());  | 
60 | 103 |     customer.setFirstName("Daniel");  | 
61 | 104 |     customer.setLastName("Danielson");  | 
62 |  | -    customerDao.updateCustomer(customer);  | 
63 |  | -    log.info("customerDao.getAllCustomers(): " + customerDao.getAllCustomers());  | 
64 |  | -    customerDao.deleteCustomer(customer);  | 
65 |  | -    log.info("customerDao.getAllCustomers(): " + customerDao.getAllCustomers());  | 
 | 105 | +    customerDao.update(customer);  | 
 | 106 | +    log.info("customerDao.getAllCustomers(): ");  | 
 | 107 | +    try (Stream<Customer> customerStream = customerDao.getAll()) {  | 
 | 108 | +      customerStream.forEach((cust) -> log.info(cust));  | 
 | 109 | +    }  | 
 | 110 | +    customerDao.delete(customer);  | 
 | 111 | +    log.info("customerDao.getAllCustomers(): " + customerDao.getAll());  | 
 | 112 | +  }  | 
 | 113 | + | 
 | 114 | +  private static void addCustomers(CustomerDao customerDao) throws Exception {  | 
 | 115 | +    for (Customer customer : generateSampleCustomers()) {  | 
 | 116 | +      customerDao.add(customer);  | 
 | 117 | +    }  | 
66 | 118 |   }  | 
67 | 119 | 
 
  | 
68 | 120 |   /**  | 
 | 
0 commit comments