基于SSH编写通用的DAOServiceAction

Posted 品尝这杯浓咖啡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了基于SSH编写通用的DAOServiceAction相关的知识,希望对你有一定的参考价值。

1.创建项目


2.Dao

package cn.opencil.core.base.dao;

import java.io.Serializable;
import java.util.Collection;
import java.util.Set;

import cn.opencil.common.util.PageResult;
import cn.opencil.core.query.BaseQuery;


public interface BaseDao<T> 

	/**
	 * 分页的查询
	 * @param baseQuery
	 * @return
	 */
	public PageResult<T> getPageResult(final BaseQuery baseQuery);
	
	/**
	 * 查询某一张表的总的记录数
	 */
	public int getCount(final BaseQuery baseQuery);
	/**
	 * 添加
	 * @param t
	 */
	public void addEntry(T t);
	
	/**
	 * 查询一个
	 * @return
	 */
	public T getEntryById(Serializable id);
	
	/**
	 * 按ids查询
	 */
	public Set<T> getEntrysByIds(Serializable[] ids);
	
	/**
	 * 不分页的查询
	 * @return
	 */
	public Collection<T> getEntrys();
	
	/**
	 * 修改
	 * @param t
	 */
	public void updateEntry(T t);
	
	/**
	 * 根据ids删除一些数据
	 * @param ids
	 */
	public void deleteEntriesByIDS(Serializable[] ids);
	
	/**
	 * 根据id删除一条数据
	 * @param id
	 */
	public void deleteEntry(Serializable id);
	


3.DaoImpl

package cn.opencil.core.base.dao.impl;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.SQLException;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.metadata.ClassMetadata;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;

import cn.opencil.common.util.PageResult;
import cn.opencil.core.base.dao.BaseDao;
import cn.opencil.core.query.BaseQuery;

public class BaseDaoImpl<T> implements BaseDao<T> 

	Class entityClass;
	ClassMetadata classMetadata;
	@Resource(name = "hibernateTemplate")
	private HibernateTemplate hibernateTemplate;

	public HibernateTemplate getHibernateTemplate() 
		return hibernateTemplate;
	

	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) 
		this.hibernateTemplate = hibernateTemplate;
	

	@PostConstruct
	public void init() 
		this.classMetadata = this.hibernateTemplate//
				.getSessionFactory()//
				.getClassMetadata(entityClass);
	

	public BaseDaoImpl() 
		Type superclass = this.getClass().getGenericSuperclass();
		ParameterizedType type = (ParameterizedType) superclass;
		Type[] args = type.getActualTypeArguments();
		entityClass = (Class) ((null != args && args.length > 0) ? args[0]
				: null);
	

	@Override
	public void addEntry(T t) 
		this.hibernateTemplate.save(t);
	

	@Override
	public T getEntryById(Serializable id) 

		return (T) this.hibernateTemplate.get(entityClass, id);
	

	@Override
	public Collection<T> getEntrys() 

		return this.hibernateTemplate.find("from "
				+ this.entityClass.getSimpleName());
	

	@Override
	public void updateEntry(T t) 
		this.hibernateTemplate.update(t);
	

	@Override
	public void deleteEntriesByIDS(Serializable[] ids) 
		StringBuilder builder = new StringBuilder();
		for (int i = 0; i < ids.length; i++) 
			if (i == ids.length - 1) 
				builder.append(ids[i]);
			 else 
				builder.append(ids[i]).append(",");
			
		

		StringBuilder hql = new StringBuilder();
		hql.append("from " + entityClass.getSimpleName()); 
				hql.append(" where ");
				hql.append(this.classMetadata.getIdentifierPropertyName());
				hql.append(" in (");
				hql.append(builder.toString() + " )");
		List list = this.hibernateTemplate.find(hql.toString());
		this.hibernateTemplate.deleteAll(list);
	

	@Override
	public void deleteEntry(Serializable id) 
		T t = (T) this.hibernateTemplate.get(entityClass, id);
		this.hibernateTemplate.delete(t);

	
	

	@Override
	public int getCount(final BaseQuery baseQuery) 
	
		
		return this.hibernateTemplate.execute(new HibernateCallback<Integer>() 

			@Override
			public Integer doInHibernate(Session session) throws HibernateException,
					SQLException 
				StringBuilder hql = new StringBuilder();
				/**
				 * 使用select count(1) 报错?
				 */
				hql.append("select count("+classMetadata.getIdentifierPropertyName()+") from ");
				String name = entityClass.getSimpleName();
				hql.append(name);
				hql.append(" where 1 = 1 ");
				Map<String, Object> buildWhere = baseQuery.buildWhere();
				
				/**
				 * 构造 where 1 = 1 and key =: key
				 */
				for(Entry<String, Object> entry : buildWhere.entrySet())
					hql.append(" and "+entry.getKey() + " =: "+entry.getKey());
				
			
				Query query = session.createQuery(hql.toString());
				
				for (Entry<String, Object> entry : buildWhere.entrySet()) 
					query.setParameter(entry.getKey(), entry.getValue());
				
				
				Long count = (Long) query.uniqueResult();
				
				return count.intValue();
			
		);
	

	@Override
	public PageResult<T> getPageResult(final BaseQuery baseQuery) 
		//找到符合条件的总记录数
		final int count = this.getCount(baseQuery);
		return this.hibernateTemplate.execute(new HibernateCallback<PageResult<T>>() 

			@Override
			public PageResult<T> doInHibernate(Session session) throws HibernateException,
					SQLException 
				StringBuilder hql = new StringBuilder();
				hql.append("from "+entityClass.getSimpleName() + " where 1 = 1 ");
				Map<String, Object> whereKV = baseQuery.buildWhere();
				
				for(Entry<String,Object> entry : whereKV.entrySet())
					hql.append(" and "+entry.getKey()+" =: "+entry.getKey() );
				
				
				Query query = session.createQuery(hql.toString());
				
				for(Entry<String,Object> entry : whereKV.entrySet())
					query.setParameter(entry.getKey(), entry.getValue());
				
				
				//分页
				int firstResult = (baseQuery.getCurrentPage()-1)*baseQuery.getPageSize();
				query.setFirstResult(firstResult).setMaxResults(baseQuery.getPageSize());
				PageResult<T> pageResult = new PageResult<T>(baseQuery.getCurrentPage(),baseQuery.getPageSize(),count);
				List list = query.list();
				pageResult.setRows(list);
				return pageResult;
			
		);
	
	

	
	@Override
	public Set<T> getEntrysByIds(Serializable[] ids) 
		
		StringBuilder id = new StringBuilder();
		if(ids!=null && ids.length>0)
			for (int i = 0;i<ids.length;i++) 
				if(i==ids.length-1)
					id.append(ids[i]);
				else
					id.append(ids[i]).append(",");
				
			
		
		
		StringBuilder hql = new StringBuilder();
		hql.append("from "+this.entityClass.getSimpleName()+" where 1 = 1 ");
		hql.append(" and "+this.classMetadata.getIdentifierPropertyName()+" in("+id+")");
		List list = this.hibernateTemplate.find(hql.toString());
		return new HashSet(list);
	



