关于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
- 关于SSH中代码中代码简单重构
- ssh框架中ajax对用户名查重的代码
- 关于代码重构
- 关于代码重构
- Ajax中代码的重构
- 代码重构学习笔记-更新中~
- 关于代码重构Refactoring
- 在SSH中junit的测试代码
- 在Eclipse中对Java代码重构初探
- 工作中发现一个代码重构的例子
- 项目中代码重构的几点思考
- 早期Swift中Cocos2D初始化代码的重构
- 代码重构梳理-实践篇(中)
- Java 中简单画图代码
- 关于jsp中嵌入代码
- Android 中关于代码混淆
- 简单来说一下java中的泛型,ssh中dao层使用会简化代码量
- 关于代码重构的一些思考
- java jsp 输出请求信息 Attribute parameter Header
- myeclispe反编译插件安装
- java mail 实现
- android中布局文件添加到窗口流程分析
- java web初学者 jsp+javabean+servlet 登陆
- 关于SSH中代码中代码简单重构
- (5.1.2)计算机网络基础之物理层
- Qt
- C语言流程控制
- hdu 1237 简单计算器 逆波兰~~
- opencms自定义文章类型
- eclipse *.vm 文件,语法高亮
- Evil Straw Warts Live (Uva10716 回文串+贪心)
- CoreData基本使用