diff --git a/.gitignore b/.gitignore
index 6bc0bfa..d1f7f0c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,3 +1,4 @@
+Secrets.java
# Created by https://www.gitignore.io/api/intellij
# Edit at https://www.gitignore.io/?templates=intellij
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index f006a55..9067f44 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -7,6 +7,7 @@
+
diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml
new file mode 100644
index 0000000..1ed1051
--- /dev/null
+++ b/.idea/dataSources.xml
@@ -0,0 +1,19 @@
+
+
+
+
+ mysql
+ true
+ com.mysql.jdbc.Driver
+ jdbc:mysql://localhost:3306/JdbcLabSchema
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..94a25f7
--- /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..fa5e266 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,5 +14,15 @@
junit
4.10
+
+ com.h2database
+ h2
+ 1.4.197
+
+
+ mysql
+ mysql-connector-java
+ 8.0.18
+
\ No newline at end of file
diff --git a/src/main/java/MainApp.java b/src/main/java/MainApp.java
new file mode 100644
index 0000000..b23c870
--- /dev/null
+++ b/src/main/java/MainApp.java
@@ -0,0 +1,12 @@
+import daos.UserDao;
+import models.User;
+
+public class MainApp {
+ public static void main(String... args) {
+ UserDao userDao = new UserDao();
+// User user = userDao.findById(3);
+// userDao.delete(13);
+// userDao.delete(14);
+// System.out.println(user.toString());
+ }
+}
diff --git a/src/main/java/daos/ConnectionFactory.java b/src/main/java/daos/ConnectionFactory.java
new file mode 100644
index 0000000..8f32ad0
--- /dev/null
+++ b/src/main/java/daos/ConnectionFactory.java
@@ -0,0 +1,27 @@
+package daos;
+
+import com.mysql.cj.jdbc.Driver;
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+public class ConnectionFactory {
+ private static final String URL = Secrets.getURL();
+ private static final String USER = Secrets.getUSER();
+ private static final String PASS = Secrets.getPASS();
+
+
+ public static Connection getConnection()
+ {
+ try {
+ DriverManager.registerDriver(new Driver());
+ return DriverManager.getConnection(URL, USER, PASS);
+ } catch (SQLException ex) {
+ throw new RuntimeException("Error connecting to the database", ex);
+ }
+ }
+// public static void main(String[] args) {
+// Connection connection = ConnectionFactory.getConnection();
+// }
+}
+
diff --git a/src/main/java/daos/DAO.java b/src/main/java/daos/DAO.java
new file mode 100644
index 0000000..c2d4cf0
--- /dev/null
+++ b/src/main/java/daos/DAO.java
@@ -0,0 +1,12 @@
+package daos;
+
+
+import java.util.Set;
+
+public interface DAO {
+ E findById(Integer id);
+ Set findAll();
+ Boolean insert(E obj);
+ Boolean update(Integer id, E obj);
+ Boolean delete(Integer id);
+}
diff --git a/src/main/java/daos/DTO.java b/src/main/java/daos/DTO.java
new file mode 100644
index 0000000..499279a
--- /dev/null
+++ b/src/main/java/daos/DTO.java
@@ -0,0 +1,5 @@
+package daos;
+
+public interface DTO {
+ Integer getId(T obj);
+}
diff --git a/src/main/java/daos/UserDao.java b/src/main/java/daos/UserDao.java
new file mode 100644
index 0000000..3c685cd
--- /dev/null
+++ b/src/main/java/daos/UserDao.java
@@ -0,0 +1,109 @@
+package daos;
+
+import models.User;
+
+import java.sql.*;
+import java.util.HashSet;
+import java.util.Set;
+
+public class UserDao implements DAO {
+
+ public User findById(Integer id) {
+ Connection connection = ConnectionFactory.getConnection();
+
+ try {
+ String query = "SELECT * FROM Users WHERE id = " + id + ";";
+ Statement statement = connection.createStatement();
+ ResultSet resultSet = statement.executeQuery(query);
+
+ if (resultSet.next()) return extractUserFromResultSet(resultSet);
+
+ } catch(SQLException e) {
+ e.printStackTrace();
+ }
+
+ return null;
+ }
+
+ public Set findAll() {
+ Connection connection = ConnectionFactory.getConnection();
+ try {
+ Statement statement = connection.createStatement();
+ ResultSet resultSet = statement.executeQuery("SELECT * FROM Users;");
+ Set users = new HashSet();
+ while(resultSet.next())
+ {
+ User user = extractUserFromResultSet(resultSet);
+ users.add(user);
+ }
+ return users;
+ } catch (SQLException ex) {
+ ex.printStackTrace();
+ }
+ return null;
+ }
+
+ public Boolean insert(User user) {
+ Connection connection = ConnectionFactory.getConnection();
+ try {
+ PreparedStatement ps = connection.prepareStatement("INSERT INTO Users VALUES (NULL, ?, ?, ?, ?, ?);");
+ ps = prepareUserForImport(ps, user);
+
+ int i = ps.executeUpdate();
+ if(i == 1) return true;
+
+ } catch (SQLException ex) {
+ ex.printStackTrace();
+ }
+ return false;
+ }
+
+ public Boolean update(Integer id, User user) {
+ Connection connection = ConnectionFactory.getConnection();
+ try {
+ PreparedStatement ps = connection.prepareStatement("UPDATE Users SET first_name=?, last_name=?, fav_color=?, job=?, birthdate=? WHERE id=?;");
+ ps = prepareUserForImport(ps, user);
+ ps.setInt(6, id);
+
+ int i = ps.executeUpdate();
+ if(i == 1) return true;
+ } catch (SQLException ex) {
+ ex.printStackTrace();
+ }
+ return false;
+ }
+
+ public Boolean delete(Integer id) {
+ Connection connection = ConnectionFactory.getConnection();
+ try {
+ Statement statement = connection.createStatement();
+ int i = statement.executeUpdate("DELETE FROM Users WHERE id=" + id + ";");
+ if(i == 1) {
+ return true;
+ }
+ } catch (SQLException ex) {
+ ex.printStackTrace();
+ }
+ return false;
+ }
+
+ private User extractUserFromResultSet(ResultSet rs) throws SQLException {
+ User user = new User();
+ user.setId( rs.getInt("id") );
+ user.setFirstName( rs.getString("first_name") );
+ user.setLastName( rs.getString("last_name") );
+ user.setFavColor( rs.getString("fav_color") );
+ user.setJob( rs.getString("job") );
+ user.setBirthday( rs.getDate("birthdate") );
+ return user;
+ }
+
+ private PreparedStatement prepareUserForImport(PreparedStatement ps, User user) throws SQLException {
+ ps.setString(1, user.getFirstName());
+ ps.setString(2, user.getLastName());
+ ps.setString(3, user.getFavColor());
+ ps.setString(4, user.getJob());
+ ps.setDate(5, new java.sql.Date(user.getBirthday().getTime()));
+ return ps;
+ }
+}
diff --git a/src/main/java/daos/UserDto.java b/src/main/java/daos/UserDto.java
new file mode 100644
index 0000000..73be789
--- /dev/null
+++ b/src/main/java/daos/UserDto.java
@@ -0,0 +1,25 @@
+package daos;
+
+import models.User;
+
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+
+public class UserDto implements DTO {
+ public Integer getId(User user) {
+ return user.getId();
+ }
+ public static Integer getLastIdOfLast() {
+ Connection connection = ConnectionFactory.getConnection();
+ try {
+ Statement statement = connection.createStatement();
+ ResultSet resultSet = statement.executeQuery("SELECT id FROM Users ORDER BY id DESC LIMIT 1;");
+ if (resultSet.next()) return resultSet.getInt("id");
+ } catch (SQLException ex) {
+ ex.printStackTrace();
+ }
+ return null;
+ }
+}
diff --git a/src/main/java/models/User.java b/src/main/java/models/User.java
new file mode 100644
index 0000000..ccf510f
--- /dev/null
+++ b/src/main/java/models/User.java
@@ -0,0 +1,85 @@
+package models;
+
+import java.util.Date;
+
+public class User {
+ private Integer id;
+ private String firstName;
+ private String lastName;
+ private String favColor;
+ private Date birthday;
+ private String job;
+
+ public User() {}
+
+ public User(String firstName, String lastName, String favColor, Date birthday, String job) {
+ this.firstName = firstName;
+ this.lastName = lastName;
+ this.favColor = favColor;
+ this.birthday = birthday;
+ this.job = job;
+ }
+
+ public User(Integer id, String firstName, String lastName, String favColor, Date birthday, String job) {
+ this.id = id;
+ this.firstName = firstName;
+ this.lastName = lastName;
+ this.favColor = favColor;
+ this.birthday = birthday;
+ this.job = job;
+ }
+
+ 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 String getFavColor() {
+ return favColor;
+ }
+
+ public void setFavColor(String favColor) {
+ this.favColor = favColor;
+ }
+
+ public Date getBirthday() {
+ return birthday;
+ }
+
+ public void setBirthday(Date birthday) {
+ this.birthday = birthday;
+ }
+
+ public String getJob() {
+ return job;
+ }
+
+ public void setJob(String job) {
+ this.job = job;
+ }
+
+ @Override
+ public String toString() {
+ return String.format("%s %s\t|\t%s\t|\t%s\t|\t%s",
+ this.getFirstName(), this.getLastName(), this.getFavColor(), this.getJob(), this.getBirthday());
+ }
+}
diff --git a/src/test/java/daos/TestConnectionFactory.java b/src/test/java/daos/TestConnectionFactory.java
new file mode 100644
index 0000000..a966a7d
--- /dev/null
+++ b/src/test/java/daos/TestConnectionFactory.java
@@ -0,0 +1,17 @@
+package daos;
+
+import org.junit.Test;
+
+import static org.junit.Assert.fail;
+
+public class TestConnectionFactory {
+ @Test
+ public void testGetConnection() {
+ try {
+ ConnectionFactory.getConnection();
+ } catch( RuntimeException rte) {
+ fail("Could not connect to MySQL database");
+ }
+
+ }
+}
diff --git a/src/test/java/daos/TestUserDao.java b/src/test/java/daos/TestUserDao.java
new file mode 100644
index 0000000..4847d2e
--- /dev/null
+++ b/src/test/java/daos/TestUserDao.java
@@ -0,0 +1,65 @@
+package daos;
+
+import models.User;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.sql.Connection;
+import java.util.Date;
+
+public class TestUserDao {
+ UserDao userDao = new UserDao();
+ User user1 = new User("testy","test","testeroon", new Date(2000,12,25), "tester");
+ User user2 = new User("Mr. Testy","Test","testeroon", new Date(1900,12,25), "tester");
+
+
+
+ @Test
+ public void testFindById() {
+ String actual = userDao.findById(1).toString();
+ String expected = "Wes Jones\t|\tblue\t|\tzipcoder\t|\t1997-08-05";
+ Assert.assertEquals(expected, actual);
+ }
+
+ @Test
+ public void testFindAll() {
+ Integer actual = userDao.findAll().size();
+ Integer expected = 6;
+ Assert.assertEquals(expected, actual);
+ }
+
+ @Test
+ public void testInsert() {
+ Assert.assertTrue(userDao.insert(user1));
+ Integer id = lastId();
+ String actual = userDao.findById(id).toString();
+ String expected = "testy test\t|\ttesteroon\t|\ttester\t|\t3901-01-25";
+ Assert.assertEquals(expected, actual);
+ userDao.delete(id);
+
+ }
+
+ @Test
+ public void testUpdate() {
+ Assert.assertTrue(userDao.insert(user1));
+ Integer id = lastId();
+ userDao.update(id, user2);
+ String actual = userDao.findById(id).toString();
+ String expected = "Mr. Testy Test\t|\ttesteroon\t|\ttester\t|\t3801-01-25";
+ Assert.assertEquals(expected, actual);
+ userDao.delete(id);
+ }
+
+ @Test
+ public void testDelete() {
+ Assert.assertTrue(userDao.insert(user1));
+ Integer id = lastId();
+ Assert.assertTrue(userDao.delete(id));
+ Assert.assertEquals(6, userDao.findAll().size());
+ }
+
+ private Integer lastId() {
+ return UserDto.getLastIdOfLast();
+ }
+}
diff --git a/target/classes/MainApp.class b/target/classes/MainApp.class
new file mode 100644
index 0000000..69e6e8f
Binary files /dev/null and b/target/classes/MainApp.class differ
diff --git a/target/classes/daos/ConnectionFactory.class b/target/classes/daos/ConnectionFactory.class
new file mode 100644
index 0000000..df10136
Binary files /dev/null and b/target/classes/daos/ConnectionFactory.class differ
diff --git a/target/classes/daos/DAO.class b/target/classes/daos/DAO.class
new file mode 100644
index 0000000..96d58c4
Binary files /dev/null and b/target/classes/daos/DAO.class differ
diff --git a/target/classes/daos/DTO.class b/target/classes/daos/DTO.class
new file mode 100644
index 0000000..5f8b1b2
Binary files /dev/null and b/target/classes/daos/DTO.class differ
diff --git a/target/classes/daos/UserDao.class b/target/classes/daos/UserDao.class
new file mode 100644
index 0000000..f756fb0
Binary files /dev/null and b/target/classes/daos/UserDao.class differ
diff --git a/target/classes/daos/UserDto.class b/target/classes/daos/UserDto.class
new file mode 100644
index 0000000..6501e5e
Binary files /dev/null and b/target/classes/daos/UserDto.class differ
diff --git a/target/classes/models/User.class b/target/classes/models/User.class
new file mode 100644
index 0000000..283171f
Binary files /dev/null and b/target/classes/models/User.class differ
diff --git a/target/test-classes/daos/TestConnectionFactory.class b/target/test-classes/daos/TestConnectionFactory.class
new file mode 100644
index 0000000..d30c4a6
Binary files /dev/null and b/target/test-classes/daos/TestConnectionFactory.class differ
diff --git a/target/test-classes/daos/TestUserDao.class b/target/test-classes/daos/TestUserDao.class
new file mode 100644
index 0000000..92eaa5e
Binary files /dev/null and b/target/test-classes/daos/TestUserDao.class differ