4.Service

package cn.opencil.core.base.service;

import java.io.Serializable;
import java.util.Collection;
import java.util.Set;

import cn.opencil.common.util.PageResult;
import cn.opencil.core.query.BaseQuery;


public interface BaseService<T> 
	/**
	 * 分页的查询
	 * @param baseQuery
	 * @return
	 */
	public PageResult<T> getPageResult(final BaseQuery baseQuery);
	/**
	 * 添加
	 * 
	 * @param t
	 */
	public void addEntry(T t);

	/**
	 * 查询一个
	 * 
	 * @return
	 */
	public T getEntryById(Serializable id);
	/**
	 * 按ids查询
	 */
	public Set<T> getEntrysByIds(Serializable[] ids);
	
	/**
	 * 不分页的查询
	 * 
	 * @return
	 */
	public Collection<T> getEntrys();

	/**
	 * 修改
	 * 
	 * @param t
	 */
	public void updateEntry(T t);

	/**
	 * 根据ids删除一些数据
	 * 
	 * @param ids
	 */
	public void deleteEntriesByIDS(Serializable[] ids);

	/**
	 * 根据id删除一条数据
	 * 
	 * @param id
	 */
	public void deleteEntry(Serializable id);



5.serviceImpl

package cn.opencil.core.base.service.impl;

import java.io.Serializable;
import java.util.Collection;
import java.util.Set;

import org.springframework.transaction.annotation.Transactional;

import cn.opencil.common.util.PageResult;
import cn.opencil.core.base.dao.BaseDao;
import cn.opencil.core.base.service.BaseService;
import cn.opencil.core.query.BaseQuery;

/**
 * Project Name:SC
 * File Name:BaseServiceImpl.java
 * Date:2016-3-25下午9:30:28
 * Author : 王基伟
 * @param <T>
 * @param <T>
 *
 */
