该文章记录了在原有SmartHome项目基础上加入 MySql 数据库、配置数据源、添加实体类和配置文件、添加调用方法等,并成功使用客户端程序连接WebService,远程调用EJB连接 数据库 获取到数据。
开发环境:Win7,jdk1.7,JBoss AS7.1.1Final,MySql 5.6,MyEclipse 10。
一、MySQL
建表等,此处略去。(注意连接使用remote用户,不能使用localhost用户)
二、在JBoss7中配置MySQL数据源
在JBoss中配置数据库的连接需要两个步骤:
1. 安装JDBC的驱动
首先进入JBoss安装目录,即%JBOSS_HOME%下,进入modules/com/,新建mysql文件夹,进入,建立main文件夹。在main目录下,加入如下两个文件:
• JBOSS_HOME/modules/com/mysql/main/mysql-connector-java-5.1.17-bin.jar• JBOSS_HOME/modules/com/mysql/main/module.xml
① mysql-connector-java-5.1.17-bin.jar
是JDBC驱动,下载链接:
http://dev.mysql.com/downloads/connector/j/
② module.xml
文件,记录了添加模块的相关配置,代码如下。其中module节点的name就是建立的文件夹路径,resources表示mysql驱动的路径。
2. 在配置中加入数据源
修改/JBOSS_HOME/standalone/configuration目录下的standalone.xml文件,找到datasources子系统,修改配置如下,其中jndi-name表示数据源名称:
jdbc:mysql://115.xxx.xxx.xxx:3306/smarthome1
mysql
admin
123456
0
600
com.mysql.jdbc.Driver
com.mysql.jdbc.jdbc2.optional.MysqlXADataSource
找到jpa子系统,修改配置如下,注意datasource与上面jndi名称一致:
若以上配置成功,则在JBoss7不部署任何EJB的情况下启动不会报错,查看JBOSS_HOME/modules/com/mysql/main/路径,会发现生成了mysql-connector-java-5.1.17-bin.jar.index文件,表示该模块添加成功。
三、编写Bean实体及其配置文件、添加调用方法
Bean实体(注意不要自动生成serial version ID,否则会报错):
package smartHome.po;
import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity //表明这是一个实体Bean
@Table (name = "data" ) //和数据库表data 建立映射
public class Data implements Serializable{
@Id // 表明是该实体的id
@GeneratedValue(strategy = GenerationType. AUTO ) //id生成策略
@Column(name = "id" )//对应data表id字段
private Integer id; // 数据编号
@Column(name = "uid" ) // 对应data表uid字段
private String uid; // 用户ID
@Column(name = "room" ) // 对应data表room字段
private String room; // 房间名称:客厅、卧室
@Column(name = "type" ) // 对应data表type字段
private String type; // 数据类型:温度temp、湿度humd、光照度light、报警alarm
@Column(name = "value" ) // 对应data表value字段
private String value; // 数据值
//setter和getter方法省略
}
在Session接口和ServiceSession类中增加调用数据库的方法:
@PersistenceContext(unitName = "Data" )
private EntityManager em;
// 根据用户ID和房间ID获取数据库数据
@SuppressWarnings("unchecked")
public ResultMap getDataByUIDandRoomID(String room) {
ResultMap resultMap = new ResultMap();
String status = null; // 结果状态:success,fail,overtime,error
String description = null; // 结果描述,fail时描述失败原因
HashMap resultData=new HashMap();
System.out.println("查询开始...");
List list = em.createQuery( "FROM Data ").getResultList();
if (list != null) {
status="success";
Iterator it = list.iterator();
while (it.hasNext()) {
Data data = it.next();
if(data.getUid().equals(user.getID()) && data.getRoom().equals(room)){
resultData.put(data.getType(), data.getValue());
System.out.println("数据类型:" + data.getType());
System.out.println("数据值:" + data.getValue());
}
}
}
else{
status="fail";
description="未找到该用户所在房间信息";
}
System.out.println("查询完毕...." );
resultMap.setStatus(status);
resultMap.setDescription(description);
resultMap.setResultData(resultData);
return resultMap;
}
在工程的META-INF目录下加入persistence.xml文件,该文件会参考使用的datasource来匹配实体与数据库,代码如下:(并注意将工程打包成jar时添加该文件)
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">
org.hibernate.ejb.HibernatePersistence
java:/MySqlDS
客户端连接EJB方法不变,调用方法返回结果的相关代码此处略去。