一步一步实现Spring4 + Hibernate4 + Freemarker2 的注解驱动开发(三.应用代码)

本文介绍了一个基于Hibernate的站点信息管理系统实现,包括数据模型定义、DAO层、Service层及Controller层的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码包的目录结构如下:



数据模型类:Site ,通过 @Entity 标签来标示需要进行数据库映射,然后通过@Table @Column等标签,告诉Hibernate如何绑定到数据库表

package cn.toncen.cms.entity;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;

/**
 * @ClassName: Site
 * @Description: 站点信息数据模型
 * @author: Wang DaoYong
 * @date: 2014年3月9日
 * 
 */
@Entity
@Table(name = "site")
public class Site {
	@Id
	@GeneratedValue(strategy = GenerationType.AUTO)
	private int id;

	@Column(length = 128, unique = true, nullable = false)
	private String name;

	@Column(length = 256)
	private String url;

	@Column(length = 512)
	private String comment;

	@Column(name = "access_statistics")
	private int accessStatistics;

	public int getId() {
		return id;
	}

	public Site() {
		super();
	}

	public Site(int id, String name, String url, String comment, int accessStatistics) {
		super();
		this.id = id;
		this.name = name;
		this.url = url;
		this.comment = comment;
		this.accessStatistics = accessStatistics;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public String getComment() {
		return comment;
	}

	public void setComment(String comment) {
		this.comment = comment;
	}

	public int getAccessStatistics() {
		return accessStatistics;
	}

	public void setAccessStatistics(int accessStatistics) {
		this.accessStatistics = accessStatistics;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + id;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Site other = (Site) obj;
		if (id != other.id)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "Site [id=" + id + ", name=" + name + ", url=" + url + ", comment=" + comment + ", accessStatistics="
				+ accessStatistics + "]";
	}

}

DAO工具父类

package cn.toncen.cms.dao;

import java.io.Serializable;
import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Criterion;
import org.springframework.beans.factory.annotation.Autowired;

/**
 * @ClassName: AbstractDao
 * @Description: DAO通用方法封装抽象类
 * @author: Wang DaoYong
 * @date: 2014年3月9日
 * 
 */
public abstract class AbstractDao<E, I extends Serializable> {

	private final Class<E> entityClass;

	protected AbstractDao(Class<E> entityClass) {
		this.entityClass = entityClass;
	}

	@Autowired
	private SessionFactory sessionFactory;

	public Session getCurrentSession() {
		return sessionFactory.getCurrentSession();
	}

	@SuppressWarnings("unchecked")
	public I addNew(E e) {
		return (I) getCurrentSession().save(e);
	}

	@SuppressWarnings("unchecked")
	public E findById(I id) {
		return (E) getCurrentSession().get(entityClass, id);
	}

	public void saveOrUpdate(E e) {
		getCurrentSession().saveOrUpdate(e);

	}

	public void delete(E e) {
		getCurrentSession().delete(e);
	}

	@SuppressWarnings("unchecked")
	public List<E> findByCriteria(Criterion criterion) {
		Criteria criteria = getCurrentSession().createCriteria(entityClass);
		if (criterion != null) {
			criteria.add(criterion);
		}
		return criteria.list();
	}
}

SiteDAO实现 通过@Repository标注数据访问组件,即DAO组件,Spring容器进行管理

package cn.toncen.cms.dao.impl;

import java.util.List;

import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;

import cn.toncen.cms.dao.AbstractDao;
import cn.toncen.cms.dao.SiteDao;
import cn.toncen.cms.entity.Site;

/**
 * @ClassName: SiteDaoImpl
 * @Description: 站点信息DAO实现
 * @author: Wang DaoYong
 * @date: 2014年3月9日
 * 
 */
@Repository
public class SiteDaoImpl extends AbstractDao<Site, Integer> implements SiteDao {

	protected SiteDaoImpl() {
		super(Site.class);
	}

	/**
	 * 
	 * @see cn.toncen.cms.dao.SiteDao#addSite(cn.toncen.cms.entity.Site)
	 */

	@Override
	public int addSite(Site site) {

		return addNew(site);
	}

	/**
	 * 
	 * @see cn.toncen.cms.dao.SiteDao#deleteSite(int)
	 */
	@Override
	public void deleteSite(int id) {
		delete(findSiteByID(id));

	}

	@Override
	public Site findSiteByID(int id) {
		return findById(id);
	}

	/**
	 * 
	 * @see cn.toncen.cms.dao.SiteDao#updateSite(cn.toncen.cms.entity.Site)
	 */
	@Override
	public void saveOrUpdateSite(Site site) {
		saveOrUpdate(site);

	}

	@Override
	public List<Site> findSiteByName(String name) {
		return findByCriteria(Restrictions.like("name", name, MatchMode.START));
	}

	/**
	 * @see cn.toncen.cms.dao.SiteDao#getAllSites()
	 */

