160 likes | 289 Views
EntityManager と EJB QL. EJB 3.0 コース 第 8 回. ここでの目標. Entity Manager の使いかた、とりわけ EJB QL について理解する。. EntityManager の利用. EntityManager と @Inject. @Inject private EntityManager em; EntityManager は、データの永続管理を受け持つオブジェクト。データベースと接続して、さまざまな処理を行う。
E N D
EntityManager と EJB QL EJB 3.0 コース 第8回
ここでの目標 • Entity Manager の使いかた、とりわけ EJB QL について理解する。
EntityManager と @Inject @Inject private EntityManager em; • EntityManager は、データの永続管理を受け持つオブジェクト。データベースと接続して、さまざまな処理を行う。 • @Inject は、Dependency Injection (依存性注入)を行うためのアノテーション。EntityManager は、コンテナによって依存性注入される。
EntityManager#find public Employee findEmployeeByEmpNo(int empNo) { return ((Employee) em.find("Employee",empNo)); } • EntityManager の find メソッドは、データベースからempNo という主キーで指定したデータを検索し、検索結果として Employee オブジェクトを返す。
EntityManager#persist public void addEmployee(int empNo, String eName, double sal) { if (emp == null) emp = new Employee(); emp.setEmpNo(empNo); emp.setEname(eName); emp.setSal(sal); em.persist(emp); } • EntityManager の persist メソッドで、Entity Bean を永続化している。つまり、データをデータベースで管理するようにしている。
EntityManager#remove @Stateless public class EmployeeDemoSessionEJB implements EmployeeDemoSession { public void removeEmployee(Integer employeeId) { Employee employee = (Employee)em.find("Employee", employeeId); em.remove(employee); } } • EntityManager の remove メソッドで、データベースで管理されているオブジェクトを削除できる。
データベースの更新 Employee emp3 = ef.findEmployeeByEmpNo(empNo); emp3.setSal(100000); • Entity Bean のプロパティの内容を変化させると、その内容がデータベースに反映される。
EJB QL とは何か • EJBでデータベースを操作するためのクエリー言語 • データベースに依存しないかたちでクエリーを記述できる
EJB QL のパターン select … from … where … • EntityManager の createQuery, createNamedQuery といったメソッドから利用する。
createQueryとEJB-QLの利用 public Collection findAllEmployees() { Collection employees = em.createQuery( "SELECT employee FROM Employee employee") .getResultList(); return employees; } public Collection findEmployeesByLastName(String lastName) { Collection employees = em.createQuery( "SELECT employee FROM Employee employee WHERE employee.lastName = :lastname") .setParameter("lastname", lastName).getResultList(); return employees; }
createQueryとEJB-QLの利用 public Collection findManyProjectsByQuery(Vector params) { Collection projects = em.createQuery( "SELECT project FROM Project project WHERE project.name LIKE :projectName") .setParameter("projectName", params.firstElement()) .getResultList(); return projects; } public int changeCityName(String oldName, String newName) { StringBuffer buffer = new StringBuffer(); buffer.append("UPDATE Address address SET address.city = '"); buffer.append(newName); buffer.append("' WHERE address.city = '"); buffer.append(oldName); buffer.append("'"); String ejbqlString = buffer.toString(); return em.createQuery(ejbqlString).executeUpdate(); }
NamedQueryの利用 @Entity @Table(name="EJB_PROJECT") @NamedQuery( name="findProjectByName", queryString="SELECT project FROM Project project WHERE project.name = :name" ) public class Project implements Serializable {…..} public Project findProjectByName(String name) { Project proj = (Project)em.createNamedQuery("findProjectByName") .setParameter("name", name).getSingleResult(); proj.getTeamLeader(); return proj; }
課題 (1) • Entity Bean のサンプルに、「指定したIDを持つ従業員の給料を100上げる」という機能を追加してください。
課題 (2) • 図書館の本の検索アプリケーションを作成します。例えば “Java”を引数に与えたら、”Java”という文字がタイトルに含まれる本のリストを出力するような機能を持つアプリケーションを作成してください。 • 本のデータはダウンロードできます。