发表于: 2018-02-26 23:48:34

1 348


今天做的事情:



              将一个SSH的小项目做完,基本功能有,列表,查看,修改,删除,分页,下拉框每页显示条数,修改密码,新增,多条件查询。



               结构:

                          Emp 员工表  Dept 部门表, 一对多的关系, 在实体类中,emp表中,有 Dept dept字段,而在数据库表中,emp是有did字段。


              

               hibernate有反向生成表的功能,很方便。


                可以根据这个 .hbm.xml 配置文件,设置好关系


                   下面是测试方法,运行,可以在数据库生成表。

@Test
public void testA(){
Configuration configuration = new Configuration();

   configuration.configure("hibernate.cfg.xml");

   SessionFactory sessionFactory = configuration.buildSessionFactory();

   Session session = sessionFactory.openSession();
   Transaction transaction = session.beginTransaction();
   List list = session.createQuery("from Emp ").list();
   Emp emp = (Emp) list.get(3);
   emp.setEpwd("11111111111");
   session.update(emp);
   transaction.commit();
   System.out.println(emp);
}



              或者:



                   百度查一下IDEA怎么链接Mysql,获取数据库的表,再添加IDEA中SSH的配置,生成实体类和hbm.xml的配置文件。




                环境问题:


                       这个比较烦,搞了很久,因为jar依赖不好寻找,直接百度,都是积分直接下载,没有依赖。


                       东拼西凑,将hibernate的几个核心包,spring的所有包,以及struts的包,还有servlet的包,在jsp上的C标签的引用,


                       用了一天半的时间完成以上工作,原因:对于SSH印象太模糊了,重新再看,需要一点时间。




                 开始代码:



                             实际上,增删改查和调试,完成用了下午及晚上。算是半天。


                  在之后,寻找分页工具类,幸好之前项目有,还熟悉一点,很快完成了。



                   而,出现的问题有:忘记加日志输出。 还有判空操作,还有try catch 。


                   可能年假玩的天开心了,有点遗忘,还有一个特别打的失误,就是做项目前,先花时间,构思,怎么去做。



                  做到一半,乃至最后,才发现,啊,原来优先级搞错了,如果先写这个功能,能省好多事情。或者是,写完这个方法,发现在这个方法要加参数,这样好烦,不想再改。



                  关于多条件查询,在微信端的求学大作战中,已经使用,只不过,是用了公司工具类判断空之类的,还有拼接sql,只需要改改参数就可以,这次是自己动手拼接。


                  一开始是将模糊查询和列表结合起来写好了。但是后来又发现,需要和多条件查询一起写。。


                 心里不愿意啊,就另写一个接口方法。


                     点击查询之后,将根据条件查询的数据,再放回来,但是,这个逻辑有问题。


                     ajax提交条件之后,查出来,返回到页面,再通过ajax的success回调,再返回action的方法,再回到列表页面。。。


                     上面的思路是错的,不能跳转。。


                    后来,决定,重写查询列表方法、哎。。



                     贴一下代码:

          

//列表
public String list() throws Exception {

   if(mohu == null){
    mohu ="";
   }else{
      System.out.println(mohu);
       //处理get提交乱码
       //mohu = new String(mohu.getBytes("iso-8859-1"), "utf-8");
       //  System.out.println(mohu);
   }

    //objs是下拉框change的值,没传过来
    if( objs !=0){
      this.pageSize = objs;
    }else{
      this.pageSize = 10;
    }
     System.out.println("页数变没变:"+pageSize);
     System.out.println("看看下拉框都于什么"+emp);
     if(emp != null){
       list = empService.list(currentPage, pageSize, mohu,emp);
        int count = empService.listCount(mohu);
        //
        HttpServletRequest request = ServletActionContext.getRequest();
        //
        String url="emp_list.action?mohu="+mohu;//带着模糊查询的数据
        //使用分页工具类
        ToolPage.page(request, currentPage, pageSize, url, count, list);
    }else{
       emps = empService.lists(currentPage, pageSize, mohu);
        int count = empService.listCount(mohu);
        //
        HttpServletRequest request = ServletActionContext.getRequest();
        //
        ServletActionContext.getRequest().getSession().setAttribute("list", emps);
        String url="emp_list.action?mohu="+mohu;//带着模糊查询的数据
        //使用分页工具类
        ToolPage.page(request, currentPage, pageSize, url, count, emps);
    }


      return "list";

}

                      


               写了两个list方法,区别是参数少了一个,,,


                没办法。。。。


               现在想想,其实可以在dao层,判断emp是否为空。为空就不加emp的属性去查询。这样就省很多方法,在action中判断。我多写了。两个接口,两个实现方法,在action中多了几行重复代码。。可以优化一波。。


               关于速度,只要不是脑残的想错怎么实现,一般速度都可以,毕竟这么少的数据,那么慢,没道理的。


                再贴一下自己拼接的hql语句,查了几小时的百度,哎。最后低头,问问别人吧,身边没人会,就去别的技术讨论群问,一个老哥随口一说,就解决了我的问题、


                Dao的查询方法:


@Override
public List<Emp> list(int currentPage,int pageSize,String mohu,Emp emp) {
List list =null;
   Dept dept =null;
   if(emp!=null){
System.out.println("看看dao的下拉框都有什么"+emp);
       Session session = sessionFactory.openSession();

        dept = emp.getDept();
       StringBuffer hql=new StringBuffer();
       hql.append("from Emp e left join fetch e.dept as d where 1=1  and  e.ename like '%"+mohu+"%'");
       // hql.append("from Emp e where 1=1 and e.ename like '%"+mohu+"%' ");
       if(emp.getLevel()!=null && emp.getLevel()!=0){
      //hql.append("and level= '").append(emp.getLevel()).append("'");
           hql.append("and e.level= '"+emp.getLevel()).append("' ");
       }
      if(emp.getSix()!=null && !emp.getSix().equals(0)){
        hql.append("and e.six= '"+emp.getSix()).append("' ");
       }
      if(emp.getHobby()!=null && !emp.getHobby().equals("0")){
        hql.append("and e.hobby like '%"+emp.getHobby()+"%'").append(" ");
       }
      if(!dept.getDname().equals(0) && dept.getDname()!=null && !dept.getDname().equals("")){
        hql.append("and d.dname='"+ dept.getDname()).append("'");
       }
      if(dept.getDlocation()!=null && !dept.getDlocation().equals("")){
        hql.append(" and d.dlocation like '%"+ dept.getDlocation()+"%'").append("");
       }
      if(emp.getWages()!=null){
      if(emp.getWages().equals(2)){
        hql.append("order by e.wages desc");
        }else{
        hql.append("order by e.wages ");
        }
       }
       System.out.println(hql.toString());
         Query query = session.createQuery(hql.toString()).setFirstResult(currentPage * pageSize)
        .setMaxResults(pageSize);

        list = query.list();
     }
      return list;
}



            从一开始建项目,都是自己写的,效果出来了,很开心。


            关于hql,真的是,之前也做过,但是没写过这样的hql语句,都是 from Emp 。完事。。



 

遇到的问题:


              1 jar包依赖,以及配置文件。

    

               2 生成表,以及hbm.xml


               3 增删改查的调试 。 from表单提交和SSM不一样,例如 <input name="emp.ename" >


               4 构思,逻辑


               


收获:



                  一个简单SSH的小demo完成。



               



返回列表 返回列表
评论

    分享到