SSH_Annotaction高配架构,综合我多年的架构运用,以及个人理论加强,加以配置改良,实用性应该是比较方便,快捷的了,如果有再厉害的,我就五体投地了~
转正题:
首先上底层Dao封装:
BaseDao
package com.zwd.dao;
import java.io.Serializable;
import java.util.List;
import com.zwd.utils.PageUtil;
public interface BaseDao<E> {
public Long saveEntity(E e);
public void updateEntity(E e);
public void deleteEntity(E e);
public void deleteEntityById(Serializable id);
public E loadEntity(final Class<E> class1, final Serializable id);
public E loadEntityById(Serializable id);
public List<E> loadListEntities(PageUtil page);
public List<E> loadListAllEntities();
}
PS:除了最基本的CRUD,还封装了一切常用的分页,批量层接口
BaseDaoImpl:
package com.zwd.dao.impl;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.sql.SQLException;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.zwd.dao.BaseDao;
import com.zwd.utils.PageUtil;
public class BaseDaoImpl<E> extends HibernateDaoSupport implements BaseDao<E> {
private Class<E> cls;
public BaseDaoImpl() {
// 就是要获取E的真实数据类型
cls = (Class<E>) ((ParameterizedType) this.getClass().getGenericSuperclass()).getActualTypeArguments()[0];
}
public Long saveEntity(E e) {
return (Long) this.getHibernateTemplate().save(e);
}
public void updateEntity(E e) {
this.getHibernateTemplate().update(e);
}
public void deleteEntity(E e) {
this.getHibernateTemplate().delete(e);
}
public E loadEntity(final Class<E> class1, final Serializable id) {
return this.getHibernateTemplate().get(class1, id);
}
public E loadEntityById(Serializable id) {
return (E) loadEntity(cls, id);
}
@SuppressWarnings("unchecked")
public List<E> loadListEntities(final PageUtil page) {
return this.getHibernateTemplate().executeFind(new HibernateCallback<List<E>>() {
public List<E> doInHibernate(Session session) throws HibernateException, SQLException {
Long totalL = (Long) session.createQuery("select count(*) from " + page.getModelName()).uniqueResult();
page.setTotalCount(totalL.intValue());
return session.createQuery("from " + page.getModelName()+" a order by a.id desc").setFirstResult((page.getPageNow() - 1) * page.getPageSize()).setMaxResults(page.getPageSize()).list();
}
});
}
public void deleteEntityById(Serializable id) {
deleteEntity(loadEntityById(id));
}
public List<E> loadListAllEntities() {
return this.getHibernateTemplate().executeFind(new HibernateCallback<List<E>>() {
public List<E> doInHibernate(Session session) throws HibernateException, SQLException {
return session.createQuery("from " + cls.getName() +" a order by a.id desc").list();
}
});
}
}
BaseService:
package com.zwd.service;
import java.io.Serializable;
import java.util.List;
import com.zwd.utils.PageUtil;
public interface BaseService<E> {
public Long saveEntity(E e);
public void updateEntity(E e);
public void deleteEntity(E e);
public void deleteEntityById(Serializable id);
public E loadEntity(final Class<E> class1, final Serializable id);
public E loadEntityById(Serializable id);
public List<E> loadListEntities(PageUtil page);
public List<E> loadListAllEntities();
}
BaseServiceImpl:
package com.zwd.service.impl;
import java.io.Serializable;
import java.util.List;
import com.zwd.dao.BaseDao;
import com.zwd.service.BaseService;
import com.zwd.utils.PageUtil;
public class BaseServiceImpl<E> implements BaseService<E>{
protected BaseDao<E> baseDao;
public Long saveEntity(E e) {
return baseDao.saveEntity(e);
}
public void updateEntity(E e) {
baseDao.updateEntity(e);
}
public void deleteEntity(E e) {
baseDao.deleteEntity(e);
}
public void deleteEntityById(Serializable id) {
baseDao.deleteEntityById(id);
}
public E loadEntity(Class<E> class1, Serializable id) {
return baseDao.loadEntity(class1, id);
}
public E loadEntityById(Serializable id) {
return baseDao.loadEntityById(id);
}
public List<E> loadListEntities(PageUtil page) {
return baseDao.loadListEntities(page);
}
public List<E> loadListAllEntities() {
return baseDao.loadListAllEntities();
}
public BaseDao<E> getBaseDao() {
return baseDao;
}
public void setBaseDao(BaseDao<E> baseDao) {
this.baseDao = baseDao;
}
}
PS:底层封装无非就是为子类服务的,不一定要复杂,相反越简单越好,不累赘,此乃精华之所在--------------------------------------------------------------------------- 华丽的分界线 -------------------------------------------------------------------------------------------------------------------
以下便是演员登场:
Model:(这个以User为例子)
package com.zwd.model;
import javax.persistence.Entity;
@Entity
public class User extends BaseModel {
private String name;
private String password;
private String depart;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDepart() {
return depart;
}
public void setDepart(String depart) {
this.depart = depart;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
PS:这个我每个Model都继承BaseModel,其实实际开发可以不做,这个我也只是尝试运用Hibernate的其中一种建表模式而已(纯个人实践)
UserAction:
package com.zwd.action;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpRequest;
import org.springframework.stereotype.Controller;
import com.google.gson.Gson;
import com.opensymphony.xwork2.ActionSupport;
import com.zwd.model.User;
import com.zwd.service.UserService;
import com.zwd.utils.PageUtil;
import com.zwd.utils.UserUtil;
@Controller("UserAction")
public class UserAction extends ActionSupport {
@Autowired
private UserService userService;
private List<User> userList;
private User user;
private long userId;
private PageUtil page;
private String test;
public String userIndex() {
if (UserUtil.isLogin()) {
page.setModelName("User");
if (page.getPageNow() == 0)
page.setPageNow(1);
if (page.getPageSize() == 0)
page.setPageSize(20);
userList = userService.loadListEntities(page);
return SUCCESS;
}
return LOGIN;
}
public String addUser() throws Exception {
if (UserUtil.isLogin()) {
user.setCreateTime(new Date());
user.setUpdateTime(new Date());
Long resultId = userService.saveEntity(user);
if (null != resultId && resultId > 0) {
HttpServletResponse response = ServletActionContext.getResponse();
response.setCharacterEncoding("UTF-8");
PrintWriter pw = response.getWriter();
pw.write(resultId.toString());
pw.flush();
pw.close();
}
}
return null;
}
public String loadUser() throws IOException {
if (UserUtil.isLogin()) {
userList = userService.loadListAllEntities();
Gson gson = new Gson();
String json = gson.toJson(userList);
HttpServletResponse response = ServletActionContext.getResponse();
response.setCharacterEncoding("UTF-8");
PrintWriter pw = response.getWriter();
pw.write(json);
pw.flush();
pw.close();
}
return null;
}
public String loginUser() {
try{
User u = userService.loginUser(user);
}catch (Exception e) {
e.printStackTrace();
}
/*HttpSession session = ServletActionContext.getRequest().getSession();
if (null != u) {
session.setAttribute("user", u);
return SUCCESS;
}*/
test = "账号或密码不正确!";
return LOGIN;
}
public String logoutUser() {
UserUtil.logout();
return SUCCESS;
}
public String delUser() {
if (UserUtil.isLogin()) {
userService.deleteEntityById(userId);
return SUCCESS;
}
return LOGIN;
}
public String UnitUser() {
User user = new User();
user.setName("admin");
user.setPassword("123456");
userService.saveEntity(user);
user.setName("caiwu");
user.setPassword("123456");
userService.saveEntity(user);
return SUCCESS;
}
public String updateUser() {
if (UserUtil.isLogin()) {
user.setUpdateTime(new Date());
userService.updateEntity(user);
return SUCCESS;
}
return LOGIN;
}
//省略get set
}
UserService:(当然继承BaseService,并自己拥有独立的接口封装)
package com.zwd.service;
import com.zwd.model.User;
public interface UserService extends BaseService<User>{
public User loginUser(User u);
}
UserServiceImpl:(当然继承BaseService,实现自己拥有独立的接口封装)
package com.zwd.service.impl;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.zwd.dao.BaseDao;
import com.zwd.dao.ProductDao;
import com.zwd.dao.UserDao;
import com.zwd.model.Product;
import com.zwd.model.User;
import com.zwd.service.UserService;
@Service("userService")
public class UserServiceImpl extends BaseServiceImpl<User> implements UserService {
/** 使用其他dao *//*
private BaseDao<Product> productDao;
@Resource(name = "productDao")
public void setProductDao(BaseDao<Product> productDao) {
this.productDao = productDao;
}*/
@Resource
private UserDao userDao;
@Resource
private ProductDao productDao;
public User loginUser(User u) {
try {
Product p = new Product();
p.setName("234234");
productDao.saveEntity(p);
//int i = 2 / 0;
User user = new User();
user.setName("5tttttttttt");
userDao.saveEntity(user);
} catch (Exception e) {
// 如果注释掉throw new RuntimeException,那么事务将不能回滚,因为spring捕捉不到Exception
// 解决办法,去掉try catch,或者在cache中抛出异常以便spring捕获
throw new RuntimeException("运行时出错!");
}
return userDao.loginUser(u);
}
}
UserDao:(当然继承BaseDao,并自己拥有独立的接口封装)
package com.zwd.dao;
import com.zwd.model.User;
public interface UserDao extends BaseDao<User>{
public User loginUser(User u);
}
UserDaoImpl:
package com.zwd.dao.impl;
import java.sql.SQLException;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.stereotype.Repository;
import com.zwd.dao.UserDao;
import com.zwd.model.User;
@Repository(value = "userDao")
public class UserDaoImpl extends BaseDaoImpl<User> implements UserDao {
public User loginUser(final User user) {
return this.getHibernateTemplate().execute(new HibernateCallback<User>() {
public User doInHibernate(Session session) throws HibernateException, SQLException {
Query query = session.createQuery("from User u where u.name ='" + user.getName() + "'and u.password ='" + user.getPassword() + "'");
User u = (User) query.uniqueResult();
return u;
}
});
}
}
以上是基本的架构,其他分页什么都封装就不一一展示了,我会上传我的整个项目的,等资源出来,我在贴上地址
还有struts.xml,applicationContext.xml等配置信息,都会在项目中获取到,如果有心去下整个项目吧
另外有些人遇到同一个service不能注入两个或以上的dao,这里也不会出现,我经过研究也就克服了这个难点了,有问题可以留言,我看到会恢复的哦