初心者向けのSpring + Hibernate

免責事項の代わりに



Hibernateの操作に関するトピックに関するHabrの記事は既に多数ありますが、私には思えたように、それらはすべて初心者にとって非常に複雑です。 この記事は、ORMの操作の基本を明確にすることを目的としており、主に独自のアプリケーションの開発を始めたばかりで、データベース全般、特にHibernateなどのツールの経験が少ない人に役立ちます。 熱心な開発者は、自分自身のために記事で新しいものを見つけることはまずありません。 私は猫の下の他のみんなに尋ねます。



ORMとは何ですか?



膨大な量のさまざまな情報を保存しないと、最新のWebアプリケーションではできません。 このタスクは通常、特別なプログラム-データベース管理システムDBMSに割り当てられます。 組織体系によると、データベースはいくつかのタイプに分割され、最も一般的なタイプがリレーショナルであることが判明しました。



リレーショナルデータベースでは、データはエンティティ(テーブル)とそれらの関係の形式で編成されます。 オブジェクト指向プログラミング言語を使用するプログラマは、多くの場合、DBMSが理解できる形式から使い慣れたオブジェクト形式にデータを変換するタスクに直面します。 ほとんどの場合、これらの問題の解決には膨大な時間がかかり、そのような構造を書くようになります。



public ArrayList<BookBean> getBooksByGenreId (int genre_id) { ArrayList<BookBean> result = new ArrayList<>(); try { int i = 1; String query = "SELECT * FROM books " + "LEFT JOIN genres2books " + "ON genres2books.book_id=books.id " + "WHERE genre_id=? AND books.approved = 1 " + "ORDER BY user_rating DESC LIMIT 250"; connection = getConnection(); ps = connection.prepareStatement(query); ps.setInt(i++, genre_id); resultSet = ps.executeQuery(); while (resultSet.next()) { String name = resultSet.getString("name"); String summary = resultSet.getString("summary"); String cover_url = resultSet.getString("cover_url"); String cover_min_url = resultSet.getString("cover_min_url"); String example = resultSet.getString("example"); String isbn = resultSet.getString("isbn"); String foreign_id = resultSet.getString("foreign_id"); double rev_rating = resultSet.getDouble("rev_rating"); double usr_rating = resultSet.getDouble("user_rating"); int user_id = resultSet.getInt("user_id"); int id = resultSet.getInt("id"); int approved = resultSet.getInt("approved"); int top = resultSet.getInt("top"); int partner_id = resultSet.getInt("partner_id"); long sum_mark = resultSet.getLong("sum_mark"); long votes_num = resultSet.getLong("votes_num"); result.add( new BookBean(id, name, summary, cover_url, cover_min_url, example, rev_rating, usr_rating, user_id, top, approved, sum_mark, votes_num, isbn, foreign_id, partner_id) ); } } catch (SQLException | IllegalArgumentException e) { e.printStackTrace(); } finally { try { if (ps!=null) ps.close(); if (connection!=null) connection.close(); } catch (Exception e) { e.printStackTrace(); } } return result; }
      
      







これはSELECTの1つにすぎませんが、DBMSへの正しい接続を整理し、複数のユーザーの通常の同時操作を保証する必要もあります。



プログラマの生活を簡素化し、日常業務から解放するために、人気のあるHibernateライブラリによって実装されるObjective Appliance(ORM)と呼ばれる技術が求められています。 Hibernateは、読み取りのためにリレーショナルビューからオブジェクトビューにデータを変換し、書き込むためにオブジェクトビューからリレーショナルビューにデータを変換するタスクを引き受けます。 さらに、ライブラリを使用すると、DBMSへの接続を簡単に構成でき、それを使用すると、トランザクションを非常に簡単に管理できます。



クイックスタート



次に、Hibernateを使用して、セッションを保存するために使用される、このようなテーブルのオブジェクトフォームへのマッピングを作成します。



画像



Bean SessionBeanを作成します。 Beanは、パラメーターのないコンストラクター、すべてのパラメーターのコンストラクター、およびgetメソッドとsetメソッドがすべてのフィールドに対して定義されているクラスです。



 @Entity //,      @Table(name = "sessions") //      public class SessionBean implements Serializable{ @Column(name = "username") //    private String username; //   @Id //  ,     ID        @Column(name = "series") private String series; @Column(name = "token") private String token; @Column(name = "last_used") private Timestamp lastUsed; public SessionBean() {} public SessionBean(String username, String series, String token, Timestamp lastUsed) { this.username = username; this.series = series; this.token = token; this.lastUsed = lastUsed; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSeries() { return series; } public void setSeries(String series) { this.series = series; } public String getToken() { return token; } public void setToken(String token) { this.token = token; } public Timestamp getLastUsed() { return lastUsed; } public void setLastUsed(Timestamp last_used) { this.lastUsed = last_used; } }
      
      







また、データベースへの読み取りおよび書き込み操作を提供する特別なクラスであるDAO(データアクセスオブジェクト)も作成します。



 public class NEXEntityDAO<Bean> { protected final Class<Bean> typeParameterClass; public NEXEntityDAO(Class<Bean> typeParameterClass) { this.typeParameterClass = typeParameterClass; } @Override public void delete(int id) { Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); Bean del = (Bean) session.get(typeParameterClass, id); session.delete(del); session.getTransaction().commit(); if (session.isOpen()) { session.close(); } } @Override public ArrayList<Bean> getAll() { Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); String hql = String.format("from %s",typeParameterClass.getCanonicalName()); Query SQLQuery = session.createQuery(hql); ArrayList<Bean> result = (ArrayList<Bean>) SQLQuery.list(); session.getTransaction().commit(); if (session.isOpen()) { session.close(); } return result; } public Bean getById(int id) { Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); Bean result = (Bean) session.get(typeParameterClass, id); session.getTransaction().commit(); if (session.isOpen()) { session.close(); } return result; } @Override public void update(Bean object) { Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); session.update(object); session.getTransaction().commit(); if (session.isOpen()) { session.close(); } } @Override public void add(Bean object) { Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); session.save(object); session.getTransaction().commit(); if (session.isOpen()) { session.close(); } } @Deprecated public void clear() { Session session = HibernateUtil.getSessionFactory().openSession(); session.beginTransaction(); String hql = String.format("delete from %s",typeParameterClass.getCanonicalName()); Query query = session.createQuery(hql); query.executeUpdate(); session.getTransaction().commit(); if (session.isOpen()) { session.close(); } } }
      
      







その後、データベースへのデータの抽出、編集、追加が非常に簡単になります。



  NEXEntityDAO<SessionBean> sessionDAO = new NEXEntityDAO<>(SessionBean.class); SessionBean session = sessionDAO.getById(5) //    = 5 ArrayList<SessionBean> allSessions = sessionDAO.getAll(); //    session.setToken(“21313”); sessionDAO.update(session); //   SessionBean adding = new SessionBean(“st”,”ri”,”ng”,ts); sessionDAO.add(adding); //  
      
      







これで、ORMの紹介は終わりです。 次の記事では、このテクノロジーを使用する上で最も興味深い微妙な点と、データベースをテストするためのテクニックについて検討します。



All Articles