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