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

在学习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 <span style="color:#ff0000;">BaseDAOImpl<User></span> implements <span style="color:#cc33cc;">UserDAO</span> {//只是个例子说明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都会重新写一遍,,呵呵。我会很努力的。。

流转的时光,都成为命途中美丽的点缀,

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

相关文章:

你感兴趣的文章:

标签云: