持久化API(JPA)系列(三)實體Bean的開發技術-建立與數據庫的連接

? ? ? ? 在EJB 2.x中。EJB有3種類型的Bean。各自是會話Bean(Session Bean)、消息驅動Bean(Message-Driven Bean)和實體Bean(Entity Bean)。

? ? ? ? 隨著EJB 3的推出,EJB2.x中的實體Bean逐漸被JPA規范所替代,JPA不僅能在EJB環境中使用,并且能在Java SE、Java EE環境中使用。相對于EJB 2.x中的實體Bean,它的使用范圍更廣。

? ? ? ? 但這里我們仍然將其稱做實體Bean。

? ? ? ? 與會話Bean和消息驅動Bean類似,新的實體Bean也是一個加了凝視符(@Entity)的簡單Java對象(POJO),實體關系和O/R映射也是通過凝視符來定義的,并提供幾種不同的數據庫操作規范。

? ? ? ? 一旦被EntityManager訪問,它就成為了一個持久化對象。而且成為了持久化上下文的一部分。此時我們就能夠像使用Hibernate、iBATIS、MYBATIS一樣來使用實體對象了。



? ? ? ? 本文主要將具體解說實體Bean的開發技術。

1、建立與數據庫的連接,演示實體Bean的開發與調用過程。


2、實體管理器:運行數據庫更新的方法。
3、生命周期:實體Bean的監聽和回調。


4、關系實體映射:開發實體的方法。
5、JPQL查詢語言:運行數據庫實體查詢。
6、原生SQL查詢:運行原生SQL語句。


? ? ? ? 它們之間的關系如圖所看到的,通過實體管理器操作實體Bean。來實現對數據庫的更新、JPQL查詢和原生SQL查詢。

實體管理器是工具。實體Bean是數據。

以下首先來解說實體Bean的調用過程。然后通過開發第一個實體Bean。演示該配置與開發的過程,包含以下內容:

1、配置數據源。


2、指定數據源。
3、開發第一個實體Bean--Student.java。
4、開發會話Bean進行調用--StudentDAORemote.java和StudentDAO.java。


5、打包并部署到JBossserver。
6、開發client進行測試--StudentDAOClient.java。


終于實現,通過實體Bean的建立與MySQL數據庫的連接。往數據表中插入一條記錄。

一、實體Bean的工作原理

實體Bean是作為持久化類被EJB容器管理的,要實現對該持久化類的調用,必須經過下面步驟。
(1)配置數據源連接。


(2)在配置文件persistence.xml中指定數據源。


(3)開發實體Bean。
(4)在會話Bean、Java SE或Java EE中調用實體Bean。


? ? ? ? 實體Bean不僅能夠被會話Bean調用。還能夠被不論什么的Java類、JSP和Servlet調用,調用的目的是實現對數據庫的操作。它的意義與Hibernate、iBATIS全然同樣。就是作為系統的DAO層,實現對數據庫的訪問。
? ? ? ? 以下我們就依照從底層到上層的順序,來演示創建與數據庫的連接的過程。


二、配置數據源


jndi-name:指定JNDI命名。


connection-url:數據庫連接URL。
driver:數據庫驅動類。


user-name:數據庫登錄username。


password:數據庫登陸password。


我們僅僅須要通過引用JNDI命令KsMysqlDS來引用該數據源。引用的方法非常easy。僅僅須要在persistence.xml中指定該別名就可以


三、指定數據源--persistence.xml
以上配置的數據源由JBossserver載入和管理。要使用這些數據源,還須要在我們的應用中指定引用哪一個數據源。引用的方法非常easy,僅僅須要在應用的/項目/META-INF文件夾下加入一個配置文件persistence.xml就可以。并在該文件里指定引用的數據源JNDI名稱,同一時候能夠設置該數據源的相關操作屬性。


配置文件persistence.xml



當中包括3個配置元素,分別例如以下。


persistence-unit元素:能夠有一個或多個。每一個persistence-unit元素定義了持久化內容名稱、使用的數據源名稱及Hibernate屬性。當中的name屬性用于設置持久化名稱。
jta-data-source元素:用于指定實體Bean使用的數據源名稱KsMysqlDS。當指定數據源名稱時java:/前綴不能缺少,并注意數據源名稱的大寫和小寫。
properties元素:用于指定Hibernate的各項屬性。假設hibernate.hbm2ddl.auto的值設為update,這樣實體Bean加入一個屬性時能同一時候在數據表添加對應字段。
(1)properties元素屬性在各個應用server使用的持久化產品中都不一樣。如JBoss使用Hibernate。WebLogic10使用Kodo,GlassFish/Sun Application Server/Oralce使用Toplink。


