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");