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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值