(2)JBossserver在啟動或關閉時會引發實體Bean的公布及卸載。



四、開發第一個實體
實體Bean實際上相應了數據庫中的表,它是數據庫中表在Java類中的表現,通常為最普通的POJO類。EJB容器可以依據實體Bean自己主動在數據庫中創建數據表,這就須要將實體類與數據表的結構進行相應,包含表名、字段名、字段長度、字段類型、主鍵等信息。
為了開發一個與數據庫表相應的單表實體Bean,我們首先設計一個學生表student的數據結構,該表共包含7個字段。如表6-1所看到的。
學生表student
當中的字段類型相應了MySQL數據庫中的字段類型,Java類型為相應的POJO類中的字段類型,即實體Bean中的變量類型。
要開發一個與該表相應的實體Bean非常easy,僅僅須要新建一個POJO類,加入7個與表的字段同名的變量。同一時候使用一些凝視符來表示該實體Bean與數據表student的相應映射關系就可以。
Bean類Student.java。首先我們來看看這個完整的實體類的代碼,例如以下所看到的:

實體Bean類Student.java
package com.ejb.entitybean;  import java.io.Serializable;  
import java.util.Date;  
import javax.persistence.Column;  
import javax.persistence.Entity;  
import javax.persistence.GeneratedValue;  
import javax.persistence.Id;  
import javax.persistence.Table;  @SuppressWarnings("serial")  
@Entity 
@Table(name = "Student")  
public class Student implements Serializable {  private Integer studentid;      //學號  private String name;        //姓名  private boolean sex;            //性別  private Short age;          //年齡  private Date birthday;      //出生日期  private String address;     //地址  private String telephone        //電話  @Id @GeneratedValue public Integer getStudentid() {  return studentid;  }  public void setStudentid(Integer studentid) {  this.studentid = studentid;  }  @Column(name = "name", length = 50)  public String getName() {  return name;  }  public void setName(String name) {  this.name = name;  }  @Column(nullable = false)  public boolean getSex() {  return sex;  }  public void setSex(boolean sex) {  this.sex = sex;  }  @Column(nullable = false)  public Short getAge() {  return age;  }  public void setAge(Short age) {  this.age = age;  }  public Date getBirthday() {  return birthday;  }  public void setBirthday(Date birthday) {  this.birthday = birthday;  }  @Column(name = "address", length = 100)  public String getAddress() {  return address;  }  public void setAddress(String address) {  this.address = address;  }  @Column(name = "telephone", length = 20)  public String getTelephone() {  return telephone;  }  public void setTelephone(String telephone) {  this.telephone = telephone;  }  
} 

實體Bean通常須要實現Serializable接口。這樣就能夠有EJBclient創建該對象,并將該對象傳送到服務端,否則將引發java.io.InvalidClassException例外。



該類是一個Java POJO類,當中包括了7個變量,并為每一個變量加入了getter/setter函數。

為了將該POJO類表現為一個實體Bean,加入了一些凝視符。來與數據表student進行相應。這些凝視例如以下。



@Entity凝視指明這是一個實體Bean,每一個實體Bean類映射數據庫中的一個表。


@Table凝視的name屬性指定映射的數據表名稱,Student類映射的數據表為Student。
@Column凝視定義了映射到列的全部屬性,如列名是否唯一,是否同意為空,是否同意更新等,其屬性介紹例如以下。



name:映射的列名。如映射Student表的name列,能夠在name屬性的getName()方法上面增加@Column(name = "name"),假設不指定映射列名,則容器會將屬性名稱作為默認的映射列名。


unique:是否唯一。

nullable:是否同意為空。
length:對于字符型列,length屬性指定列的最大字符長度。
insertable:是否同意插入。
updatable:是否同意更新。
columnDefinition:定義建表時創建此列的DDL。
secondaryTable:從表名。假設此列不建在主表上(默認建在主表上),則該屬性定義該列所在的從表的名字。
@Lob凝視指定某一個字段為大的文本字段類型。
@Id凝視指定studentid屬性為表的主鍵。


@GeneratedValue凝視定義了標識字段的生成方式,本例中的studentid的值由MySQL數據庫自己主動生成。它能夠有下面多種生成方式。



TABLE:容器指定用底層的數據表確保唯一。
SEQUENCE:使用數據庫的SEQUENCE 列來保證唯一。


IDENTITY:使用數據庫的INDENTIT列來保證唯一。


AUTO:由容器挑選一個合適的方式來保證唯一。


NONE:容器不負責主鍵的生成,由調用程序來完畢。

比如:


