EJB是用来开发企业应用的技术规范,主要是开发服务器端与客户端。我们比较熟悉的是web应用的开发,我们需要把写好的项目部署到web服务器器上,比如tomcat,然后通过网页访问;而EJB项目需要将服务器端代码打包成jar包,然后部署到服务器上(由于tomcat只是个web容器,不能用来部署EJB项目,所以这里我们用到的是JBoss,两者同样都是开源的),然后通过客户端代码访问并执行服务器端程序。所以说EJB项目主要注重服务器端和客户端的开发,但是由于ajax技术和其他web框架(如spring,hibernate)的兴起,现在的主流还是web开发。但是EJB并不过时,特别是EJB3.0出现以后,我们可以更加轻松快速的开发EJB项目,并且现在的主流框架大多支持EJB规范。
这里我们用到的是Myeclipse8.5+jboss-5.0.0.GA.,jboss的下载地址:http://www.jboss.org/jbossas/downloads/,下载完并安装。在Myeclipse选择Window->Preferences->MyEclipse->Servers->JBoss 5.x,选择JBoss server为[Enable],路径为你的安装路径,然后下次就可以通过Servers来启动JBoss了。
接下来创建一个EJB Project,开始写服务器端代码。这里用到了EntityBean和SessionBean。EntityBean就是实体类,与web项目中的实体类功能相同;SessionBean描述了与客户端的会话,当客户端执行完以后,SessionBean和他的数据就会消失。这个项目用到了JNDI和JPA,JPA是java的数据持久化API,通过EntityManager(实体管理器)来管理ORM映射,需要注意的是EJB里的Entity都要实现Serializable接口以实现远程交流。JNDI是java的命名和目录API,这里借助JNDI让JBoss来维护SessionBean。下面给出src目录下的代码:
Student类:
package test.ejb.beans;
import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="t_student")
public class Student implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue
private int id;
private String name;
public Student(){}
public Student(int id,String name){
this.id=id;
this.name=name;
}
public int getId(){return id;}
public void setId(int id){this.id = id;}
public String getName(){return name;}
public void setName(String name){this.name = name;}
}
StudentDao类:
package test.ejb.dao;
import java.util.List;
import test.ejb.beans.Student;
public interface StudentDao {
public Student get(int id) ;
public void saveOrUpdate(Student domain);
public void remove(Student domain);
public List<Student> getAll();
}
StudentSessionBean类:
package test.ejb.dao.impl;
import java.util.List;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import test.ejb.beans.Student;
import test.ejb.dao.StudentDao;
@Stateless
@Remote(StudentDao.class)
public class StudentSessionBean implements StudentDao{
@PersistenceContext
private EntityManager entityManager;
public Student get(int id) {
return entityManager.find(Student.class,id);
}
public void remove(Student domain) {
entityManager.remove(entityManager.merge(domain));
}
public void saveOrUpdate(Student domain) {
entityManager.merge(domain);
}
@SuppressWarnings("unchecked")
public List<Student> getAll() {
String jpql="select s from Student s";
Query query=entityManager.createQuery(jpql);
return query.getResultList();
}
}
META-INF下的persistence.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" version="1.0">
<persistence-unit name="EJBProjectPU" transaction-type="JTA">
<jta-data-source>java:DefaultMySqlDS</jta-data-source>
<properties>
<property name="hibernate.hbm2ddl.auto" value="update" />
<property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect"/>
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
这样,服务器的的代码就基本完成了,接下来需要将这个项目打成jar包,放在D:\jboss-5.0.0.GA\server\default\deploy目录下,接下来需要在该目录下写一个mssql-ds.xml,表示与数据库连接的数据源,并且需要把mysql的驱动包放在D:\jboss-5.0.0.GA\server\default\lib目录下,下面是mssql-ds.xml的内容:
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
<local-tx-datasource>
<jndi-name>DefaultMySqlDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/xuliang?useUnicode=true&characterEncoding=UTF-8</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password></password>
<metadata>
<type-mapping>mySQL</type-mapping>
</metadata>
</local-tx-datasource>
</datasources>
最后,简单的写一个客户端代码测试一下,你可以将客户端代码放在任何地方,但是需要将服务器端的jar包导入,并且将D:\jboss-5.0.0.GA\client目录下的jbossall-client.jar和jnp-client.jar包导入,代码如下:
package xxx.xxx.xxx;
import java.util.Properties;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import test.ejb.beans.Student;
import test.ejb.dao.StudentDao;
public class EntityBeanTest {
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");
InitialContext ctx = new InitialContext(props);
StudentDao studentDao= (StudentDao)ctx.lookup("StudentSessionBean/remote");
Student stu=new Student();
stu.setId(999);
stu.setName("xuliang");
studentDao.saveOrUpdate(stu);
System.out.println(studentDao.get(1));
}
}
启动jboss,然后运行上面的代码,就能将记录插入数据库并查询出来。