少し前に、Springフレームワークの研究を開始し、ロシア語の資料の量が文字通り価値のある記事に限られていることに気付きました。 クイックランの後、もっと面白いことをしたかったのですが、それを手放すことはできませんでした。 SpringとHibernateの相互作用に関するいくつかの質問をGoogleで検索する必要がありました。 突然、非常に興味深い開発者Mark Serrano別名kramsのブログに出会いました。 さて、あなたと一緒に、一連の翻訳記事と、春の世界でのトレーニングを始めたいと思います。春-休止状態:1対多の関連付けさあ始めましょう...
このチュートリアルでは、Spring MVC 3を使用して顔のリストを管理する簡単なアプリケーションを作成します。人を表示、追加、編集、削除するための簡単なCRUD(読み取り、更新、削除の作成)システムを構築します。 データベースを操作するためのレイヤーとして、Hibernate 3とMySQLデータベースを使用しますが、別のデータベースを使用することもできます。 このレッスンは、MVC、ORM、およびSQLに精通していることを前提としています(
翻訳者から :これらの複雑な単語に驚かないでください、大胆に読んでください、すべてが非常に簡単です)
Hibernateとは何ですか?
Hibernateは、オブジェクトリレーショナルマッピング(ORM)の問題を解決するために設計されたJavaプログラミング言語のライブラリです。 このライブラリは、オブジェクト指向のデータモデルを従来のリレーショナルデータベースにマッピングするための使いやすいフレームワーク(フレームワーク)を提供します。
Hibernateは、データベースにオブジェクトを保存することと、言語レベルでのオブジェクト指向の表現との間の問題を解決します。
MySQLとは何ですか?
MySQLデータベースは、最も要求の厳しいネットワーク、eコマース、トランザクション処理アプリケーションを提供します。 トランザクションのセキュリティを保証し、ACID互換性により、障害発生時のコミット、ロールバック、復元、および回線のロックが可能になります。 MySQLは使いやすさ、スケーラビリティ、パフォーマンスを提供します;これらの特性により、MySQLは世界で最も人気のあるオープンソースデータベースになりました。 Facebook、Google、Ticketmaster、Ebayなど、最も訪問されたネットワークリソースの一部はMySQLを使用しています。
まず、プロジェクトの最終的な構造を見てみましょう。
そして、アプリケーションがどのように見えるか見てみましょう。
ドメインオブジェクトPerson(エンティティPerson)を定義することから始めます。
人package org.krams.tutorial.domain; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name = "PERSON") public class Person implements Serializable { private static final long serialVersionUID = -5527566248002296042L; @Id @Column(name = "ID") @GeneratedValue private Integer id; @Column(name = "FIRST_NAME") private String firstName; @Column(name = "LAST_NAME") private String lastName; @Column(name = "MONEY") private Double money; 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 Double getMoney() { return money; } public void setMoney(Double money) { this.money = money; } }
Personは、4つのプライベート変数を含む単純なPOJOです。
id
firstName
lastName
お金
翻訳者からの追加 :POJO(英語のプレーンオールドJavaオブジェクト)-「古いスタイルのシンプルなJavaオブジェクト」、特定のオブジェクトから継承されず、ビジネスに必要なものを超えるサービスインターフェイスを実装しないシンプルなJavaオブジェクトモデル(Wiki)
@Columnアノテーションが付いたこれらの各変数は、データベース内の列に対応します。
ID
FIRST_NAME
LAST_NAME
お金
それらに対処する必要はありません; Hibernateが引き継ぎます。 ただし、これらの名前を正しく宣言する必要があります(例:@Column(name = `` ID``))。 データベースで宣言しません。 覚えておいてください-データベースはまだ存在していません。
POJOはデータベースのテーブルを参照します。このオブジェクトに対応するテーブルの名前を示す
Tableアノテーションに注意してください。
@Entity @Table(name = "PERSON") public class Person implements Serializable
Entityアノテーションは
Tableアノテーションに面していることに注意してください。これは、POJOがデータベーステーブルのマッピングであることをHibernateに伝えます。
個人のリストを操作するため、このためのサービスを作成します。
PersonService package org.krams.tutorial.service; import java.util.List; import javax.annotation.Resource; import org.apache.log4j.Logger; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.krams.tutorial.domain.Person; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @Service("personService") @Transactional public class PersonService { protected static Logger logger = Logger.getLogger("service"); @Resource(name="sessionFactory") private SessionFactory sessionFactory; public List<person> getAll() { logger.debug("Retrieving all persons");
次の方法を使用した簡単なCRUDシステムを発表しました。
getAll()
()を追加
削除()
編集()
各メソッドでセッションを取得します:
セッションsession = sessionFactory.getCurrentSession();
データベースに接続して作業を行うようなものです。 Sessionオブジェクトは、エンティティオブジェクトを操作するための多くのメソッドを提供します。 このチュートリアルでは、Sessionクラスの次のメソッドを使用します。
session.createQuery()
session.save()
session.delete()
ドメインレイヤーとサービスレイヤーを作成しました。Springコントローラーを作成しましょう。
メインコントローラー package org.krams.tutorial.controller; import java.util.List; import javax.annotation.Resource; import org.apache.log4j.Logger; import org.krams.tutorial.domain.Person; import org.krams.tutorial.service.PersonService; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; @Controller @RequestMapping("/main") public class MainController { protected static Logger logger = Logger.getLogger("controller"); @Resource(name="personService") private PersonService personService; @RequestMapping(value = "/persons", method = RequestMethod.GET) public String getPersons(Model model) { logger.debug("Received request to show all persons");
コントローラーは次のビューを宣言します。
/人-すべての人を受け入れるため
/人/追加(GET)-「追加」フォームを表示します
/人/追加(POST)-新しい人を保存します
/人/削除-既存の人を削除します
/人/編集(GET)-「編集」フォームを表示します
/人/編集(POST)-「修正済み」人を保存します
各ビューはPersonServiceを呼び出します。 PersonServiceの処理が完了すると、コントローラーはJSPページにリクエストを送信し、確認メッセージが表示されます。 JSPページは次のとおりです。
personspage.jsp <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>Persons</h1> <c:url var="addUrl" value="/krams/main/persons/add" /> <table style="border: 1px solid; width: 500px; text-align:center"> <thead style="background:#fcf"> <tr> <th>First Name</th> <th>Last Name</th> <th>Money</th> <th colspan="3"></th> </tr> </thead> <tbody> <c:forEach items="${persons}" var="person"> <c:url var="editUrl" value="/krams/main/persons/edit?id=${person.id}" /> <c:url var="deleteUrl" value="/krams/main/persons/delete?id=${person.id}" /> <tr> <td><c:out value="${person.firstName}" /></td> <td><c:out value="${person.lastName}" /></td> <td><c:out value="${person.money}" /></td> <td><a href="${editUrl}">Edit</a></td> <td><a href="${deleteUrl}">Delete</a></td> <td><a href="${addUrl}">Add</a></td> </tr> </c:forEach> </tbody> </table> <c:if test="${empty persons}"> There are currently no persons in the list. <a href="${addUrl}">Add</a> a person. </c:if> </body> </html>
editpage.jsp <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>Edit Person</h1> <c:url var="saveUrl" value="/krams/main/persons/edit?id=${personAttribute.id}" /> <form:form modelAttribute="personAttribute" method="POST" action="${saveUrl}"> <table> <tr> <td><form:label path="id">Id:</form:label></td> <td><form:input path="id" disabled="true"/></td> </tr> <tr> <td><form:label path="firstName">First Name:</form:label></td> <td><form:input path="firstName"/></td> </tr> <tr> <td><form:label path="lastName">Last Name</form:label></td> <td><form:input path="lastName"/></td> </tr> <tr> <td><form:label path="money">Money</form:label></td> <td><form:input path="money"/></td> </tr> </table> <input type="submit" value="Save" /> </form:form> </body> </html>
addpage.jsp <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>Create New Person</h1> <c:url var="saveUrl" value="/krams/main/persons/add" /> <form:form modelAttribute="personAttribute" method="POST" action="${saveUrl}"> <table> <tr> <td><form:label path="firstName">First Name:</form:label></td> <td><form:input path="firstName"/></td> </tr> <tr> <td><form:label path="lastName">Last Name</form:label></td> <td><form:input path="lastName"/></td> </tr> <tr> <td><form:label path="money">Money</form:label></td> <td><form:input path="money"/></td> </tr> </table> <input type="submit" value="Save" /> </form:form> </body> </html>
editedpage.jsp <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ page import="java.util.Date" %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>Persons</h1> <p>You have edited a person with id ${id} at <%= new java.util.Date() %></p> <c:url var="mainUrl" value="/krams/main/persons" /> <p>Return to <a href="${mainUrl}">Main List</a></p> </body> </html>
addedpage.jsp <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ page import="java.util.Date" %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>Persons</h1> <p>You have added a new person at <%= new java.util.Date() %></p> <c:url var="mainUrl" value="/krams/main/persons" /> <p>Return to <a href="${mainUrl}">Main List</a></p> </body> </html>
deletedpage.jsp <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <%@ page import="java.util.Date" %> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <h1>Persons</h1> <p>You have deleted a person with id ${id} at <%= new java.util.Date() %></p> <c:url var="mainUrl" value="/krams/main/persons" /> <p>Return to <a href="${mainUrl}">Main List</a></p> </body> </html>
アプリケーションを設定しましょう。
web.xmlでSpring MVCを動作させるには:
web.xml <servlet> <servlet-name>spring</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>spring</servlet-name> <url-pattern>/krams/*</url-pattern> </servlet-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
URLパターンに注意してください。 アプリケーションのページにアクセスする場合、ホスト名には次の形式で追加が含まれている必要があります。
/ krams
web.xmlでは、サーブレットの名前としてspringを指定しました。 慣例により、spring-servlet.xmlファイルも作成する必要があります。
spring-servlet.xml <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/jsp/" p:suffix=".jsp" />
applicationContext.xmlファイルも作成する必要があります。
applicationContext.xml <context:annotation-config /> <context:component-scan base-package="org.krams.tutorial" /> <mvc:annotation-driven /> <import resource="hibernate-context.xml" />
applicationContext.xmlファイルで、次のインポートを宣言したことに注意してください。
<import resource="hibernate-context.xml" />
Hibernate構成ファイルが含まれています。
Hibernate-context.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd "> <context:property-placeholder location="/WEB-INF/spring.properties" /> <tx:annotation-driven transaction-manager="transactionManager" /> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" p:dataSource-ref="dataSource" p:configLocation="${hibernate.config}" p:packagesToScan="org.krams.tutorial"/> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" p:driverClass="${app.jdbc.driverClassName}" p:jdbcUrl="${app.jdbc.url}" p:user="${app.jdbc.username}" p:password="${app.jdbc.password}" p:acquireIncrement="5" p:idleConnectionTestPeriod="60" p:maxPoolSize="100" p:maxStatements="50" p:minPoolSize="10" /> <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager" p:sessionFactory-ref="sessionFactory" /> </beans>
このファイルでは、関連するすべてのHibernateおよびSpring構成をカプセル化しました。
構成コメント:
1. Springアノテーションを使用してトランザクションサポートを有効にします。
<tx:annotation-driven transaction-manager="transactionManager" />
2. HibernateのSessionFactoryを発表しました。
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" p:dataSource-ref="dataSource" p:configLocation="${hibernate.config}" p:packagesToScan="org.krams.tutorial"/>
SessionFactoryは、セッションオブジェクトを生成するファクトリです。 これは、人々のために車を作る仕事をしている自動車工場に似ています。
セッションとは何ですか?
セッションの主な機能は、エンティティクラス(
エンティティアノテーションでマークされたクラス)のオブジェクトを作成、読み取り、削除することです。
SessionFactoryには、このレッスンではデータベースであるデータソースが必要です。
SessionFactoryには、特定のHibernate構成のファイルが必要です。
Hibernate.cfg.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <property name="show_sql">false</property> <property name="hbm2ddl.auto">create</property> </session-factory> </hibernate-configuration>
ここで、データベースのタイプを示しました。 MySQLの方言を使用します。 InnoDBエンジンを使用してメモリを管理するため、MySQL5InnoDBDialectという特別な方言を使用します。
MySQL InnoDBとは何ですか?
InnoDB-MySQLエンジン。トランザクションセキュリティを提供し、コミット、ロールバック、リカバリを許可してユーザーデータを保護します。
したがって、SessionFactory Beanに戻って、エンティティオブジェクトの場所を知る必要があります。 したがって、このレッスンでは、それらがorg.krams.tutorialパッケージにあることを示します。
3. hibernate-context.xmlファイルでデータソースを指定します。
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" p:driverClass="${app.jdbc.driverClassName}" p:jdbcUrl="${app.jdbc.url}" p:user="${app.jdbc.username}" p:password="${app.jdbc.password}" p:acquireIncrement="5" p:idleConnectionTestPeriod="60" p:maxPoolSize="100" p:maxStatements="50" p:minPoolSize="10" />
データベースへの効果的なアクセスのために、C3p0プールを使用します。 データをプールにラップする必要があるのはなぜですか?
JDBC接続は、ドライバーを介して直接管理されるよりも、プールを介して管理されることが多くなります。 接続プールの例は、BoneCP、C3P0、およびDBCPです。
なぜプールが必要なのですか?
ソフトウェア接続プールを開発するとき、それは開いている接続のキャッシュです。 プールはパフォーマンスを改善するために必要です。 各ユーザーがデータベースを開いて接続するには、多くのリソースが必要です。 また、プールを使用する場合、必要な接続をキャッシュから抽出するだけでよく、接続を再度確立する必要はありません。
データベースへの接続の特性は、spring.propertiesファイルで指定されています。
spring.properties # database properties app.jdbc.driverClassName=com.mysql.jdbc.Driver app.jdbc.url=jdbc:mysql:
データベース名はmydatabaseです。
別の方法として、これらの機能をhibernate-context.xmlファイルで直接指定できます。
個別の構成ファイルを使用する利点は、データベースへの接続に関するデータのカプセル化です。
申し込みが完了しました。 Hibernateを使用してMySQLにアクセスする簡単なSpring MVCアプリケーションを作成できました。
メインページにアクセスするには、次のURLを入力します。localhost:8080 / spring-hibernate-mysql / krams / main / people
学ぶための最良の方法は、自分でアプリケーションを作成することです。
プロジェクトをダウンロードするには、リンクに従ってください:
spring-mvc-hibernate-annotations-integration-tutorial.googlecode.com/files/spring-hibernate-mysql.zipUPD:約束どおり
-githubへのリンク:
github.com/sa4ek/spring-hibernate-mysql/tree/master