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