	@Override
	public List<Site> getAllSites() {
		// return getCurrentSession().createCriteria(Site.class).list();
		return findByCriteria(null);
	}

}

SiteService类代码如下 通过@Service标注其为服务类,在该类的代码中,通过@Auotwired来从容器中装载DAO接口的实现类对象

package cn.toncen.cms.service.impl;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import cn.toncen.cms.dao.SiteDao;
import cn.toncen.cms.entity.Site;
import cn.toncen.cms.service.SiteService;

/**
 * @ClassName: SiteServiceImpl
 * @Description: 站点服务实现
 * @author: Wang DaoYong
 * @date: 2014年3月10日
 * 
 */
@Service("siteService")
@Transactional(readOnly = true)
public class SiteServiceImpl implements SiteService {

	private static final Logger logger = LoggerFactory.getLogger(SiteServiceImpl.class);

	@Autowired
	private SiteDao siteDao;

	/**
	 * @see cn.toncen.cms.service.SiteService#addSite(cn.toncen.cms.entity.Site)
	 */
	@Override
	@Transactional(readOnly = false)
	public int addSite(Site site) {
		return siteDao.addSite(site);

	}

	/**
	 * @see cn.toncen.cms.service.SiteService#updateSite(cn.toncen.cms.entity.Site)
	 */
	@Override
	@Transactional(readOnly = false)
	public void updateSite(Site site) {
		siteDao.saveOrUpdateSite(site);
	}

	/**
	 * @see cn.toncen.cms.service.SiteService#deleteSite(int)
	 */
	@Override
	@Transactional(readOnly = false)
	public void deleteSite(int id) {
		siteDao.deleteSite(id);

	}

	/**
	 * @see cn.toncen.cms.service.SiteService#findSiteById(int)
	 */
	@Override
	@Transactional(readOnly = true)
	public Site findSiteById(int id) {
		return siteDao.findSiteByID(id);
	}

	@Override
	@Transactional(readOnly = true)
	public List<Site> findSiteByName(String name) {
		return siteDao.findSiteByName(name);
	}

	/**
	 * @see cn.toncen.cms.service.SiteService#findAllSites()
	 */
	@Override
	@Transactional(readOnly = true)
	public List<Site> findAllSites() {
		logger.debug("Get all sites info.");
		return siteDao.getAllSites();
	}

}



Controller类实现 通过@Controller标签标注其为一个WEB控制器类,通过@Autowired装载Service接口的实现类对象

package cn.toncen.cms.web;

import java.util.List;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import cn.toncen.cms.entity.Site;
import cn.toncen.cms.service.SiteService;

/**
 * @ClassName: SiteController
 * @Description: TODO
 * @author: Wang DaoYong
 * @date: 2014年3月10日
 * 
 */

@Controller
public class SiteController {
	private static final Logger logger = LoggerFactory.getLogger(SiteController.class);
	@Autowired
	private SiteService siteService;

	@RequestMapping(value = "/admin", method = RequestMethod.GET)
	public String adminIndex(Model model) {
		logger.debug("Access /site/list.");
		List<Site> sites = siteService.findAllSites();
		model.addAttribute("sites", sites);
		return "/admin/site/site";
	}

	@RequestMapping(value = "/admin/site/add", method = RequestMethod.GET)
	public String showSiteForm(Model model) {
		model.addAttribute("Site", new Site());
		return "/admin/site/add";
	}

	@RequestMapping(value = "/admin/site/save", method = RequestMethod.POST)
	public String saveSite(Model model, Site site) {
		List<Site> existing = siteService.findSiteByName(site.getName());
		if (existing.size() != 0) {
			model.addAttribute("nameMsg", "exist");
			return "admin/site/add";
		}
		siteService.addSite(site);
		model.addAttribute("created", "success");
		model.addAttribute("sites", siteService.findAllSites());
		return "/admin/site/site";
	}

	@RequestMapping(value = "/admin/site", method = RequestMethod.GET)
	public String listSites(Model model) {
		logger.debug("Access /site/list.");
		List<Site> sites = siteService.findAllSites();
		model.addAttribute("sites", sites);
		return "/admin/site/site";
	}

	@RequestMapping(value = "/admin/site/search", method = RequestMethod.POST)
	public String searchUser(Model model, Site site) {
		List<Site> sites = siteService.findSiteByName(site.getName());
		model.addAttribute("sites", sites);
		return "/admin/site/site";
	}

	@RequestMapping(value = "/admin/site/edit/{id}", method = RequestMethod.GET)
	public String editSite(Model model, @PathVariable int id) {
		Site site = siteService.findSiteById(id);
		model.addAttribute("site", site);
		model.addAttribute("sites", siteService.findAllSites());
		return "/admin/site/edit/"+id;
	}

	@RequestMapping(value = "/admin/site/update", method = RequestMethod.POST)
	public String updateSite(Model model, Site site) {
		siteService.updateSite(site);
		model.addAttribute("saved", "success");
		model.addAttribute("sites", siteService.findAllSites());
		return "/admin/site/site";
	}

	@RequestMapping(value = "/admin/site/delete/{id}", method = RequestMethod.GET)
	public String deleteSite(Model model, @PathVariable int id) {
		siteService.deleteSite(id);
		model.addAttribute("deleted", "success");
		model.addAttribute("sites", siteService.findAllSites());
		return "/admin/site/site";
	}
}

接口代码就不需要贴了,上面就是一个服务流程后台到前台的实现代码,数据校验之类的功能尚未添加

可以看到,在代码中通过各种注解标签,代替了配置文件的功能

后续还有页面代码


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值