@Id 
@GeneratedValue(strategy = GenerationType.IDENTITY)  
public Integer getId() {  return this.id;  
} 

這樣就開發完實體Bean了。它除了在POJO上加入了一些凝視外。與普通的POJO類沒有不論什么差別。



五、開發會話Bean進行調用

1、開發會話Bean進行調用--StudentDAORemote.java和StudentDAO.java? ? ? ?。


? ? ? ? 以下我們來開發一個遠程的會話Bean組件,通過調用實體Bean類Student.java,來實現往數據表student中插入一條記錄。
? ? ? ? 首先在項目EntityBeanTest中新建一個包com.ejb.dao,然后依照會話Bean的開發方法。在該包中新建一個遠程的會話Bean組件StudentDAO。新建完后會產生一個遠程接口類StudentDAORemote.java和實現類StudentDAO.java。



1)遠程接口類StudentDAORemote.java

? ? ? ? 通過凝視符@Remote進行標識。

? ? ? ? 函數insert()運行插入student功能

遠程接口類StudentDAORemote.java

<span style="font-family:SimSun;">package com.ejb.dao;  import java.util.List;  
import javax.ejb.Remote;  
import com.ejb.entitybean.Student;  @Remote 
public interface StudentDAORemote {  public boolean insert(Student student);  
} </span>

2)實現類StudentDAO.java
? ? ? ? 實現了遠程接口StudentDAORemote.java,并通過@Stateless標識為無狀態會話Bean。


? ? ? ? 首先它包括了一個EntityManager類型的變量em。EntityManager是實體管理器。顧名思義。它是實體Bean的管理容器。通過該對象,我們可以實現與數據庫的各種交互,包括增、刪、改、查等。
? ? ? ? 該實體變量em還通過凝視@PersistenceContext來實現動態注入EntityManager對象,假設persistence.xml文件里配置了多個不同的持久化內容。則還須要指定持久化名稱注入EntityManager 對象,能夠通過@PersistenceContext凝視的unitName屬性進行指定,比如:

@PersistenceContext(unitName="exam-entity")  
EntityManager em; 

假設僅僅有一個持久化內容配置。則不須要明白指定。
? ? ? ? 然后開發該類實現接口中的函數insert(),僅僅須要調用em的persist()函數。就行將Student對象持久化到數據庫中。即往數據庫中新增一條記錄。
實現類StudentDAO.java

package com.ejb.dao;  import java.util.List;  
import javax.ejb.Stateless;  
import javax.persistence.EntityManager;  
import javax.persistence.PersistenceContext;  
import javax.persistence.Query;  
import com.ejb.entitybean.Student;  @Stateless 
public class StudentDAO implements StudentDAORemote {  @PersistenceContext protected EntityManager em;  public boolean insert(Student student) {  try {  em.persist(student);  } catch (Exception e) {  e.printStackTrace();  return false;  }  return true;  }  
}


六、打包并部署到JBOSSserver

打成jar包并部署到JBossserver。JBossserver就會自己主動載入該服務。形成JNDI服務供外部訪問了。

該公布步驟例如以下:

1、載入persistence.xml文件。

2、創建數據庫表student,此時查看MySQL數據庫就會看到新建的表student。

3、公布JNDI服務StudentDAO/remote。

這樣我們就能夠通過client訪問JNDI服務StudentDAO/remote了。


七、開發client進行測試-StudentDAOClient.java

? ? ? ? 開發client進行測試--StudentDAOClient.java
? ? ? ? 以上我們開發了實體Bean和會話Bean組件,并公布到了JBossserver中,以下我們來開發一個Javaclient程序,在該client創建一個實體對象,然后調用會話Bean組件插入該對象,往數據表中插入一條記錄。


? ? ? ? 首先將實體類Student.java和接口類StudentDAORemote.java復制加入到測試項目EJBTestJava的相應包中,然后新建測試類


測試類StudentDAOClient.java