public abstract class BaseServiceImpl<T> implements BaseService<T>

	public abstract BaseDao getBaseDao();//此种实现可提高扩展性
	
	public PageResult<T> getPageResult(final BaseQuery baseQuery)
		return this.getBaseDao().getPageResult(baseQuery);
	
	
	@Transactional
	@Override
	public void addEntry(T t) 
		this.getBaseDao().addEntry(t);
		
	

	@Override
	public T getEntryById(Serializable id) 
		return (T) this.getBaseDao().getEntryById(id);
	
	@Override
	public Set<T> getEntrysByIds(Serializable [] ids)
		return this.getBaseDao().getEntrysByIds(ids);
	
	
	@Override
	public Collection<T> getEntrys() 
		// TODO Auto-generated method stub
		return this.getBaseDao().getEntrys();
	
	@Transactional
	@Override
	public void updateEntry(T t) 
		this.getBaseDao().updateEntry(t);
		
	
	@Transactional
	@Override
	public void deleteEntriesByIDS(Serializable[] ids) 
		this.getBaseDao().deleteEntriesByIDS(ids);
	
	@Transactional
	@Override
	public void deleteEntry(Serializable id) 
		this.getBaseDao().deleteEntry(id);
	


6.Action

package cn.opencil.core.base.action;

import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.ServletActionContext;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;

/**
 * Project Name:SC
 * File Name:BaseAction.java
 * Date:2016-3-25下午9:33:10
 * Author : 王基伟
 *
 */
public class BaseAction<T> extends ActionSupport implements ModelDriven<T>,ServletRequestAware,ServletResponseAware

	private HttpServletRequest request;
	private HttpServletResponse response;
	
	

	Class entityClass;
	T t;
	/**
	 * 解析泛型
	 */
	public BaseAction()
		Type superclass = this.getClass().getGenericSuperclass();
		ParameterizedType type = (ParameterizedType) superclass;
		Type[] args = type.getActualTypeArguments();
		entityClass = (Class) ((null != args && args.length > 0) ? args[0]
				: null);
		try 
			this.t = (T) entityClass.newInstance();
		 catch (Exception e) 
			e.printStackTrace();
		
	
	
	@Override
	public T getModel() 
		
		return this.t;
	
	
	public HttpSession getSession()
		return ServletActionContext.getRequest().getSession();
	
	
	private int currentPage = 1;
	
	
	public int getCurrentPage() 
		return currentPage;
	

	public void setCurrentPage(int currentPage) 
		this.currentPage = currentPage;
	

	private Long [] ids;
	
	public Long[] getIds() 
		return ids;
	

	public void setIds(Long[] ids) 
		this.ids = ids;
	

	public static final String LISTACTION = "listAction";//跳转到列表页面的字符串
	public String listAction = LISTACTION;
	
	public static final String ACTION2ACTION = "action2action";//action跳转到action
	public String action2action = ACTION2ACTION;
	
	public static final String ACTIONRACTION = "actionRaction";//action重定向到action
	public String actionRaction = ACTIONRACTION;
	
	public static final String ADDUI = "addUI";
	public String addUI = ADDUI;
	
	public static final String UPDATEUI = "updateUI";
	public String updateUI = UPDATEUI;
	@Override
	public void setServletRequest(HttpServletRequest request) 
		
		this.request = request;
	

	@Override
	public void setServletResponse(HttpServletResponse response) 

		this.response = response;
	
	
	public HttpServletRequest getRequest() 
		return request;
	

	public HttpServletResponse getResponse() 
		return response;
	


好处:

以后所有的Service可以直接继承,不需要再编写代码(CRUD操作,不涉及到特殊需求)

public interface DepartmentService extends BaseService<Department>
	public static final String SERVICENAME = "cn.opencil.core.basedata.service.impl.DepartmentServiceImpl";


DepartmentServiceImpl

@Service(DepartmentService.SERVICENAME)
public class DepartmentServiceImpl extends BaseServiceImpl<Department> implements DepartmentService

	@Resource(name=DepartmentDao.DAONAME)	
	private DepartmentDao departmentDao;
	
	@Override
	public BaseDao getBaseDao() 
		// TODO Auto-generated method stub
		return this.departmentDao;
	



DepartmentDaoImpl

@Repository(DepartmentDao.DAONAME)
public class DepartmentDaoImpl extends BaseDaoImpl<Department> implements DepartmentDao 




以上是关于基于SSH编写通用的DAOServiceAction的主要内容,如果未能解决你的问题,请参考以下文章

通过 Python 脚本拒绝所有用户基于密码的 SSH 登录

ansible剧本编写

通过 shell 脚本基于变量主机名从 ssh 配置中获取 IdentityFile

基于Xposed和Substrate的通用性SO注入

更加优雅地搭建SSH框架(使用java配置)

使用 SSH 的 PAM 模块