Struts2、Hibernate、Spring整合的泛型DAO,以及通用的分页技术

 1.基本DAO泛型接口

package abu.csdn.dao; import java.io.Serializable; import java.util.Collection; import java.util.List; /** * <p/> * 使用泛型作为DAO的通用接口 这里没有提供按名称精确查找,和模糊查找 上述两个方法应该由各自的具体接口去定义 * <p/> * * @author Abu * @param <T> : * 持久化的实体Bean * @param <ID> : * 实体Bean的id */ public interface GenericDao<T, ID extends Serializable> { /** * 保存实体 * * @param entity : * 实体 * @return 保存后得到的id */ public ID save(T entity); /** * 在查找所有记录的时候,使用提供查询语句,查询匹配的记录,否则将使用默认的查询语句查询数据的所有记录. * * @param hql : 自定义的HQL语句 */ public void setHql(String hql); /** * * @return 自定义的HQL语句 */ public String getHql(); /** * <p> * 删除实体 * </p> * * @param entity : * 实体 */ public void remove(T entity); /** * <p> * 删除实体集合 * </p> * * @param entities : * 实体 */ public void removeAll(Collection<T> entities); /** * <p> * 修改实体 * </p> * * @param entity : * 实体 */ public void modify(T entity); /** * <p> * 通过名字查找 * </p> * * @param id : * id * @return 找到的实体 */ public T findById(ID id); /** * <p/> * 查找全部实体 * <p/> * * @return 所有实体的列表 */ public List<T> findAll(); /** * <p> * 计算匹配查询条件的记录总数,如果没有注入或者设置hql语句,将使用默认的查询语句返回数据库中所有记录 * </p> * * @return 记录总数 */ public int getTotalRows(); /** * <p> * 根据每页记录的数量,计算出总的分页数 * </p> * * @param size 每页记录的数量 * @return 分页总数 */ public int getPageSize(int size); /** * <p/> * 根据给定的页码进行分页查找,这是纯Hibernate分页. * <p/> * * @param page : 要查询的页码 * 查询的hql语句 * @param size : 每页记录数 * 分页信息,参见PageInfo * @return 匹配的实体列表 */ public List<T> findByPage(final int page, final int size); }  

 

2.基本DAO泛型接口的实现

