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