数据访问层代码优化
entity包中的类叫业务模型,从图中可以看出每一个业务模型在dao层中都有一个对应的类,其中的方法基本相同,为了减少代码的重复,将dao层改为一个公用的类,主要需要修改的是:更改参数,将之前传入对象参数的方法的参数类型改为Object;方法中需要写查询语句的方法,将语句通过String的参数传递;将返回值为list中的泛型更改为?;返回值为对象的方法的返回值改为Object类型。
package com.hibernate.dao;
import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import com.hibernate.entity.User;
import com.hibernate.until.HibernateUntil;
public class BaseDao {
@SuppressWarnings("unchecked")
public static List<?> findAll(String HQL){
Session session =HibernateUntil.getSession();
List<?> list=null;
try {
list=session.createQuery(HQL).list();
} catch (Exception e) {
e.printStackTrace();
}finally {
HibernateUntil.closeSession(session);
}
return list;
}
public void delUser(Object object){
Session session=HibernateUntil.getSession();
try {
session.beginTransaction().begin();
session.delete(object);
session.beginTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.beginTransaction().rollback();
}finally{
HibernateUntil.closeSession(session);
}
}
public static void saveOrUpdate(Object object){
Session session=HibernateUntil.getSession();
try {
session.beginTransaction().begin();
session.saveOrUpdate(object);
session.beginTransaction().commit();
} catch (Exception e) {
e.printStackTrace();
session.beginTransaction().rollback();
}finally{
HibernateUntil.closeSession(session);
}
}
public static Object getUser(String HQL){
Session session=HibernateUntil.getSession();
Query query=session.createQuery(HQL);
Object obj=(User) query.uniqueResult();
HibernateUntil.closeSession(session);
return obj;
}
}
控制器中调用含有sql语句的的方法时,因控制层要与前台进行交互,在其中直接写sql语句有点不方便,因此新建一个包里面主要负责业务逻辑专门连接dao和控制器,对于每一个类创建与之对应的业务逻辑类。
该类中包含的内容:与公用dao层方法相对应的方法,并在方法中调用dao层的方法。
package com.hibernate.service;
import java.util.List;
import com.hibernate.dao.BaseDao;
import com.hibernate.entity.Garde;
public class GardeService {
@SuppressWarnings("unchecked")
public static List<Garde> findGarde() {
return (List<Garde>) BaseDao.findAll("from Garde");
}
}
控制器层中通过业务逻辑层的类调用对应的方法。
List<Garde> garde=GardeService.findGarde();
控制器层代码优化
每一个控制器层的类都有一些相同部分:一个注解、获取response、转换为Json。因此可以通过在工具包下定义一个公用的控制器,写同样的注解将相同代码封装为一个方法,让其他的控制器继承该类。主要包括以下几个方法:获取response、获取session、获取request、将数据转换为Json格式。
package com.hibernate.until;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import org.apache.struts2.convention.annotation.ParentPackage;
import com.google.gson.Gson;
import com.opensymphony.xwork2.ActionSupport;
@ParentPackage("struts-default")
public class CommAction extends ActionSupport{
private static final long serialVersionUID = 1L;
public HttpServletRequest getRequest(){
return ServletActionContext.getRequest();
}
public HttpServletResponse getResponse(){
return ServletActionContext.getResponse();
}
public HttpSession getSession(){
return getRequest().getSession();
}
public void toJSON(Object obj) throws Exception{
getResponse().setCharacterEncoding("utf-8");
getResponse().getWriter().print(new Gson().toJson(obj));
getResponse().getWriter().flush();
getResponse().getWriter().close();
}
}