import java.text.ParseException;  
import java.text.SimpleDateFormat;  
import java.util.Properties;  import javax.naming.InitialContext;  
import javax.naming.NamingException;  import com.ejb.dao.StudentDAORemote;  
import com.ejb.entitybean.Student;  public class StudentDAOClient {  public static void main(String[] args) throws NamingException {  Properties props = new Properties();  props.setProperty("java.naming.factory.initial",  "org.jnp.interfaces.NamingContextFactory");  props.setProperty("java.naming.provider.url", "localhost:1099");  props.setProperty("java.naming.factory.url.pkgs", "org.jboss.naming");  try {  InitialContext ctx = new InitialContext(props);  StudentDAORemote studentDAO = (StudentDAORemote) ctx.lookup("StudentDAO/remote");  Student student = new Student();  student.setName("劉中兵");  student.setSex(true);  student.setAge((short)25);  SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");  student.setBirthday(format.parse("1981-05-04"));  student.setTelephone("12345678");  student.setAddress("北京");  studentDAO.insert(student);  System.out.println("已經插入一個學生記錄!");  } catch (NamingException e) {  e.printStackTrace();  } catch (ParseException e) {  e.printStackTrace();  }  }  
} 
? ? ? ? 該類通過訪問遠程JNDI服務StudentDAO/remote,取得了遠程會話Bean實例studentDAO。然后創建了一個Student實體對象。調用insert()函數插入該對象。

執行該程序后,會在控制臺中輸出例如以下信息:
? ? ? ? 已經插入一個學生記錄!
? ? ? ? 這就表明client的Java類已正確地將Student對象提交到遠程會話Bean組件中了。

? ? ? ? 經過第一次載入后的實體Bean對象已經被實體管理器EntityManager緩存了,再次訪問時,就會直接從緩存中取得該實體對象。



轉載于:https://www.cnblogs.com/mfrbuaa/p/5271309.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373460.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373460.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373460.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WebSphere Classloader內存泄漏預防

解決應用程序類加載器泄漏 應用領域 傾向于&#xff1a; 使用應用程序類加載器中的Runnable實現啟動新線程。 即使JEE編程模型不支持此功能&#xff0c;客戶也經常直接創建新線程或通過使用間接創建它們 計時器 客戶必須確保在停止相應的應用程序&#xff08;或WAR模塊&…

airflow sql_alchemy_conn mysql_airflow使用mysql數據庫,LocalExecutor并發調度

mysql-airflow在mysql上執行create database airflow; —— 創建數據庫GRANT all privileges on airflow.* TO airflow% IDENTIFIED BY 123456; —— 將數據庫airflow的所有權限授權airflow用戶&#xff0c;密碼123456且該用戶可在任何IP段登錄操作FLUSH PRIVILEGES; —— 刷新…

【SAP業務模式】之ICS(四):組織單元的配置

SAP的ICS業務后臺配置主要有以下幾個配置點&#xff1a; 1、組織單元的配置&#xff08;公司代碼、銷售組織、工廠、采購組織等&#xff09;&#xff1b; 2、主數據的部分&#xff1b; 3、訂單和開票的定價過程&#xff1b; 4、開票輸出類型&#xff1b; 5、公司間發票的配置&a…

poj-2478 Farey Sequence(dp,歐拉函數)

題目鏈接&#xff1a; Farey Sequence Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 14230 Accepted: 5624Description The Farey Sequence Fn for any integer n with n > 2 is the set of irreducible rational numbers a/b with 0 < a < b < n a…

Twitter4j和Esper:在Twitter上跟蹤用戶情緒

對于復雜事件處理和Twitter API的新手&#xff0c;我希望這是一個簡短的教程&#xff0c;可以幫助他們Swift起步。 管理大數據并從中挖掘有用的信息是當前技術中最熱門的討論主題。 來自Twitter&#xff0c;Facebook和Linkedin等社交網絡的半結構化數據的爆炸式增長使Hadoop&am…

webase crud查看所有表_Laravel-Gii 可視化代碼生成工具 CRUD +GUI

Laravel-Gii 可視化代碼生成工具 CRUD GUI適用于快速B端后臺開發&#xff0c;根據MySQL的表結構生成對應的Model、Observer、Controller、View、Route等相關項目文件[TOC]注意因為是解析MySQL的表結構&#xff0c;并且根據字段生成模板&#xff0c;所以目前生成的Model類時只支…

20145231第二周Java學習筆記

20145231 《Java程序設計》第2周學習總結 教材學習內容總結 本周的學習采用的依然是先看課本&#xff0c;再看視頻&#xff0c;然后實踐敲代碼&#xff0c;最后根據學習筆記總結完成博客。 第三章&#xff1a;基礎語法 知識點比較多比較零碎&#xff0c;整理的都是實際操作中可…

JavaFX 2.0和Scala,像牛奶和餅干

JavaFX 2.0和Scala都是很好的技術&#xff0c;但是一起使用時效果會更好。 JavaFX 2.0是一種功能強大的富客戶端技術&#xff0c;具有先進的圖形&#xff0c;動畫和媒體功能。 Scala是一種簡單但功能強大的語言&#xff0c;具有用于編寫特定于域的語言&#xff08;DSL&#xff…

ASP.NET WebAPi之斷點續傳下載(上)

前言 之前一直感覺斷點續傳比較神秘&#xff0c;于是想去一探究竟&#xff0c;不知從何入手&#xff0c;以為就寫寫邏輯就行&#xff0c;結果搜索一番&#xff0c;還得了解相關http協議知識&#xff0c;又花了許久功夫去看http協議中有關斷點續傳知識&#xff0c;有時候發覺東西…

貪吃蛇(C++實現,VC6.0編譯,使用了EasyX圖形庫)

程序效果&#xff1a; 代碼&#xff1a; //main.cpp 1 #include <iostream>2 #include<fstream>3 #include <graphics.h>4 #include <conio.h>5 #include<ctime>6 #include<windows.h>7 #include<mmsystem.h>8 #pragma comment(lib…

3.0 C++遠征:is a

4-4is_a 0.派生類Soldier繼承自基類Person //Person.h class Person { public:Person(string name "Jim");~Person();void play(); protected:string m_strName; };//Soldier.h class Soldier : public Person { public:Soldier(string name "James", in…

python中sorted的用法append_python sorted()排序詳解

排序&#xff0c;在編程中經常遇到的算法&#xff0c;我也在幾篇文章中介紹了一些關于排序的算法。有的高級語言內置了一些排序函數。本文講述Python在這方面的工作。供使用內置函數sorted()/list.sort()的使用簡單應用python對list有一個內置函數&#xff1a;>>> a[5…

云上的播放框架變得簡單:Openshift模塊

僅僅幾年前&#xff0c;找到一個負擔得起的Java Web應用程序托管解決方案是一項艱巨的任務&#xff0c;而尋找免費的托管解決方案是一項不可能的任務。 更不用說甚至考慮自動縮放&#xff0c;單命令部署&#xff0c;持續集成等事情&#xff0c;這都是科幻小說。 去年見證了云計…

C#中的yield return與Unity中的Coroutine(協程)(下)

Unity中的Coroutine&#xff08;協程&#xff09; 估計熟悉Unity的人看過或者用過StartCoroutine() 假設我們在場景中有一個UGUI組件&#xff0c; Image&#xff1a; 將以下代碼綁定到Image 1 using UnityEngine;2 using System.Collections;3 using System.Threading;4 using …

字節流轉化為文件流_C#文件轉換為字節流及字節流轉換為文件

本文講解了C#實現文件轉換為字節流的方法。文件轉換為字節流的步驟如下1、通過文件流打開指定文件(FileStream fs)&#xff1b;2、定義字節流(byte[] fileBytenew byte[fs.Length])&#xff1b;3、把文件讀取到字節流(fs.Read(fileByte,0,fileByte.Length))&#xff1b;4、關閉…

Spring和JSF集成:導航

我希望這是有關我在Spring和JavaServer Faces之間提供深度集成的努力的一系列博客中的第一篇。 這里提到的所有內容都是“正在進行中的工作”&#xff0c;因此&#xff0c;如果您簽出代碼&#xff0c;請注意它是一個不斷變化的目標。 期待一些粗糙的邊緣&#xff0c;如果有時會…

【CSS3動畫】transform對文字及圖片的旋轉、縮放、傾斜和移動

前言&#xff1a;之前我有寫過CSS3的transform這一這特性&#xff0c;對于它的用法&#xff0c;還不是很透徹&#xff0c;今天補充補充&#xff0c;呵呵 你懂的&#xff0c;小司機準備開車了。 a)再提一提transform的四個屬性 ①旋轉--->rotate(參數a)&#xff0c;單位deg&a…

宏的用法與簡介

預處理指令&#xff1a;例如&#xff1a;#include<stdio.h> #include<stdlib.h> #define MAX 20 ............. 因為他們由預處理器解釋的&#xff0c;所以稱作預處理指令。預處理器讀取源代碼&#xff0c;然后對其修改&#xff0c;并把修改過的…

django 日志寫入mysql_如何將django orm模型 寫入數據庫

1、指定連接pymysql(python3.x)先配置_init_.pyimport pymysqlpymysql.install_as_MySQLdb()2、配置連接mysql文件信息settings.pyDATABASES {default: {ENGINE: django.db.backends.mysql,NAME: django_orm, #你的數據庫名稱USER: root, #你的數據庫用戶名PASSWORD: , #你的數…

ORM的問題第2部分–查詢

在我以前關于對象關系映射工具&#xff08;ORM&#xff09;的帖子中&#xff0c;我討論了在處理當今常見的ORM&#xff08;包括Hibernate&#xff09;時遇到的各種問題。 其中包括與從POJO生成架構有關的問題&#xff0c;實際性能和不斷出現的維護問題。 本質上&#xff0c;結論…