diff --git a/pom.xml b/pom.xml index 0605a4c0..57065979 100644 --- a/pom.xml +++ b/pom.xml @@ -13,8 +13,8 @@ org.apache.maven.plugins maven-compiler-plugin - 7 - 7 + 15 + 15 @@ -33,7 +33,13 @@ mysql mysql-connector-java - 5.1.38 + 8.0.26 + + + + org.postgresql + postgresql + 42.2.23 @@ -45,7 +51,7 @@ org.hibernate hibernate-core - 4.3.10.Final + 5.5.8.Final diff --git a/src/main/java/jm/task/core/jdbc/Main.java b/src/main/java/jm/task/core/jdbc/Main.java index f6e43b0f..ed2c81ea 100644 --- a/src/main/java/jm/task/core/jdbc/Main.java +++ b/src/main/java/jm/task/core/jdbc/Main.java @@ -1,7 +1,15 @@ package jm.task.core.jdbc; +import jm.task.core.jdbc.service.UserService; +import jm.task.core.jdbc.service.UserServiceImpl; +import java.sql.SQLException; + public class Main { - public static void main(String[] args) { + public static void main(String[] args) throws SQLException { // реализуйте алгоритм здесь + UserService userService = new UserServiceImpl(); + +// userService.createUsersTable(); + userService.dropUsersTable(); } } diff --git a/src/main/java/jm/task/core/jdbc/dao/UserDaoHibernateImpl.java b/src/main/java/jm/task/core/jdbc/dao/UserDaoHibernateImpl.java index dc2d0636..59c1e124 100644 --- a/src/main/java/jm/task/core/jdbc/dao/UserDaoHibernateImpl.java +++ b/src/main/java/jm/task/core/jdbc/dao/UserDaoHibernateImpl.java @@ -1,42 +1,124 @@ package jm.task.core.jdbc.dao; import jm.task.core.jdbc.model.User; - +import jm.task.core.jdbc.util.Util; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.Transaction; import java.util.List; public class UserDaoHibernateImpl implements UserDao { - public UserDaoHibernateImpl() { - } + private SessionFactory sessionFactory; + public UserDaoHibernateImpl() { + sessionFactory = Util.getSessionFactory(); + } @Override public void createUsersTable() { - + Session session = sessionFactory.openSession(); + Transaction transaction = null; + try { + transaction = session.beginTransaction(); + session.createSQLQuery(UserDaoJDBCImpl.CREATE_TABLE).executeUpdate(); + transaction.commit(); + } catch (RuntimeException e) { + if (transaction != null) { + transaction.rollback(); + } + } finally { + session.close(); + } } @Override public void dropUsersTable() { - + Session session = sessionFactory.openSession(); + Transaction transaction = null; + try { + transaction = session.beginTransaction(); + session.createSQLQuery(UserDaoJDBCImpl.DROP_TABLE).executeUpdate(); + transaction.commit(); + } catch (RuntimeException e) { + if (transaction != null) { + transaction.rollback(); + } + } finally { + session.close(); + } } @Override public void saveUser(String name, String lastName, byte age) { - + Session session = sessionFactory.openSession(); + Transaction transaction = null; + try { + transaction = session.beginTransaction(); + session.save(new User(name, lastName, age)); + transaction.commit(); + } catch (RuntimeException e) { + if (transaction != null) { + transaction.rollback(); + } + } finally { + session.close(); + } } @Override public void removeUserById(long id) { - + Session session = sessionFactory.openSession(); + Transaction transaction = null; + try { + transaction = session.beginTransaction(); + User user = session.get(User.class, id); + session.delete(user); + transaction.commit(); + } catch (RuntimeException e) { + if (transaction != null) { + transaction.rollback(); + } + } finally { + session.close(); + } } @Override public List getAllUsers() { - return null; + Session session = sessionFactory.openSession(); + Transaction transaction = null; + List users; + try { + transaction = session.beginTransaction(); + String hql = "FROM User"; + users = session.createQuery(hql).list(); + return users; + } catch (RuntimeException e) { + if (transaction != null) { + transaction.rollback(); + } + throw e; + } finally { + session.close(); + } } @Override public void cleanUsersTable() { - + Session session = sessionFactory.openSession(); + Transaction transaction = null; + try { + transaction = session.beginTransaction(); + String hql = "DELETE FROM User"; + session.createQuery(hql).executeUpdate(); + transaction.commit(); + } catch (RuntimeException e) { + if (transaction != null) { + transaction.rollback(); + } + } finally { + session.close(); + } } } diff --git a/src/main/java/jm/task/core/jdbc/dao/UserDaoJDBCImpl.java b/src/main/java/jm/task/core/jdbc/dao/UserDaoJDBCImpl.java index a6c6c359..77d4ec46 100644 --- a/src/main/java/jm/task/core/jdbc/dao/UserDaoJDBCImpl.java +++ b/src/main/java/jm/task/core/jdbc/dao/UserDaoJDBCImpl.java @@ -1,35 +1,107 @@ package jm.task.core.jdbc.dao; import jm.task.core.jdbc.model.User; - +import jm.task.core.jdbc.util.Util; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; import java.util.List; public class UserDaoJDBCImpl implements UserDao { - public UserDaoJDBCImpl() { + public static final String CREATE_TABLE = "CREATE TABLE users" + + "(" + + "id BIGINT PRIMARY KEY AUTO_INCREMENT, " + + "name VARCHAR(64), " + + "last_name VARCHAR(64), " + + "age TINYINT" + + ");"; + + public static final String DROP_TABLE = "DROP TABLE users;"; + + private static final String INSERT_INTO = "INSERT users(name, last_name, age) " + + "VALUES (?, ?, ?);"; + + private static final String REMOVE_BY_ID = "DELETE FROM users " + + "WHERE id = ?;"; + + private static final String GET_ALL = "SELECT * FROM users"; + + private static final String CLEAR_TABLE = "DELETE FROM users"; + + public UserDaoJDBCImpl() { } public void createUsersTable() { - + try (Connection connection = Util.open(); + PreparedStatement preparedStatement = connection.prepareStatement(CREATE_TABLE)) { + preparedStatement.execute(); + } catch (SQLException e) { + e.printStackTrace(); + } } public void dropUsersTable() { + try (Connection connection = Util.open(); + PreparedStatement preparedStatement = connection.prepareStatement(DROP_TABLE)) { + preparedStatement.execute(); + } catch (SQLException e) { + e.printStackTrace(); + } } public void saveUser(String name, String lastName, byte age) { - + try (Connection connection = Util.open(); + PreparedStatement preparedStatement = connection.prepareStatement(INSERT_INTO)) { + preparedStatement.setString(1, name); + preparedStatement.setString(2, lastName); + preparedStatement.setByte(3, age); + preparedStatement.execute(); + } catch (SQLException e) { + e.printStackTrace(); + } } public void removeUserById(long id) { - + try (Connection connection = Util.open(); + PreparedStatement preparedStatement = connection.prepareStatement(REMOVE_BY_ID)) { + preparedStatement.setLong(1, id); + preparedStatement.execute(); + } catch (SQLException e) { + e.printStackTrace(); + } } public List getAllUsers() { - return null; + List users = new ArrayList<>(); + try (Connection connection = Util.open(); + PreparedStatement preparedStatement = connection.prepareStatement(GET_ALL)) { + ResultSet resultSet = preparedStatement.executeQuery(); + while (resultSet.next()) { + users.add(buildUser(resultSet)); + } + return users; + } catch (SQLException e) { + e.printStackTrace(); + } + return users; } - public void cleanUsersTable() { + private User buildUser(ResultSet resultSet) throws SQLException { + return new User(resultSet.getString("name"), + resultSet.getString("last_name"), + resultSet.getByte("age")); + } + public void cleanUsersTable() { + try (Connection connection = Util.open(); + PreparedStatement preparedStatement = connection.prepareStatement(CLEAR_TABLE)) { + preparedStatement.execute(); + } catch (SQLException e) { + e.printStackTrace(); + } } } diff --git a/src/main/java/jm/task/core/jdbc/model/User.java b/src/main/java/jm/task/core/jdbc/model/User.java index 21b054f6..dc59609c 100644 --- a/src/main/java/jm/task/core/jdbc/model/User.java +++ b/src/main/java/jm/task/core/jdbc/model/User.java @@ -1,25 +1,24 @@ package jm.task.core.jdbc.model; -import javax.persistence.Column; -import javax.persistence.Id; -import javax.persistence.Table; +import javax.persistence.*; -@Table +@Entity +@Table(name = "users") public class User { @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column + @Column(name = "name") private String name; - @Column + @Column(name = "last_name") private String lastName; - @Column + @Column(name = "age") private Byte age; public User() { - } public User(String name, String lastName, Byte age) { @@ -28,6 +27,16 @@ public User(String name, String lastName, Byte age) { this.age = age; } + @Override + public String toString() { + return "User{" + + "id=" + id + + ", name='" + name + '\'' + + ", lastName='" + lastName + '\'' + + ", age=" + age + + '}'; + } + public Long getId() { return id; } diff --git a/src/main/java/jm/task/core/jdbc/service/UserServiceImpl.java b/src/main/java/jm/task/core/jdbc/service/UserServiceImpl.java index b05bd191..bd2b5b58 100644 --- a/src/main/java/jm/task/core/jdbc/service/UserServiceImpl.java +++ b/src/main/java/jm/task/core/jdbc/service/UserServiceImpl.java @@ -1,31 +1,46 @@ package jm.task.core.jdbc.service; +import jm.task.core.jdbc.dao.UserDao; +import jm.task.core.jdbc.dao.UserDaoHibernateImpl; +import jm.task.core.jdbc.dao.UserDaoJDBCImpl; import jm.task.core.jdbc.model.User; +import java.sql.SQLException; import java.util.List; public class UserServiceImpl implements UserService { - public void createUsersTable() { + private UserDao userDaoJDBC = new UserDaoJDBCImpl(); + private UserDao userDaoHibernate = new UserDaoHibernateImpl(); + + public void createUsersTable() { +// userDaoJDBC.createUsersTable(); + userDaoHibernate.createUsersTable(); } public void dropUsersTable() { +// userDaoJDBC.dropUsersTable(); + userDaoHibernate.dropUsersTable(); } public void saveUser(String name, String lastName, byte age) { - +// userDaoJDBC.saveUser(name, lastName, age); + userDaoHibernate.saveUser(name, lastName, age); } public void removeUserById(long id) { - +// userDaoJDBC.removeUserById(id); + userDaoHibernate.removeUserById(id); } public List getAllUsers() { - return null; +// return userDaoJDBC.getAllUsers(); + return userDaoHibernate.getAllUsers(); } public void cleanUsersTable() { - +// userDaoJDBC.cleanUsersTable(); + userDaoHibernate.cleanUsersTable(); } } diff --git a/src/main/java/jm/task/core/jdbc/util/PropertiesUtil.java b/src/main/java/jm/task/core/jdbc/util/PropertiesUtil.java new file mode 100644 index 00000000..a6d02472 --- /dev/null +++ b/src/main/java/jm/task/core/jdbc/util/PropertiesUtil.java @@ -0,0 +1,30 @@ +package jm.task.core.jdbc.util; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +public final class PropertiesUtil { + + private static final Properties PROPERTIES = new Properties(); + + static { + loadProperties(); + } + + private PropertiesUtil() { + } + + public static String get(String key) { + return PROPERTIES.getProperty(key); + } + + private static void loadProperties() { + try (InputStream inputStream = PropertiesUtil.class.getClassLoader().getResourceAsStream("application.properties")) { + PROPERTIES.load(inputStream); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + +} diff --git a/src/main/java/jm/task/core/jdbc/util/Util.java b/src/main/java/jm/task/core/jdbc/util/Util.java index 59e462ba..f9b24a76 100644 --- a/src/main/java/jm/task/core/jdbc/util/Util.java +++ b/src/main/java/jm/task/core/jdbc/util/Util.java @@ -1,5 +1,67 @@ package jm.task.core.jdbc.util; -public class Util { - // реализуйте настройку соеденения с БД +import jm.task.core.jdbc.model.User; +import org.hibernate.HibernateException; +import org.hibernate.SessionFactory; +import org.hibernate.cfg.Configuration; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +public final class Util { + + +// Реализация без проперти +// private static final String URL = "jdbc:mysql://localhost:3306/test"; +// private static final String USERNAME = "root"; +// private static final String PASSWORD = "22121995"; + private static SessionFactory sessionFactory; + private static final String URL_KEY = "db.url"; + private static final String USERNAME_KEY = "db.username"; + private static final String PASSWORD_KEY = "db.password"; + private static final String SHOW_SQL = "show_sql"; + private static final String FORMAT_SQL = "format_sql"; +// private static final String HBM2DDL = "hibernate.hbm2ddl.auto"; + + private Util() { + } +// Реализация без проперти +// public static Connection open() { +// try { +// return DriverManager.getConnection(URL, USERNAME, PASSWORD); +// } catch (SQLException e) { +// throw new RuntimeException(e); +// } +// } + + public static Connection open() { + try { + return DriverManager.getConnection( + PropertiesUtil.get(URL_KEY), + PropertiesUtil.get(USERNAME_KEY), + PropertiesUtil.get(PASSWORD_KEY) + ); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + + public static SessionFactory getSessionFactory() { + if (sessionFactory == null) { + try { + Configuration configuration = new Configuration(); + configuration.setProperty("hibernate.connection.url", PropertiesUtil.get(URL_KEY)) + .setProperty("hibernate.connection.username", PropertiesUtil.get(USERNAME_KEY)) + .setProperty("hibernate.connection.password", PropertiesUtil.get(PASSWORD_KEY)) + .setProperty("show_sql", PropertiesUtil.get(SHOW_SQL)) + .setProperty("format_sql", PropertiesUtil.get(FORMAT_SQL)) + .addAnnotatedClass(User.class); + sessionFactory = configuration.buildSessionFactory(); + } catch (HibernateException e) { + System.out.println("Исключение " + e); + e.printStackTrace(); + } + } + return sessionFactory; + } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties new file mode 100644 index 00000000..754495f7 --- /dev/null +++ b/src/main/resources/application.properties @@ -0,0 +1,8 @@ +db.url=jdbc:mysql://localhost:3306/test +db.username=root +db.password=22121995 +#hibernate.connection.url=jdbc:mysql://localhost:3306/test +#hibernate.connection.username=root +#hibernate.connection.password=22121995 +show_sql=true +format_sql=true diff --git a/src/test/java/UserServiceTest.java b/src/test/java/UserServiceTest.java index c4b9dd0a..d46e9877 100644 --- a/src/test/java/UserServiceTest.java +++ b/src/test/java/UserServiceTest.java @@ -18,6 +18,7 @@ public class UserServiceTest { public void dropUsersTable() { try { userService.dropUsersTable(); + userService.createUsersTable(); userService.dropUsersTable(); } catch (Exception e) { Assert.fail("При тестировании удаления таблицы произошло исключение\n" + e); diff --git a/target/classes/jm/task/core/jdbc/Main.class b/target/classes/jm/task/core/jdbc/Main.class new file mode 100644 index 00000000..138a64c7 Binary files /dev/null and b/target/classes/jm/task/core/jdbc/Main.class differ diff --git a/target/classes/jm/task/core/jdbc/dao/UserDao.class b/target/classes/jm/task/core/jdbc/dao/UserDao.class new file mode 100644 index 00000000..de6ab305 Binary files /dev/null and b/target/classes/jm/task/core/jdbc/dao/UserDao.class differ diff --git a/target/classes/jm/task/core/jdbc/dao/UserDaoHibernateImpl.class b/target/classes/jm/task/core/jdbc/dao/UserDaoHibernateImpl.class new file mode 100644 index 00000000..70789d0a Binary files /dev/null and b/target/classes/jm/task/core/jdbc/dao/UserDaoHibernateImpl.class differ diff --git a/target/classes/jm/task/core/jdbc/dao/UserDaoJDBCImpl.class b/target/classes/jm/task/core/jdbc/dao/UserDaoJDBCImpl.class new file mode 100644 index 00000000..6d5e734c Binary files /dev/null and b/target/classes/jm/task/core/jdbc/dao/UserDaoJDBCImpl.class differ diff --git a/target/classes/jm/task/core/jdbc/model/User.class b/target/classes/jm/task/core/jdbc/model/User.class new file mode 100644 index 00000000..2c10d6b5 Binary files /dev/null and b/target/classes/jm/task/core/jdbc/model/User.class differ diff --git a/target/classes/jm/task/core/jdbc/service/UserService.class b/target/classes/jm/task/core/jdbc/service/UserService.class new file mode 100644 index 00000000..feb698b2 Binary files /dev/null and b/target/classes/jm/task/core/jdbc/service/UserService.class differ diff --git a/target/classes/jm/task/core/jdbc/service/UserServiceImpl.class b/target/classes/jm/task/core/jdbc/service/UserServiceImpl.class new file mode 100644 index 00000000..fd2f8c00 Binary files /dev/null and b/target/classes/jm/task/core/jdbc/service/UserServiceImpl.class differ diff --git a/target/classes/jm/task/core/jdbc/util/PropertiesUtil.class b/target/classes/jm/task/core/jdbc/util/PropertiesUtil.class new file mode 100644 index 00000000..0985ed92 Binary files /dev/null and b/target/classes/jm/task/core/jdbc/util/PropertiesUtil.class differ diff --git a/target/classes/jm/task/core/jdbc/util/Util.class b/target/classes/jm/task/core/jdbc/util/Util.class new file mode 100644 index 00000000..680b0d9c Binary files /dev/null and b/target/classes/jm/task/core/jdbc/util/Util.class differ