发表于: 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完成。
评论