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

来源:互联网 发布:天猫数据平台啥样 编辑:程序博客网 时间:2024/05/16 04:12

在学习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>{@Resourceprivate 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();}}
  整体实现图如下:

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

0 1
原创粉丝点击