package abu.csdn.dao.impl; import java.io.Serializable; import java.sql.SQLException; import java.util.Collection; import java.util.List; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.springframework.orm.hibernate3.HibernateCallback; import org.springframework.orm.hibernate3.HibernateTemplate; import abu.csdn.dao.GenericDao; /** * * @author Abu * * @param <T> * @param <ID> */ public class GenericDaoImpl<T, ID extends Serializable> implements GenericDao<T, ID> { // 具体的实体类型 private Class<T> type; // Spring提供的Hibernate工具类 private HibernateTemplate hibernateTemplate; // 查询条件 private String hql; /** * <p> * 必须提供的构造方法,以便创建实例的时候就知道具体实体的类型 * <p> * * @param type : * 实体类型 */ public GenericDaoImpl(Class<T> type) { this.type = type; this.hql = "from " + type.getName(); } /** * <p> * 因为这个类没有继承HibernateDaoSupport,所以现在由Spring注入HibernateTemplate * </p> * * @param hibernateTemplate : * Spring提供的Hibernate工具类 */ public void setHibernateTemplate(HibernateTemplate hibernateTemplate) { this.hibernateTemplate = hibernateTemplate; } public void setHql(String hql) { this.hql = hql; } public HibernateTemplate getHibernateTemplate() { return hibernateTemplate; } public String getHql() { return hql; } @SuppressWarnings("unchecked") public List<T> findAll() { String hql = "from " + type.getName(); return (List<T>) hibernateTemplate.find(hql); } @SuppressWarnings("unchecked") public T findById(ID id) { return (T) hibernateTemplate.get(type, id); } public void modify(T entity) { hibernateTemplate.update(entity); } public void remove(T entity) { hibernateTemplate.delete(entity); } public void removeAll(Collection<T> entities) { hibernateTemplate.deleteAll(entities); } @SuppressWarnings("unchecked") public ID save(T entity) { return (ID) hibernateTemplate.save(entity); } public int getTotalRows() { String actualHql = "select count(*) " + hql.substring(hql.indexOf("from")); return ((Long) this.hibernateTemplate.find(actualHql).get(0)) .intValue(); } public int getPageSize(int size) { // 最大页数 int pageSize; // 实际每页数据条数 int actualSize; // 总记录数 int totalRows = this.getTotalRows(); // 计算实际每页的条数,如果请求的每页数据条数大于总条数, 则等于总条数 actualSize = (size > totalRows) ? totalRows : size; if (totalRows > 0) { pageSize = (totalRows % size == 0) ? (totalRows / actualSize) : (totalRows / actualSize + 1); } else { pageSize = 0; } return pageSize; } @SuppressWarnings("unchecked") public List<T> findByPage(final int page, final int size) { final int pageSize = this.getPageSize(size); final int totalRows = this.getTotalRows(); return hibernateTemplate.executeFind(new HibernateCallback() { public List<T> doInHibernate(Session session) throws HibernateException, SQLException { // 实际页码 int actualPage = (page > pageSize) ? pageSize : page; // 计算实际每页的条数,如果请求的每页数据条数大于总条数, 则等于总条数 int actualSize = (size > totalRows) ? totalRows : size; // 计算请求页码的第一条记录的索引值,如果 int startRow = (actualPage > 0) ? (actualPage - 1) * actualSize : 0; Query query = session.createQuery(hql); // 设置第一条记录 query.setFirstResult(startRow); query.setMaxResults(actualSize); return (List<T>) query.list(); } }); } }  

 

3.具体的DAO接口

package abu.csdn.dao; import abu.csdn.bean.User; /** * * @author Abu * */ public interface UserDao extends GenericDao<User, Long> { /** * <p> * 根据用户名精确查找 * </p> * @param uname : 用户名 * @return : 匹配的实体 */ public User findByNameExact(String uname); }  

 

4.具体DAO接口的实现

package abu.csdn.dao.impl; import java.util.List; import abu.csdn.bean.User; import abu.csdn.dao.UserDao; /** * * @author Abu * */ public class UserDaoImpl extends GenericDaoImpl<User, Long> implements UserDao { public UserDaoImpl(Class<User> type) { super(type); } @SuppressWarnings("unchecked") public User findByNameExact(String uname) { List<User> list = (List<User>) this.getHibernateTemplate().find( "from User u where u.uname = ?", uname).get(0); return (!list.isEmpty() && list.size() == 1) ? null : list.get(0); } }  

 

5.基本泛型服务接口

package abu.csdn.service; import java.io.Serializable; import java.util.Collection; import java.util.List; /** * <p> * 基本上与泛型DAO的通用接口一致,请参见GenericDao * <p> * * @author Abu * * @param <T> : * 持久化的实体Bean * @param <ID> : * 实体Bean的id */ public interface GenericService<T, ID extends Serializable> { /** * 保存实体 * * @param entity : * 实体 * @return 保存后得到的id */ public ID save(T entity); /** * <p> * 删除实体 * </p> * * @param entity : * 实体 */ public void remove(T entity); /** * <p> * 删除实体集合 * </p> * * @param entities : * 实体 */ public void removeAll(Collection<T> entities); /** * <p> * 修改实体 * </p> * * @param entity : * 实体 */ public void modify(T entity); /** * <p> * 通过名字查找 * </p> * * @param id : * id * @return 找到的实体 */ public T findById(ID id); /** * <p> * 查找全部实体 * <p> * * @return 所有实体的列表 */ public List<T> findAll(); /** * <p> * 根据给定的hql语句进行分页查找 * <p> * * @param page : * 要查询的页码 * @param size : * 每页记录条数 * @return 匹配的实体列表 */ public List<T> findByPage(final int page, final int size); /** * <p> * 计算匹配查询条件的记录总数,如果没有注入或者设置hql语句,将使用默认的查询语句返回数据库中所有记录 * </p> * * @return 记录总数 */ public int getTotalRows(); /** * <p> * 根据每页记录的数量,计算出总的分页数 * </p> * * @param size * 每页记录的数量 * @return 分页总数 */ public int getPageSize(int size); }  

 

6.基本泛型服务接口的实现

package abu.csdn.service.impl; import java.io.Serializable; import java.util.Collection; import java.util.List; import abu.csdn.dao.GenericDao; import abu.csdn.service.GenericService; /** * * @author Abu * * @param <T> * @param <ID> */ public class GenericServiceImpl<T, ID extends Serializable> implements GenericService<T, ID> { private GenericDao<T,ID> genericDao; public List<T> findAll() { return genericDao.findAll(); } public T findById(ID id) { return genericDao.findById(id); } public List<T> findByPage(int page, int size) { return genericDao.findByPage(page, size); } public int getPageSize(int size) { return genericDao.getPageSize(size); } public int getTotalRows() { return genericDao.getTotalRows(); } public void modify(T entity) { genericDao.modify(entity); } public void remove(T entity) { genericDao.remove(entity); } public void removeAll(Collection<T> entities) { genericDao.removeAll(entities); } public ID save(T entity) { return genericDao.save(entity); } public void setGenericDao(GenericDao<T, ID> genericDao) { this.genericDao = genericDao; } }  

 

7.具体的服务接口

package abu.csdn.service; import abu.csdn.bean.User; /** * * @author Abu * */ public interface UserService extends GenericService<User, Long> { /** * <p> * 用户登录验证, 登录成功将返回该用户实体,失败则为空 * </p> * * @param uname : * 用户名 * @param upass : * 密码 * @return 用户实体 */ public User login(String uname, String upass); public void removeByUids(long [] uids); }  

 

8.具体的服务接口的实现

package abu.csdn.service.impl; import java.util.Collection; import java.util.List; import abu.csdn.bean.User; import abu.csdn.dao.UserDao; import abu.csdn.dao.impl.UserDaoImpl; import abu.csdn.service.UserService; /** * * @author Abu * */ public class UserServiceImpl implements UserService { private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public UserDao getUserDao() { return this.userDao; } public List<User> findAll() { return userDao.findAll(); } public User findById(Long id) { return userDao.findById(id); } public List<User> findByPage(int page, int size) { return userDao.findByPage(page, size); } public int getPageSize(int size) { return userDao.getPageSize(size); } public int getTotalRows() { return userDao.getTotalRows(); } public void modify(User entity) { userDao.modify(entity); } public void removeAll(Collection<User> entities) { userDao.removeAll(entities); } public void remove(User entity) { userDao.remove(entity); } public Long save(User entity) { return userDao.save(entity); } @SuppressWarnings("unchecked") public User login(String uname, String upass) { String hql = "from User u where u.uname = '" + uname + "'" + " and u.upass = '" + upass + "'"; userDao.setHql(hql); List<User> list = userDao.findAll(); User user = (list.isEmpty() && list.size() != 1) ? null : list.get(0); // 千万要记住,一旦修改了默认值,则业务结束后要重新改回默认值 userDao.setHql(" from " + User.class.getName()); return user; } public void removeByUids(long[] uids) { StringBuffer hqlSb = new StringBuffer(); hqlSb.append(" from User u where u.uid in ("); for (int i = 0; i < uids.length; i++) { if (i != uids.length - 1) { hqlSb.append(uids[i]).append(","); } else { hqlSb.append(uids[i]); } } hqlSb.append(")"); userDao.setHql(hqlSb.toString()); Collection<User> entities = userDao.findAll(); if (entities != null) { userDao.removeAll(entities); } } }  

 

9.分页数据信息类

package abu.csdn.util; /** * 这个分页信息工具类,只用来保存从HibernateDao中取得的分页信息 * @author Abu * */ public class PageData { // 总记录数 private int totalRows; // 每页记录数 private int size; // 当前页 private int page; // 页面总数 private int pageSize; public int getTotalRows() { return totalRows; } public void setTotalRows(int totalRows) { this.totalRows = totalRows; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public int getPage() { return page; } public void setPage(int page) { this.page = page; } public int getPageSize() { return pageSize; } public void setPageSize(int pageSize) { this.pageSize = pageSize; } }  

 

10.分页工具类,用来生成客户端的分页代码

package abu.csdn.util; /** * <p> * 生成分页代码,传给目标页面 * </p> * * @author Abu * */ public class PageUtil { // 显示列表显示的页数,默认为5 private final int listSize = 4; // 当前页面位于列表的位置 private final int halfListSize = 2; // 分页信息 private PageData pageData; // 页面url private String url; // 生成的hmtl private String html; /** * <p> * 默认构造方法,提供给Spring注入使用,建议使用带参数的构造方法 * </p> */ public PageUtil() { } /** * <p> * 构造方法,必须提供分页信息和页面URL * * @param pageInfo : * 分页信息 * @param url : * 页面URL,像这样: * * <pre> * /user/userList.do?page= * </pre> */ public PageUtil(PageData pageInfo, String url) { this.pageData = pageInfo; this.url = url; } public void setPageData(PageData pageData) { this.pageData = pageData; } public void setUrl(String url) { this.url = url; } /** * 根据分页信息生成分页代码 * * @return 分页代码 */ public String getHtml() { StringBuffer htmlSb = new StringBuffer(); // 分页样式单 String pageStyle = "<mce:style><!-- .ptbl {border:1px solid #CEDBEF;font-size:12px;padding:0;font-family:Arial;width:auto} .ptbl a {text-decoration:none;color:#555555} .ptbl td {padding-top:0px;padding-bottom:0px;padding-left:4px;padding-right:4px} .strong {background:#CEDBEF;font-weight:800;color:#FF7D00} .strong a{color:#FF7D00} .page_input {background:#ffffff;border:1px solid #CEDBEF;border-top:none;border-bottom:none;color:#FF7D00;width:30px;margin:0px } --></mce:style><style mce_bogus="1"> .ptbl {border:1px solid #CEDBEF;font-size:12px;padding:0;font-family:Arial;width:auto} .ptbl a {text-decoration:none;color:#555555} .ptbl td {padding-top:0px;padding-bottom:0px;padding-left:4px;padding-right:4px} .strong {background:#CEDBEF;font-weight:800;color:#FF7D00} .strong a{color:#FF7D00} .page_input {background:#ffffff;border:1px solid #CEDBEF;border-top:none;border-bottom:none;color:#FF7D00;width:30px;margin:0px } </style>"; // 表格样式单 String pageTable = "<table border='0'cellpadding='0' cellspacing='0' bgcolor='#CEDBEF' class='ptbl'><tr align='center' bgcolor='#FFFBFF'>"; // 当前页 int page = pageData.getPage(); // 总页数 int pageSize = pageData.getPageSize(); // 上一页 int prePage = page - 1; // 判断是否到达了首页,如果是则等于首页 prePage = prePage <= 0 ? 1 : prePage; // 下一页 int nextPage = page + 1; // 判断是否到达了末页,如果是则等于末页 nextPage = nextPage >= pageSize ? pageSize : nextPage; /** * 以下开始正式生成页面代码 */ // 首先加入样式单 htmlSb.append(pageStyle).append(pageTable); // 显示记录总数 htmlSb.append("<td>共<font color='red'>" + pageData.getTotalRows() + "</font>条</td>"); if (page != prePage) { // 首页 htmlSb.append("<td><a href="" + url + "1" mce_href="" + url + "1">首页</a></td>"); // 上一页 htmlSb.append("<td><a href="" + url + prePage + "" mce_href="" + url + prePage + "">上一页</a></td>"); } // 控制输出列表,仅显示规定的条数 if (pageSize <= listSize) { for (int i = 1; i <= pageSize; i++) { if (i == page) htmlSb.append("<td class='strong'>" + i + "</td>"); else { // <td><a href="/user/userList.do?page=1" mce_href="user/userList.do?page=1">1</a></td> htmlSb.append("<td><a href="" + url + i + "" mce_href="" + url + i + "">" + i + "</a></td>"); } } } else { int begin = page - halfListSize; begin = (begin <= 0) ? 1 : begin; begin = ((halfListSize + page) > pageSize) ? (pageSize - listSize + 1) : begin; for (int i = begin; i <= listSize + begin - 1; i++) { if (i == page) { htmlSb.append("<td class='strong'>" + i + "</td>"); htmlSb.append("/n"); } else { htmlSb.append("<td><a href="" + url + i + "" mce_href="" + url + i + "">" + i + "</a></td>"); htmlSb.append("/n"); } } } // 下一页 if (page != pageSize) { htmlSb.append("<td><a href="" + url + nextPage + "" mce_href="" + url + nextPage + "">下一页</a></td>"); // 末页 htmlSb.append("<td><a href="" + url + pageSize + "" mce_href="" + url + pageSize + "">末页</a></td>"); } htmlSb.append("<td>共<font color='red'>" + pageSize + "</font>页</td></tr></table>"); return htmlSb.toString(); } }  

 

11.分页效果图

Struts2、Hibernate、Spring整合的泛型DAO,以及通用的分页技术_第1张图片


你可能感兴趣的:(DAO,spring,Hibernate,struts,String,url)