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


    开发框架  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 

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

  • 相关阅读:
    c博客作业05--指针
    C博客作业04--数组
    C博客作业03--函数
    C博客作业02--循环结构
    C博客作业01--分支、顺序结构
    我的第一篇博客
    DS博客作业05--查找
    DS博客作业04--图
    DS博客作业03--树
    DS博客作业02--栈和队列
  • 原文地址:https://www.cnblogs.com/lyglcheng/p/1707387.html
Copyright © 2020-2023  润新知