• BaseDAO使用


    BaseDao接口的过人之处在于:一般是提供从数据库 增加、删除、修改记录、查询所有记录、查询符合某个条件记录、取得某条记录等方法的底层数据操作自定义类。
    由于我们可能操作多个数据库表,这样就需要为每个表提供一个操作他的类 xxDAO, 这些DAO继承BaseDAO 就可以省略很多重复代码(从数据库 增加、删除、修改记录、查询所有记录、查询符合某个条件记录、取得某条记录等方法的代码)。

    其次对于泛型是Java SE 1.5的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。
     Java语言引入泛型的好处是安全简单。
      在Java SE 1.5之前,没有泛型的情况的下,通过对类型Object的引用来实现参数的“任意化”,“任意化”带来的缺点是要做显式的强制类型转换,而这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,在运行的时候才出现异常,这是一个安全隐患。
      泛型的好处是在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高代码的重用率。
      泛型在使用中还有一些规则和限制:
      1、泛型的类型参数只能是类类型(包括自定义类),不能是简单类型。
      2、同一种泛型可以对应多个版本(因为参数类型是不确定的),不同版本的泛型类实例是不兼容的。
      3、泛型的类型参数可以有多个。
    4、泛型的参数类型可以使用extends语句,例如<T extends superclass>。习惯上成为“有界类型”。
      5、泛型的参数类型还可以是通配符类型。例如Class<?> classType = Class.forName(java.lang.String);

    一般在涉及DAO开发时,常用到的增删改查方法会封装到一个基类(BaseDAO),对于各个数据表的基本维护业务都需要用到增删改查等方法。

    若对每张表都编写一套增删改差方法未必有些麻烦,并且不符合编码的基本准则。一般,我们可以将这些功能的所公用的部分封装为一个对象,或者是类,此类是所有DAO的基类,可以称为:BaseDAO。

    由于此类接收到不同的操作对象,故需泛型的支持。

    下面,我通过以下实例代码,为此知识进行展示,供大家参考

    此例是基于ssh2的环境中进行搭建:

     

    相关类:涉及到BaseDAO接口,接口实现类:BaseDAOImpl、两个数据表的操作对象及相应的接口:DAOA、DAOB、DAOAImpl、DAOBImpl


    BaseDAO:接口代码,公共方法的接口类

    [java] view plain copy
     
    1. package base;  
    2.   
    3. import java.util.List;  
    4.   
    5. public interface BaseDao<T> {  
    6.   
    7.     /** 
    8.      * 保存实体 
    9.      *  
    10.      * @param entity 
    11.      */  
    12.     void save(T entity);  
    13.   
    14.     /** 
    15.      * 删除实体 
    16.      *  
    17.      * @param id 
    18.      */  
    19.     void delete(Long id);  
    20.   
    21.     /** 
    22.      * 更新实体 
    23.      *  
    24.      * @param entity 
    25.      */  
    26.     void update(T entity);  
    27.   
    28.     /** 
    29.      * 按id查询 
    30.      *  
    31.      * @param id 
    32.      * @return 
    33.      */  
    34.     T getById(Long id);  
    35.   
    36.     /** 
    37.      * 按id查询 
    38.      *  
    39.      * @param ids 
    40.      * @return 
    41.      */  
    42.     List<T> getByIds(Long[] ids);  
    43.   
    44.     /** 
    45.      * 查询所有 
    46.      *  
    47.      * @return 
    48.      */  
    49.     List<T> findAll();  
    50.   
    51. }  

    BaseDAOImpl:公共方法的实现类

    [java] view plain copy
     
    1. package base;  
    2.   
    3. import java.lang.reflect.ParameterizedType;  
    4. import java.util.List;  
    5.   
    6. import javax.annotation.Resource;  
    7.   
    8. import org.hibernate.Session;  
    9. import org.hibernate.SessionFactory;  
    10.   
    11. @SuppressWarnings("unchecked")  
    12. public abstract class BaseDaoImpl<T> implements BaseDao<T> {  
    13.   
    14.     @Resource  
    15.     private SessionFactory sessionFactory;  
    16.     private Class<T> clazz;  
    17.   
    18.     public BaseDaoImpl() {  
    19.         // 使用反射技术得到T的真实类型  
    20.         ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass(); // 获取当前new的对象的 泛型的父类 类型  
    21.         this.clazz = (Class<T>) pt.getActualTypeArguments()[0]; // 获取第一个类型参数的真实类型  
    22.         System.out.println("clazz ---> " + clazz);  
    23.           
    24.     }  
    25.   
    26.     /** 
    27.      * 获取当前可用的Session 
    28.      *  
    29.      * @return 
    30.      */  
    31.     protected Session getSession() {  
    32.         return sessionFactory.getCurrentSession();  
    33.     }  
    34.   
    35.     public void save(T entity) {  
    36.         getSession().save(entity);  
    37.     }  
    38.   
    39.     public void update(T entity) {  
    40.         getSession().update(entity);  
    41.     }  
    42.   
    43.     public void delete(Long id) {  
    44.         Object obj = getById(id);  
    45.         if (obj != null) {  
    46.             getSession().delete(obj);  
    47.         }  
    48.     }  
    49.   
    50.     public T getById(Long id) {  
    51.         return (T) getSession().get(clazz, id);  
    52.     }  
    53.   
    54.     public List<T> getByIds(Long[] ids) {  
    55.         return getSession().createQuery(//  
    56.                 "FROM User WHERE id IN (:ids)")//  
    57.                 .setParameterList("ids", ids)//  
    58.                 .list();  
    59.     }  
    60.   
    61.     public List<T> findAll() {  
    62.         return getSession().createQuery(//  
    63.                 "FROM " + clazz.getSimpleName())//  
    64.                 .list();  
    65.     }  
    66.   
    67. }  


    DAOA:vo A的DAO接口类,此类需要继承BaseDAO接口,实现公共类,另外在此可以声明自己特有的方法

    [java] view plain copy
     
    1. package dao;  
    2.   
    3. import pojo.A;  
    4. import base.BaseDao;  
    5.   
    6. public interface DAOA extends BaseDao<A>{  
    7. //...  
    8. }  

    DAOAImpl:vo A的DAO实现类,实现DAOA中声明的方法和BaseDAO的所以基本方法,为实现基本方法,故继承了BaseDaoImpl类

    [java] view plain copy
     
    1. package dao.impls;  
    2.   
    3. import org.springframework.stereotype.Repository;  
    4.   
    5. import pojo.A;  
    6. import base.BaseDaoImpl;  
    7. import dao.DAOA;  
    8. @Repository  
    9. public class DAOAImpl extends BaseDaoImpl<A> implements DAOA {     //具体的实现类什么都不用去写  只需要实现dao(有了声明)继承daoImpl(有了实现   这样的话   无论后面有多少不要的dao及其实现都只需要继承实现一个共同的BaseDao及其Impl即可     把公共的操作封装的十分Good)
    10.   
    11. }  


    同理,DAOB同上

    以此,便完成了公共方法的继承与实现机制。

    当中用到了泛型机制,通过继承父类来实现泛型的数据转换:

    [java] view plain copy
     
    1. public class DAOAImpl extends BaseDaoImpl<A>{}  A为vo的模型类,以此在父类中可调用实现!!  

    通过使用泛型T减少Dao的冗余代码,当T继承某个对象时(T extends EntityDao)限制了参数类型必须继承该对象(EntityDao),并且ClassT必须要有泛型参数(De

  • 相关阅读:
    TCP的三次握手与四次挥手
    HashMap源代码分析(JDK1.8)
    HashMap实现原理分析(JDK1.8前)
    codebook法分割前景目标
    平均场景法分割前景目标
    边缘梯度方向直方图的构建
    学习opencv 第六章 习题十三
    《学习OpenCV》 第四章 习题六
    《学习Opencv》第五章 习题6
    Opencv实现的简易绘图工具
  • 原文地址:https://www.cnblogs.com/hoobey/p/7825461.html
Copyright © 2020-2023  润新知