开发框架 struts1.2 + hibernate 3.2 + spring 2.5 + extjs 3.0
开发工具 myeclipse 6.5 tomcat6.0
项目描述: 就是一个医院的收费系统。然后外带一些报表的查询。
运用的一下技术。
1.数据库方面 :要将原来系统的数据导入到现在的数据库。 使用了
select t.字段1,t.字段1,t.字段1, table t into table t2
2.数据库的备份还原Mysql (都是java调用cmd命令执行mysql的命令) 没有考虑linux
cmd命令中需要 mysql 用户名称 密码 数据库
当时考虑 在程序中将这些写死不容易维护 就 想到了XML 配置文件。原来想用spring 的jdbc.properties的。可是在我这没问题。就是 hql语句会莫名其妙 where条件不执行。
xml 我使用sax解析。
配置文件:我放在了classpath 下方便查找。
<?xml version="1.0" encoding="UTF-8"?>
<datasource>
<propertys>
<property name="driverClassName" value="com.mysql.jdbc.Driver" comment="数据库驱动"/>
<property name="url" value="221.131.187.**" comment="数据库地址"/>
<property name="db" value="his" comment="数据库名称"/>
<property name="username" value="logistics" comment="用户名"/>
<property name="password" value="abc123" comment="密码"/>
<property name="port" value="3306" comment="端口号"/>
</propertys>
</datasource>
在action中 解析的方法:
/**
* @param request
* @return
* 获取配置文件绝对路径
*/
private static String getXMLFile(HttpServletRequest request,String xmlFileName) throws Exception{
xmlFileName = request.getSession().getServletContext().getRealPath(xmlFileName);
log.info("XML File Name : " + xmlFileName);
return xmlFileName;
}
/**
* @param request
* @return
* 初始化配置文件
*/
private static Document getDocument(HttpServletRequest request,String xmlFileName) throws Exception{
SAXReader saxReader = new SAXReader();
//得到指定文件以流的形式对文件进行序列化
FileInputStream fis = new FileInputStream(getXMLFile(request, xmlFileName));
return saxReader.read(fis);
}
/**
* @param request
* @return
* 获取某个指定preparents的配置属性
*/
@SuppressWarnings("unchecked")
private static Map getXmlMap(HttpServletRequest request,String xmlFileName) throws Exception{
//xml中的访问路径,说明欲处理XML文件的根元素是datasource
String xPath = "//propertys/property";
//获取按照指定搜索路径得到的元素列表,这里指获取所有的datasource下的propertys元素
List result = getDocument(request,xmlFileName).selectNodes(xPath);
//属性和指定子元素的存储体
Map valueMap = new HashMap();
//遍历所得元素
Iterator iter = result.iterator();
while (iter.hasNext()) {
//获得具体的preparents元素
Element preparents = (Element) iter.next();
// 取得preparents元素的id属性的值
String propertyName = preparents.attributeValue("name");
String propertyValue = preparents.attributeValue("value");
log.info("propertyName : " + propertyName + " propertyValue : " + propertyValue);
valueMap.put(propertyName, propertyValue);
}
return valueMap;
}
/**
*
* <B>Description:</B>方法描述 数据库备份<BR>
* <B>Param:</B><BR>
* <B>Return:ActionForward</B><BR>
* <B>Author:刘成</B><BR>
* <B>Apr 2, 2010</B><BR>
*/
public ActionForward doCopyData(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
response.setContentType("text/html;charset=utf-8");
//获取流
PrintWriter out = response.getWriter();
String xmlFilename = "/WEB-INF/classes/jdbc.xml";
Boolean result = false;
try {
Map map = UserAction.getXmlMap(request,xmlFilename);
String url = (String) map.get("url");
String username = (String) map.get("username");
String password = (String) map.get("password");
String database = (String) map.get("db");
String port = (String) map.get("port");
//检查数据库连接是否正确
int value = UserAction.DataConnection("jdbc:mysql://"+url+":"+port+"/"+database, username, password);
if(value != 0){
out.print("备份失败, 数据库连接配置错误 联系管理员!");
return null;
}
//构造数据库备份命令
String sqlCommand = "mysqldump -h"+url+" -u"+username+" -p"+password+" --default-character-set=utf8 "+database +" > " + fileName();
Runtime rt = Runtime.getRuntime();
Process child = rt.exec("cmd /c " + sqlCommand);
child.waitFor();
child.destroy();
result = true;
} catch (IOException e) {
// TODO: handle exception
out.print("备份失败, 生成备份文件失败 检查是否有创建权限!");
out.flush();
out.close();
return null;
}
log.info("数据库备份成功");
//将流打到客户端
out.print("备份成功 请于 d:/goldenbean/db 目录下查看!");
//清空缓存
out.flush();
//关闭流
out.close();
return null;
}
备份到这里结束。xml的解析都没什么问题。就是那个备份执行的那个命令。
刚开始。 Runtime rt = Runtime.getRuntime();
Process child = rt.exec("cmd /c " + sqlCommand);
这句 我没有加 cmd /c 也成功执行了。但是就是没有生成文件。然后就用child.getInputStream();得到流生成文件。也生成成功了。可是后来做到还原的时候。命令也是执行了。但是还是没反应。所以就上网百度。原来要加个cmd /c linux 好像 是sh
数据库的还原:
大体和上边都是差不多 也是 判断配置文件是否正确。判断数据库用户名。密码。客户端选择一个sql文件 。上传到服务器的 目录下 然后还原其实就是
String sqlCommand = "mysqldump -h"+url+" -u"+username+" -p"+password+" --default-character-set=utf8 "+database +" <" + fileName();
这条命令 中 '>' 这个符号 '>c:/a.sql' 是备份到那个目录下 '<c:/a.sql' 是通过那个目录下的文件还原
3.报表的查询。
有几个报表.其中有一个比较复杂。根据某张表的某个字段的类型分组排序。还要和别的表关联。真是麻烦。我当时想到了存储过程。其实在java中搞了这么久。没怎么用过存储过程。然后那天写了一个。
发现还行。
就简单描述一下怎么在hiberante 中使用存储过程。
首先。我们建一个简单的存储过程 :
create procedure(in doctor varchar(50))
begin
select id,aa,bb,cc,dd from table where doctor = doctor
end;
大概就是这个意思。设计的比这个复杂的多。根据传入的参数返回一些汇总信息。
那么在hibernate中怎么配呢。
我是建了一张表 表中的类容和上边查询的对应 id aa bb cc dd 字段。
也可以不用建表。为什么建呢。是因为hibernate 可以根据aa bb cc 得到对应的pojo反射生成对象。 如果不建表返回的可是 query.list 中可是 object[] 数组
hibernate: 配置文件
<hibernate-mapping>
<class name="cn.goldenbean.database.cost.to.TblReportChargesDetail" table="TBL_REPORT_CHARGES_DETAIL" catalog="his">
<id name="id" type="java.lang.Integer">
<column name="ID" />
<generator class="native" />
</id>
<property name="doctor" type="java.lang.String">
<column name="DOCTOR">
<comment>医生</comment>
</column>
</property>
<property name="checkFee" type="java.lang.Double">
<column name="CHECK_FEE" precision="10">
<comment>检查费</comment>
</column>
</property>
<property name="operaFee" type="java.lang.Double">
<column name="OPERA_FEE" precision="10">
<comment>手术费</comment>
</column>
</property>
<property name="laboratoryFee" type="java.lang.Double">
<column name="LABORATORY_FEE" precision="10">
<comment>化验费</comment>
</column>
</class>
<!--存储过程主要要配这个 name 是你 hibernate 中调用的名称 随便写-->
<sql-query name="chargesDetail" callable="true">
<!--alias 别名 class 就是你要反射生成的对象 对象中的属性 和存储过程中的对应上就可以 这样在 返回的就是一个对象了--->
<return alias="chargesDetail" class="cn.goldenbean.database.cost.to.TblReportChargesDetail">
<return-property name="doctor" column="aa"/>
<return-property name="checkFee" column="bb"/>
<return-property name="operaFee" column="cc"/>
<return-property name="laboratoryFee" column="dd"/>
</return>
{call chargesDetail(?)} <!--数据库中的存储过程名 有几个参数写几个 ? 用逗号隔开。-->
</sql-query>
</hibernate-mapping>
在dao中如何调用呢。
先得到hibernate 的 Session
org.hibernate.Session session = this.getSession();
Query query = session.getNamedQuery("chargesDetail");//调用存储过程
query.setParameter(0, doctor); //注册参数 从下标0 开始
query.list();//这个list 返回的就是 对象的集合
// return (TblReportChargesDetail) query.list().get(0); 我的只需要第一条。
别的就没什么了。
框架的搭建什么的。都是那样。ssh
哎。发现写总结真是不会写。好难。