ssh Dao与Service的设计与实现
来源:互联网 发布:web前端优化方法 编辑:程序博客网 时间:2024/05/23 16:12
使用UML设计程序
使用 用例图 画出程序的功能模块(小人代表角色,椭圆代表功能)
第一步:画出实体类的关联关系
使用类图设计程序(关键)
单向箭头表示单向关联,没有箭头表示双向关联,线的属性(关联属性)
类的属性和方法一般隐藏
第二步:Dao的设计与实现
BaseDao定义每个Dao都会使用到的通用接口<<Interface>>
BaseDaoImpl实现BaseDao的抽象类(用斜体表示抽象,用虚线空心箭头表示实现接口)
每一个实体类都会有一个Dao的实现类(用实现空心箭头表示继承一个类,用虚线三角箭头表示引用一个类)
BaseDao<T>
package com.atguigu.surveypark.dao;import java.util.List;/** * BaseDao接口 */public interface BaseDao<T> {//写操作public void saveEntity(T t);public void saveOrUpdateEntity(T t);public void updateEntity(T t);public void deleteEntity(T t);public void batchEntityByHQL(String hql,Object...objects);//读操作public T loadEntity(Integer id);public T getEntity(Integer id);public List<T> findEntityByHQL(String hql,Object...objects);}
BaseDaoImpl<T>
package com.atguigu.surveypark.dao.impl;import java.lang.reflect.ParameterizedType;import java.util.List;import javax.annotation.Resource;import org.hibernate.Query;import org.hibernate.SessionFactory;import com.atguigu.surveypark.dao.BaseDao;/** * 抽象的dao实现,专门用于继承 */@SuppressWarnings("unchecked")public abstract class BaseDaoImpl<T> implements BaseDao<T> {//注入sessionFactory@Resourceprivate SessionFactory sf ;private Class<T> clazz ;public BaseDaoImpl(){//得到泛型话超类ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();clazz = (Class<T>) type.getActualTypeArguments()[0];}public void saveEntity(T t) {sf.getCurrentSession().save(t);}public void saveOrUpdateEntity(T t) {sf.getCurrentSession().saveOrUpdate(t);}public void updateEntity(T t) {sf.getCurrentSession().update(t);}public void deleteEntity(T t) {sf.getCurrentSession().delete(t);}/** * 按照HQL语句进行批量更新 */public void batchEntityByHQL(String hql, Object... objects) {Query q = sf.getCurrentSession().createQuery(hql);for(int i = 0 ; i < objects.length ; i ++){q.setParameter(i, objects[i]);}q.executeUpdate();}public T loadEntity(Integer id) {return (T) sf.getCurrentSession().load(clazz, id);}public T getEntity(Integer id) {return (T) sf.getCurrentSession().get(clazz, id);}public List<T> findEntityByHQL(String hql, Object... objects) {Query q = sf.getCurrentSession().createQuery(hql);for(int i = 0 ; i < objects.length ; i ++){q.setParameter(i, objects[i]);}return q.list();}}
第三步:Service设计与实现
分两种情况:一种是单体Service(只操作一个Dao),一种是多体Service(操作多个Dao)
不是每一个Dao都有一个对应的Service
BaseService<T>:定义基本的接口,这个接口是所有的Service通用的
package com.atguigu.surveypark.service;import java.util.List;/** * 基本的dao接口 */public interface BaseService<T> {//写操作public void saveEntity(T t);public void saveOrUpdateEntity(T t);public void updateEntity(T t);public void deleteEntity(T t);public void batchEntityByHQL(String hql,Object...objects);//读操作public T loadEntity(Integer id);public T getEntity(Integer id);public List<T> findEntityByHQL(String hql,Object...objects);}
BaseServiceImpl<T>:实现基本的接口
package com.atguigu.surveypark.service.impl;import java.util.List;import javax.annotation.Resource;import com.atguigu.surveypark.dao.BaseDao;import com.atguigu.surveypark.service.BaseService;/** * 抽象的baseService,专门用于继承 */public abstract class BaseServiceImpl<T> implements BaseService<T> {private BaseDao<T> dao ;//注入dao@Resourcepublic void setDao(BaseDao<T> dao) {this.dao = dao;}public void saveEntity(T t) {dao.saveEntity(t);}public void saveOrUpdateEntity(T t) {dao.saveOrUpdateEntity(t);}public void updateEntity(T t) {dao.updateEntity(t);}public void deleteEntity(T t) {dao.deleteEntity(t);}public void batchEntityByHQL(String hql, Object... objects) {dao.batchEntityByHQL(hql, objects);}public T loadEntity(Integer id) {return dao.loadEntity(id);}public T getEntity(Integer id) {return dao.getEntity(id);}public List<T> findEntityByHQL(String hql, Object... objects) {return dao.findEntityByHQL(hql, objects);}}
UserService:定义一个扩展接口,这个接口的方法特定义User这个实体类。这里实现BaseServcie这个接口是为了面向接口编程。
package com.atguigu.surveypark.service;import com.atguigu.surveypark.model.User;/** * UserService */public interface UserService extends BaseService<User> {}
一个简单的示例:可以将UserServiceImpl类注入到BaseServcie这个接口,这样就可以调用BaseServcie的基本方法和扩展方法了
注意:需要覆盖父类的public void setDao(BaseDao<User> dao) {这个方法,因为@Resource先匹配名字再匹配类型,类型已经被BaseServiceImpl使用了一次,多个类使用同一个类型所以是不行的,覆盖这个方法然后使用特定的名字的类的dao进行注入
package com.atguigu.surveypark.service.impl;import javax.annotation.Resource;import org.springframework.stereotype.Service;import com.atguigu.surveypark.dao.BaseDao;import com.atguigu.surveypark.model.User;import com.atguigu.surveypark.service.UserService;@Service("userService")public class UserServiceImpl extends BaseServiceImpl<User> implementsUserService {@Resource(name="userDao")public void setDao(BaseDao<User> dao) {super.setDao(dao);}}
第四步:action的设计与实现
BaseAction<T>
package com.atguigu.surveypark.struts2.action;import java.lang.reflect.ParameterizedType;import com.opensymphony.xwork2.ActionSupport;import com.opensymphony.xwork2.ModelDriven;import com.opensymphony.xwork2.Preparable;/** * 抽象action,专门用于继承 */public abstract class BaseAction<T> extends ActionSupport implementsModelDriven<T>, Preparable {private static final long serialVersionUID = 9180917383072055589L;public T model ;public BaseAction(){try {ParameterizedType type = (ParameterizedType) this.getClass().getGenericSuperclass();Class clazz = (Class) type.getActualTypeArguments()[0];model = (T) clazz.newInstance();} catch (Exception e) {e.printStackTrace();}}public void prepare() throws Exception {}public T getModel(){return model ;}}
一个简单的例子
package com.atguigu.surveypark.struts2.action;import javax.annotation.Resource;import org.apache.struts2.interceptor.validation.SkipValidation;import org.springframework.context.annotation.Scope;import org.springframework.stereotype.Controller;import com.atguigu.surveypark.model.User;import com.atguigu.surveypark.service.UserService;import com.atguigu.surveypark.util.DataUtil;import com.atguigu.surveypark.util.ValidateUtil;/** * 注册action */@Controller@Scope("prototype")public class RegAction extends BaseAction<User> {private static final long serialVersionUID = 7351588309970506225L;private String confirmPassword ;//注入userService@Resourceprivate UserService userService ;public String getConfirmPassword() {return confirmPassword;}public void setConfirmPassword(String confirmPassword) {this.confirmPassword = confirmPassword;}/** * 到达注册页面 */@SkipValidationpublic String toRegPage(){return "regPage" ;}/** * 进行用户注册 */public String doReg(){//密码加密model.setPassword(DataUtil.md5(model.getPassword()));userService.saveEntity(model);return SUCCESS ;}/** * 校验 */public void validate() {//1.非空if(!ValidateUtil.isValid(model.getEmail())){addFieldError("email", "email是必填项!");}if(!ValidateUtil.isValid(model.getPassword())){addFieldError("password", "password是必填项!");}if(!ValidateUtil.isValid(model.getNickName())){addFieldError("nickName", "nickName是必填项!");}if(hasErrors()){return ;}//2.密码一致性if(!model.getPassword().equals(confirmPassword)){addFieldError("password", "密码不一致!");return ;}//3.email占用if(userService.isRegisted(model.getEmail())){addFieldError("email", "email已占用!");}}}
- ssh Dao与Service的设计与实现
- Dao与Service层的设计
- DAO与Service层的泛型抽取与实现
- DAO设计模式的介绍与实现
- 基于Spring4+Hibernate4的通用数据访问层+业务逻辑层(Dao层+Service层)设计与实现!
- 【基于SSH框架的个人博客系统04】DAO层,Service层与Action层
- DAO与service相关
- DAO与Service
- DAO与SERVICE
- 基于SSH编写通用的DAO、Service、Action实现
- service与dao层的不同点
- 基于Spring、Hibernate的通用DAO层与Service层的实现
- 基于Spring、Hibernate的通用DAO层与Service层的实现
- 基于Spring、Hibernate的通用DAO层与Service层的实现
- 基于Spring、Hibernate的通用DAO层与Service层的实现
- 基于Spring、Hibernate的通用DAO层与Service层的实现
- DAO层与Service业务逻辑层的解耦实现之Factory工厂模式
- spring+mybatis通用dao层、service层的一些个人理解与实现
- 解决办法:tar: Exiting with failure status due to previous
- WIX学习(十五)
- 二分搜索的3种正确写法
- 一个简单的Hibernate程序
- Codeforces 439 B. Devu, the Dumb Guy
- ssh Dao与Service的设计与实现
- 局域网间的点对点聊天
- 使用 Ant 打包 Android 应用
- JSP中文件的上传于下载示例
- 【OJ】(二)---F---简历
- 矩阵倍增法uva11149
- android图片缓存框架Android-Universal-Image-Loader(二)
- 关于jdbc的一些疑问
- ubuntu下如何查看操作系统的位数