医院收费系统 一点的简单总结

开发框架  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 返回的就是 对象的集合


       // if(query.list().size() > 0)  

         // return  (TblReportChargesDetail) query.list().get(0); 我的只需要第一条。

别的就没什么了。

框架的搭建什么的。都是那样。ssh 

 哎。发现写总结真是不会写。好难。

原文地址:https://www.cnblogs.com/lyglcheng/p/1707387.html