EJB的學習

pojo 就是普通的javabean

ioc 就是控制反轉 或成爲依賴注入,容器控制組件,權利由程序轉移到容器控制,很多的操作都是由容易去實現。

 

java的元數據批註 annotation

 

@Entity

@Table(name="helloTable")

public class HelloEntityBean(){

//the entity class must have a no-arg constructor

private int id;

private String foo;

public HelloEntityBean(){}

public HelloEntityBean(int id,String foo){

this.id = id;

this.foo = foo;

}

 

@Id(generate=GeneratorType.NONE)

public int getId(){

return id;

}

public void setId(int id){

this.id = id;

}

}

 

從EJB3.0開始,Entity Bean 持久化規範,與ejb的其他規範 如 Session Bean ,Message Driven Bean,EJB3容易規範完全的分離出來。

 

 

EntityManagerFactory都必須有一個persistence.xml

 

<entity-manager>

     <name>myEntityManager</name>

<provider>com.redsoft.ejb3.PersistenceProviderImpl</provider>

<class>com.redsoft.samples.HelloEnityBean</class>

 

<properties>

<property name="ConnectionDriverName" value="com.mysql.jbdc.Driver"/>

<property name="ConnectionURL" value="jdbc:mysql://localhost/EJB3Test"/>

<property name="ConnectionUserName" value="ejb3"/>

<property name="ConnectionPassword" value="ejb3"/>

<property name="RetainValues" value="true" />

<property name="RestoreValues" value="false" />

</properties>

</entity-manager>

 

<name><name>定義EntityManagerFactory的名字,當應用中有多個EntityManagerFactory的時候,可以區分的作用。

通常情況下,一個 EntityManagerFactory對應一個數據源。

<provider></provider>定義採用的是Liberator EJB3的運行環境。可以隨意的更換運行環境

<class></class>定義哪些類是Entity持久化類。

<property></property>運行環境所需要的環境參數。

 

Entity的生命週期和狀態

新實體   和ejb persistence沒有聯繫

持久化實體 和ejb persistence 有聯繫

 

分離的實體  不被ejb persistence 管理

刪除的實體: remove的實體,在事務提交以後刪除。

 

EJB 3QL查詢

 

是一種和sql非常類似的中間性和對象化查詢語言。

 

final Query query = entityManager.createQuery("select o from Order o");

final List result = query.getResultList():

 

在構建Query 的時候,只是把ejb ql 編譯成響應的sql 並 不執行,當調用 list.get(i)的時候,

sql纔會被真正的執行

 

在返回的結果集中,並不包含所有的結果,只是保存一個指向JDBC ResultSet的一個行指針,只有用戶需要的時候,纔回從Result中獲得數據,填充到Entity實例中來。

 

查詢結果會在緩存中保留,第二次查詢的時候會直接從緩存中取,要是中間 有數據的更新操作 就會清除緩存,重新獲得。

 

query.setHint(Constants.QUERY_RESULT_CACHE,"false");

 

 

ejb中的參數查詢:

①:命名參數

Query query = entityManager.createQuery("select o from Order o where o.id = :myId");

//set parameter

query.setParameter("myId",2);

 

Query query = entitiyManager.createQuery("select o from Order o where o.id = :myId and o.customer=:customerName");

query.setParameter("myId",2);

query.setParameter("customerName","foo");

 

不允許在一個查詢中使用兩個相同名字的命名參數。

②:位置參數

Query query = entityManager.createQuery("select o form Order o where o.id = ?1 and o.customer = ?2");

 

query.setParameter(1,2);

query.setParameter(2,"foo");

 

排序 oder by

 desc asc

 

查詢部分屬性

 

查詢出來的是對象的 數組的list

 

在ejb中關於到聚合函數,條件需要使用 having而不是where

 

在left join中都是允許右邊表達式的entities爲空。

inner Join要求右邊的表達式必須返回entities

 

Entity 中的集合屬性默認不會關聯,集合屬性默認是緩加載 lazy-load

 

final Query query = entityManager.createQuery("select o form Order o inner join o.orderItems where a.address.streetNumber=2000 order by o.id");

final List list = query.getResultList();

final Order order = (Order)result.get(0);// orderItems爲空

//當需要的時候纔會執行sql獲得

Collection orderItems = order.getOrderItems();

 

查詢參數可以是entity

 

Query query = entityManager.createQuery("select o from Order o where o.address = ?1 order by o.id");

Address address = new Address(2001,"foo street","foo city","foo province");

query.setParameter(1,address);

 

批量更新:

Query query = managerNew.createQuery("update Order as o set o.vender=:newvender,o.partNumber='foo part' where o.vender='foo'");

query.setParameter("newvender","barVender");

int result = query.executeUpdate();

 

批量刪除

 

Query query = managerNew.createQuery("delete from Order");

int result = query.executeUpdate();

 

Query query = managerNew.createQuery("delete from Order as o where o.vender='redsoft'");;

int result = query.executeUpdate();

 

操作符 IS EMPTY

IS EMPTY 是針對集合屬性

 

Query query = managerNew.createQuery("select o from Order o where o.orderItems is empty by o.vender desc");

 

操作符 EXISTS

需要和子查詢配合使用

 

Query query = manager.createQuery("select o from Order o where exists(select o from Order o where o.partNumber=?1) order by o.vender desc");

 

query.setParameter(1,"partNumber");

 

 

ALL SOME ANY 嵌套查詢:

Query query = managerNew.createQuery("select emp from EmployeeA emp where emp.salary > all(select m.salary from Manager m where m.department=emp.department)");

 

字符串函數:

concat 將兩個字符串組合成一個字符串

Query query = entityManager.createQuery("select concat(o.owner.firstName,o.owner.lastName) from Order as o left outer join o.orderItems as oi where o.owner.firstName='foo'"):

 

返回‘foobar’的‘oo’

Query query = entityManager.createQuery("select o.vender,substring(o.owner.firstName,1,3),o.owner.info.age from Order as o left outer join o.orderItems as oi where o.owner.fistName='charles'");

 

獲取‘ar’在firstName中的起始位置:

Query query = managerNew.creatQuery("select emp.firstName,emp.salary,locate(emp.firstName,'ar') from EmployeeA as emp where emp.firstName ='charles1111'");

 

計算函數

 

ABS 絕對值

SQRT 平方根

MOD 取餘數

SIZE 取集合的數量

 

SIZE(M.N),取M正常N以後得到的餘數

 

Query query = managerNew.createQuery("select  emp from EmployeeA as emp where (select count(m) from Manager as m where m.department = emp.department) >0");

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章