diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index f006a55..5a76f28 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -6,6 +6,7 @@
+
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 0000000..712ab9d
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index d97c43d..3762cfe 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,15 +4,40 @@
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
4.0.0
- com.zipcoder.lab
- jdbcdao
+ org.example
+ intro-to-jdbc
1.0-SNAPSHOT
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+ 3.6.0
+
+ 1.8
+ 1.8
+
+
+
+
-
-
- junit
- junit
- 4.10
-
-
+
+
+
+ com.fasterxml.jackson.core
+ jackson-databind
+ 2.12.3
+
+
+ mysql
+ mysql-connector-java
+ 8.0.18
+
+
+ junit
+ junit
+ RELEASE
+ test
+
+
\ No newline at end of file
diff --git a/src/main/java/MainApplication.java b/src/main/java/MainApplication.java
new file mode 100644
index 0000000..f5455b9
--- /dev/null
+++ b/src/main/java/MainApplication.java
@@ -0,0 +1,44 @@
+import com.mysql.cj.jdbc.Driver;
+import daos.Engine;
+import daos.PhoneRepository;
+import models.Phone;
+
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.StringJoiner;
+
+/**
+ * @author git-leon
+ * @version 1.0.0
+ * @date 8/2/21 9:49 AM
+ */
+public class MainApplication {
+
+ public static void main(String[] args) {
+ Engine engine = new Engine();
+ engine.registerJDBCDriver();
+ Connection mysqlDbConnection = engine.getConnection("mysql");
+ PhoneRepository phoneRepository = new PhoneRepository(mysqlDbConnection);
+ engine.executeStatement(mysqlDbConnection, "DROP DATABASE IF EXISTS walmart;");
+ engine.executeStatement(mysqlDbConnection, "CREATE DATABASE IF NOT EXISTS walmart;");
+ engine.executeStatement(mysqlDbConnection, "USE walmart;");
+ engine.executeStatement(mysqlDbConnection, new StringBuilder()
+ .append("CREATE TABLE IF NOT EXISTS walmart.phone(")
+ .append("id int auto_increment primary key,")
+ .append("name text not null,")
+ .append("color varchar(30) not null,")
+ .append("carrier varchar(30),")
+ .append("cameras int,")
+ .append("price int not null);")
+ .toString());
+
+ phoneRepository.create(new Phone(20, "ePhone", "'blue'", "'sprint'",3, 425.0));
+ phoneRepository.create(new Phone(21, "strawberry", "'red'", "'tmobile'", 3, 599.0));
+ System.out.println(phoneRepository.readAll());
+
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/daos/Engine.java b/src/main/java/daos/Engine.java
new file mode 100644
index 0000000..c9c4f64
--- /dev/null
+++ b/src/main/java/daos/Engine.java
@@ -0,0 +1,89 @@
+package daos;
+
+import com.mysql.cj.jdbc.Driver;
+
+import java.sql.*;
+import java.util.StringJoiner;
+
+public class Engine {
+
+ public Engine() {
+ }
+
+ public void registerJDBCDriver() {
+ // Attempt to register JDBC Driver
+ try {
+ DriverManager.registerDriver(Driver.class.newInstance());
+ } catch (InstantiationException | IllegalAccessException | SQLException e1) {
+ throw new RuntimeException(e1);
+ }
+ }
+
+ public Connection getConnection(String dbVendor) {
+ String username = "nathan";
+ String password = "greenLeaf1";
+ String url = new StringBuilder()
+ .append("jdbc:")
+ .append(dbVendor)
+ .append("://127.0.0.1/")
+ .append("?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC")
+ .toString();
+ try {
+ return DriverManager.getConnection(url, username, password);
+ } catch (SQLException e) {
+ throw new Error(e);
+ }
+ }
+
+ static Statement getScrollableStatement(Connection connection) {
+ int resultSetType = ResultSet.TYPE_SCROLL_INSENSITIVE;
+ int resultSetConcurrency = ResultSet.CONCUR_READ_ONLY;
+ try { // scrollable statements can be iterated more than once without closing
+ return connection.createStatement(resultSetType, resultSetConcurrency);
+ } catch (SQLException e) {
+ throw new Error(e);
+ }
+ }
+
+ public void executeStatement(Connection connection, String sqlStatement) {
+ try {
+ Statement statement = getScrollableStatement(connection);
+ statement.execute(sqlStatement);
+ } catch (SQLException e) {
+ throw new Error(e);
+ }
+ }
+
+ static void printResults(ResultSet resultSet) {
+ try {
+ for (int rowNumber = 0; resultSet.next(); rowNumber++) {
+ String firstColumnData = resultSet.getString(1);
+ String secondColumnData = resultSet.getString(2);
+ String thirdColumnData = resultSet.getString(3);
+ String forthColumnData = resultSet.getString(4);
+ String fifthColumnData = resultSet.getString(5);
+ String sixthColumnData = resultSet.getString(6);
+ System.out.println(new StringJoiner("\n")
+ .add("Row number = " + rowNumber)
+ .add("First Column = " + firstColumnData)
+ .add("Second Column = " + secondColumnData)
+ .add("Third column = " + thirdColumnData)
+ .add("Forth column = " + forthColumnData)
+ .add("Fifth column = " + fifthColumnData)
+ .add("Sixth column = " + sixthColumnData));
+ }
+ } catch (SQLException e) {
+ throw new Error(e);
+ }
+ }
+
+ public ResultSet executeQuery(Connection connection, String sqlQuery) {
+ try {
+ Statement statement = getScrollableStatement(connection);
+ return statement.executeQuery(sqlQuery);
+ } catch (SQLException e) {
+ throw new Error(e);
+ }
+ }
+
+}
diff --git a/src/main/java/daos/PhoneRepository.java b/src/main/java/daos/PhoneRepository.java
new file mode 100644
index 0000000..260eb80
--- /dev/null
+++ b/src/main/java/daos/PhoneRepository.java
@@ -0,0 +1,96 @@
+package daos;
+
+import models.Phone;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author git-leon
+ * @version 1.0.0
+ * @date 8/4/21 3:05 PM
+ */
+public class PhoneRepository implements Repo {
+ private Connection connection;
+
+ public PhoneRepository(Connection connection) {
+ this.connection = connection;
+ }
+
+ @Override
+ public Connection getConnection() {
+ return connection;
+ }
+
+ public void create(Phone phone) {
+ executeStatement(String.format(new StringBuilder()
+ .append("INSERT INTO walmart.phone(")
+ .append("id, name, color, carrier, cameras, price)")
+ .append("VALUES (%s, '%s', %s, %s, %s, %s);")
+ .toString(),
+ phone.getId(),
+ phone.getName(),
+ phone.getColor(),
+ phone.getCarrier(),
+ phone.getCameras(),
+ phone.getPrice()));
+ }
+
+ public List readAll() {
+ ResultSet resultSet = executeQuery("SELECT * FROM walmart.phone;");
+ List list = new ArrayList<>();
+ try {
+ while (resultSet.next()) {
+ String id = resultSet.getString(1);
+ String name = resultSet.getString(2);
+ String color = resultSet.getString(3);
+ String carrier = resultSet.getString(4);
+ Integer cameras = resultSet.getInt(5);
+ Double price = resultSet.getDouble(6);
+ list.add(new Phone(
+ Integer.parseInt(id),
+ name,
+ color,
+ carrier,
+ cameras,
+ price));
+ }
+ } catch (SQLException throwables) {
+ throw new RuntimeException(throwables);
+ }
+ return list;
+ }
+
+ public Phone read(Integer phoneId) {
+ return readAll()
+ .stream()
+ .filter(phone -> phone.getId() == phoneId)
+ .findAny()
+ .get();
+ }
+
+ public void update(Integer id, Phone newPhone) {
+ executeStatement(new StringBuilder()
+ .append("UPDATE phone SET ")
+ .append("name = '" + newPhone.getName() + "'")
+ .append(", color = " + newPhone.getColor())
+ .append(", carrier = " + newPhone.getCarrier())
+ .append(", cameras = " + newPhone.getCameras().toString())
+ .append(", price = " + newPhone.getPrice().toString())
+ .append("WHERE id =" + id.toString()).toString());
+ }
+
+ public void delete(Integer id) {
+ executeStatement("DELETE FROM phone WHERE id = " + id.toString());
+ }
+
+ public void delete(Phone phone) {
+ executeStatement("DELETE FROM phone WHERE id = " + phone.getId().toString());
+ }
+
+
+
+}
\ No newline at end of file
diff --git a/src/main/java/daos/Repo.java b/src/main/java/daos/Repo.java
new file mode 100644
index 0000000..0e3340a
--- /dev/null
+++ b/src/main/java/daos/Repo.java
@@ -0,0 +1,45 @@
+package daos;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+/**
+ * @author git-leon
+ * @version 1.0.0
+ * @date 8/4/21 3:15 PM
+ */
+public interface Repo {
+ default void executeStatement(String sqlStatement) {
+ try {
+ Statement statement = getScrollableStatement();
+ statement.execute(sqlStatement);
+ } catch (SQLException e) {
+ throw new Error(e);
+ }
+ }
+
+ default Statement getScrollableStatement() {
+ int resultSetType = ResultSet.TYPE_SCROLL_INSENSITIVE;
+ int resultSetConcurrency = ResultSet.CONCUR_READ_ONLY;
+ try { // scrollable statements can be iterated more than once without closing
+ return getConnection().createStatement(resultSetType, resultSetConcurrency);
+ } catch (SQLException e) {
+ throw new Error(e);
+ }
+ }
+
+ default ResultSet executeQuery(String sqlQuery) {
+ try {
+ Statement statement = getScrollableStatement();
+ return statement.executeQuery(sqlQuery);
+ } catch (SQLException e) {
+ throw new Error(e);
+ }
+ }
+
+ Connection getConnection();
+}
+
+
diff --git a/src/main/java/models/Phone.java b/src/main/java/models/Phone.java
new file mode 100644
index 0000000..2715c69
--- /dev/null
+++ b/src/main/java/models/Phone.java
@@ -0,0 +1,92 @@
+package models;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+public class Phone {
+
+ private Integer id;
+ private String name;
+ private String color;
+ private String carrier;
+ private Integer cameras;
+ private Double price;
+
+ public Phone() {
+ }
+
+ public Phone(Integer id, String name, String color, String carrier, Integer cameras, Double price) {
+ this.id = id;
+ this.name = name;
+ this.color = color;
+ this.carrier = carrier;
+ this.cameras = cameras;
+ this.price = price;
+ }
+
+
+ public Integer getId() {
+ return id;
+ }
+
+ public void setId(int id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getColor() {
+ return color;
+ }
+
+ public void setColor(String color) {
+ this.color = color;
+ }
+
+ public String getCarrier() {
+ return carrier;
+ }
+
+ public void setCarrier(String carrier) {
+ this.carrier = carrier;
+ }
+
+ public Integer getCameras() {
+ return cameras;
+ }
+
+ public void setCameras(Integer cameras) {
+ this.cameras = cameras;
+ }
+
+ public Double getPrice() {
+ return price;
+ }
+
+ public void setPrice(Double price) {
+ this.price = price;
+ }
+
+ @Override
+ public String toString() {
+ try {
+ return new ObjectMapper().writeValueAsString(this);
+ } catch (JsonProcessingException e) {
+ return "Phone{" +
+ "id=" + id +
+ ", name='" + name + '\'' +
+ ", color=" + color +
+ ", carrier=" + carrier +
+ ", cameras=" + cameras +
+ ", price=" + price +
+ '}';
+ }
+ }
+
+}
diff --git a/src/test/java/daos/PhoneRepositoryTest.java b/src/test/java/daos/PhoneRepositoryTest.java
new file mode 100644
index 0000000..9fd0dc2
--- /dev/null
+++ b/src/test/java/daos/PhoneRepositoryTest.java
@@ -0,0 +1,84 @@
+package daos;
+
+import com.mysql.cj.jdbc.Driver;
+import models.Phone;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.util.NoSuchElementException;
+
+public class PhoneRepositoryTest {
+
+ @Test
+ public void readTest(){
+ //given
+ Engine engine = new Engine();
+ engine.registerJDBCDriver();
+ Connection mysqlDbConnection = engine.getConnection("mysql");
+ PhoneRepository phoneRepository = new PhoneRepository(mysqlDbConnection);
+ engine.executeStatement(mysqlDbConnection, "USE walmart;");
+
+ String expectedName = "FlipidyFlip";
+ phoneRepository.create(new Phone(22, expectedName, "'grey'", "'sprint'", 5, 699.0));
+ //when
+ Phone retrievedPhone = phoneRepository.read(22);
+ String actual = retrievedPhone.getName();
+ //then
+ Assert.assertEquals(expectedName,actual);
+ }
+
+ @Test
+ public void updateTest(){
+ //given
+ Engine engine = new Engine();
+ engine.registerJDBCDriver();
+ Connection mysqlDbConnection = engine.getConnection("mysql");
+ PhoneRepository phoneRepository = new PhoneRepository(mysqlDbConnection);
+ engine.executeStatement(mysqlDbConnection, "USE walmart;");
+ phoneRepository.create(new Phone(31, "UpdateMePhone", "'space_grey'", "'sprint'", 7, 799.0));
+ Phone newPhone = new Phone(31,"GrapeFruit5000","'gold'","'AT&T'",4,999.99 );
+ //when
+ phoneRepository.update(31,newPhone);
+ //then
+ Phone retrievedPhone = phoneRepository.read(31);
+ Assert.assertEquals(newPhone,retrievedPhone);
+ }
+
+ @Test(expected = java.util.NoSuchElementException.class)
+ public void testDelete_byId(){
+ //given
+ Engine engine = new Engine();
+ engine.registerJDBCDriver();
+ Connection mysqlDbConnection = engine.getConnection("mysql");
+ PhoneRepository phoneRepository = new PhoneRepository(mysqlDbConnection);
+ engine.executeStatement(mysqlDbConnection, "USE walmart;");
+ phoneRepository.create(new Phone(55, "yPhone55", "'space_grey'", "'sprint'", 7, 799.0));
+ //when
+ phoneRepository.delete(55);
+ Phone deleted = phoneRepository.read(55);
+ //then
+
+ }
+
+ @Test(expected = java.util.NoSuchElementException.class)
+ public void testDelete_byPhone(){
+ //given
+ Engine engine = new Engine();
+ engine.registerJDBCDriver();
+ Connection mysqlDbConnection = engine.getConnection("mysql");
+ PhoneRepository phoneRepository = new PhoneRepository(mysqlDbConnection);
+ engine.executeStatement(mysqlDbConnection, "USE walmart;");
+ Phone myPhone = new Phone(55, "yPhone55", "'space_grey'", "'sprint'", 7, 799.0);
+ phoneRepository.create(myPhone);
+ //when
+ phoneRepository.delete(myPhone);
+ Phone deleted = phoneRepository.read(55);
+ //then
+
+ }
+
+
+
+}
diff --git a/target/classes/MainApplication.class b/target/classes/MainApplication.class
new file mode 100644
index 0000000..6efbc71
Binary files /dev/null and b/target/classes/MainApplication.class differ
diff --git a/target/classes/daos/Engine.class b/target/classes/daos/Engine.class
new file mode 100644
index 0000000..e5fb764
Binary files /dev/null and b/target/classes/daos/Engine.class differ
diff --git a/target/classes/daos/PhoneRepository.class b/target/classes/daos/PhoneRepository.class
new file mode 100644
index 0000000..9bcbedf
Binary files /dev/null and b/target/classes/daos/PhoneRepository.class differ
diff --git a/target/classes/daos/Repo.class b/target/classes/daos/Repo.class
new file mode 100644
index 0000000..97016f8
Binary files /dev/null and b/target/classes/daos/Repo.class differ
diff --git a/target/classes/models/Phone.class b/target/classes/models/Phone.class
new file mode 100644
index 0000000..570adc2
Binary files /dev/null and b/target/classes/models/Phone.class differ
diff --git a/target/test-classes/daos/PhoneRepositoryTest.class b/target/test-classes/daos/PhoneRepositoryTest.class
new file mode 100644
index 0000000..3ade699
Binary files /dev/null and b/target/test-classes/daos/PhoneRepositoryTest.class differ