关于SSH中代码中代码简单重构

时间:2022-01-30 15:45:42

在学习SSH之后,进行了一些简单项目的练习,在项目进行分解之后发现,其实很多环节都存在很多相似的功能;比如在练习中存在Student,Teacher,Course和Grade(成绩)类中都存在CRUD等相同的操作,宏观上看,这些方法只是在参数上是不同的,在数据库中查找的内容也是惊人的相似。结合老师所讲的一些内容和自己对JAVASE的理解,整理了一些资料,希望对自己和大家有些帮助------>(新手勿喷,呵呵)

  在设计DAO层面,我们可以设计一个BaseDAO接口,里面存在的方法,就是CRUD等共同方法,代码如下:

public interface BaseDAO<T> {

/**添加对象*/
public void add(T t) ;
/**删除对象*/
public void delete(long id) ;
/**更新对象*/
public void update(T t) ;
/**获取全部对象,此处为设计分页,后面的文章中会给出好的分页方案*/
public List<T> getAll() ;
/**以id获取的对象元素*/
public T getElementById(long id) ;

}
  在其实现类BaseDAOImpl类中,我们的难点就是讲参数T转化成对应的实体类,这里应该用到了反射机制,代码如下:

public class BaseDAOImpl<T> implements BaseDAO<T>{

@Resource
private SessionFactory sessionFactory ;

private Class<T> clazz ;

public BaseDAOImpl(){
// 使用反射技术得到T的真实类型
// 获取当前new的对象的 泛型的 类型
ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();
// 获取第一个类型参数的真实类型
this.clazz = (Class<T>) pt.getActualTypeArguments()[0];
}

protected Session getSession(){
return sessionFactory.getCurrentSession() ;
}

public void add(T t) {
getSession().save(t) ;
}

public void delete(long id) {
T t = getElementById(id) ;
if(t != null)
getSession().delete(t) ;
}

public void update(T t) {
getSession().update(t) ;
}

public List<T> getAll() {
return getSession().createQuery("FROM "+ clazz.getSimpleName() ).list() ;
}

public T getElementById(long id) {
return (T) getSession().get(clazz, id);
}

}
 那么现在我们在UserDAO(这里不重要是什么DAO,作为模块只是展示的格式不同而已)中只需要定义自己特有的方法,比如:

public interface UserDAO  extends BaseDAO<User>{

List<User> getStudentByNames(String... name);

User findUserByNameAndPasswird(String name, String password);
}
 接下来,我们最重要的UserDAOImpl中是这么定义的,它实现的是UserDAO(因为要实现自己特有的方法),继承BabseDAOImpl(因为要实现BaseDAO中的重现方法),代码如下:

@SuppressWarnings("unchecked")
@Component("userDAOImpl")
public class UserDAOImpl extends BaseDAOImpl<User> implements UserDAO {

//只是个例子说明
public List getStudentByNames(String... name) {
return null;
}

public User findUserByNameAndPasswird(String name, String password) {
return (User) getSession()
.createQuery("FROM User u WHERE u.name = ? AND u.password = ? ")
.setParameter(0, name)//
.setParameter(1, password)//
.uniqueResult();
}

}
  整体实现图如下:
关于SSH中代码中代码简单重构
  那么,现在根据业务写一个DAO层的接口时,只需要按照需求定制自己特有的方法,然后再Impl层实现即可。虽然很多人都知道这么做,但是对我来说已经学到了很多,想当年自己写每个环节时,所有的CRUD都会重新写一遍,呵呵。我会很努力的。。