最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Javaee Dao層的抽取

 更新時(shí)間:2018年07月27日 16:45:04   作者:四季寫愛(ài)  
這篇文章主要介紹了詳解Javaee Dao層的抽取,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

有時(shí)候我們?cè)趯?shí)現(xiàn)不同功能的時(shí)候回看到很多的Dao層的增加、修改、刪除、查找都很相似,修改我們將他們提取BaseDao

一、提取前

1. 提取前的LinkDao層:

public interface LinkManDao {

  Integer findCount(DetachedCriteria detachedCriteria);

  List<LinkMan> findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize);

  void save(LinkMan linkMan);

  LinkMan findById(Long lkm_id);

  void update(LinkMan linkMan);

  void delete(LinkMan linkMan);

}

2. 提取前的LinkDaoImpl:

@Repository
public class LinkManDaoImpl implements LinkManDao {
  @Autowired
  private HibernateTemplate hibernateTemplate;

  @Override
  public Integer findCount(DetachedCriteria detachedCriteria) {
    //select count(*) from LinkMan
    detachedCriteria.setProjection(Projections.rowCount());
    List<Long> list = (List<Long>) hibernateTemplate.findByCriteria(detachedCriteria);
    if(list != null && list.size() > 0) {
      return list.get(0).intValue();
    }
    return null;
  }

  @Override
  public List<LinkMan> findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize) {
    detachedCriteria.setProjection(null);
    return (List<LinkMan>) hibernateTemplate.findByCriteria(detachedCriteria, startIndex, pageSize);
  }

  @Override
  public void save(LinkMan linkMan) {
    hibernateTemplate.save(linkMan);
  }
  //Dao層根據(jù)id查找聯(lián)系人
  @Override
  public LinkMan findById(Long lkm_id) {
    return hibernateTemplate.get(LinkMan.class, lkm_id);
  }
  //Dao層更新聯(lián)系人信息
  @Override
  public void update(LinkMan linkMan) {
    hibernateTemplate.update(linkMan);
  }
  //Dao層刪除聯(lián)系人
  @Override
  public void delete(LinkMan linkMan) {
    hibernateTemplate.delete(linkMan);
  }
}

3. 提取前的CustomerDao

public interface CustomerDao{
  void save(Customer customer);
  Integer findCount(DetachedCriteria detachedCriteria);
  List<Customer> findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize);
  Customer findById(Long cust_id);
  void delete(Customer customer);
  void update(Customer customer);
  List<Customer> findAll();
}

4.提取前的CustomerDaoImpl

@Repository
public class CustomerDaoImpl implements CustomerDao {
  //注入hibernateTemplate模板
  @Autowired
  private HibernateTemplate hibernateTemplate;

  /**
   * Dao層保存客戶信息實(shí)現(xiàn)方法
   * <p>Title: CustomerDaoImpl</p>
   * <p>Description: </p>
   * @param customer
   * @see com.sshcrm.dao.CustomerDao#saveCustomer(com.sshcrm.pojo.Customer)
   */
  @Override
  public void saveCustomer(Customer customer) {
    hibernateTemplate.save(customer);
  }
  //根據(jù)條件查詢結(jié)果集的總記錄數(shù)
  @Override
  public Integer findCount(DetachedCriteria detachedCriteria) {
    //select count(*) from Customer
    detachedCriteria.setProjection(Projections.rowCount());
    List<Long> list = (List<Long>) hibernateTemplate.findByCriteria(detachedCriteria);
    if(list != null && list.size() > 0) {
      return list.get(0).intValue();
    }
    return null;
  }
  //根據(jù)查詢條件查詢總頁(yè)數(shù)
  @Override
  public List<Customer> findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize) {
    //由于在統(tǒng)計(jì)總記錄數(shù)的時(shí)候已經(jīng)修改了發(fā)送的SQL語(yǔ)句,在此需要需要清空
    detachedCriteria.setProjection(null);
    return (List<Customer>) hibernateTemplate.findByCriteria(detachedCriteria, startIndex, pageSize);
  }
  @Override
  public Customer findById(Long cust_id) {
    return hibernateTemplate.get(Customer.class, cust_id);
  }
  @Override
  public void delete(Customer customer) {
    hibernateTemplate.delete(customer);
  }
  @Override
  public void update(Customer customer) {
    hibernateTemplate.update(customer);
  }
  @Override
  public List<Customer> findAll() {
    return (List<Customer>) hibernateTemplate.find("from Customer");
  }
}

5.可以看到CustomerDaoImpl和LinkManDaoImpl方法很相似,所以需要提取

二、利用在子類中傳遞真正的Class類型來(lái)提取BaseDao,編寫泛型

1. BaseDao層

public interface BaseDao<T> {
  void save(T t);
  void update(T t);
  void delete(T t);
  public T findById(Serializable id);
  public List<T> findAll();
  public Integer findCount(DetachedCriteria detachedCriteria);
  public List<T> findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize);
}

2. BaseDaoImpl層

public class BaseDaoImpl<T> implements BaseDao<T> {
  private Class clazz;
  //提供構(gòu)造方法,在構(gòu)造方法中讓繼承的子類向方法中傳入具體類型Class
  public BaseDaoImpl(Class clazz) {
    this.clazz = clazz;
  }
  //注入HibernateTemplate模板
  @Autowired
  private HibernateTemplate hibernateTemplate;
  //保存信息
  @Override
  public void save(T t) {
    hibernateTemplate.save(t);
  }
  //更新信息
  @Override
  public void update(T t) {
    hibernateTemplate.update(t);
  }
  //刪除信息
  @Override
  public void delete(T t) {
    hibernateTemplate.delete(t);
  }
  //根據(jù)id查詢信息
  @Override
  public T findById(Serializable id) {
    return (T) hibernateTemplate.get(this.clazz, id);
  }
  //查詢所有信息
  @Override
  public List<T> findAll() {
    return (List<T>) hibernateTemplate.find("from "+ this.clazz.getSimpleName());
  }
  //查詢Count(*)行記錄數(shù)
  @Override
  public Integer findCount(DetachedCriteria detachedCriteria) {
    detachedCriteria.setProjection(Projections.rowCount());
    List<Long> list = (List<Long>) hibernateTemplate.findByCriteria(detachedCriteria);
    if(list != null && list.size() > 0) {
      return list.get(0).intValue();
    }
    return null;
  }
  //分頁(yè)查詢信息
  @Override
  public List<T> findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize) {
    detachedCriteria.setProjection(null);
    return (List<T>) hibernateTemplate.findByCriteria(detachedCriteria, startIndex, pageSize);
  }

}

3. 提取后的LinkManDao

public interface LinkManDao extends BaseDao<LinkMan>{

}

4. 提取后的LinkManDaoImpl

@Repository
public class LinkManDaoImpl extends BaseDaoImpl<LinkMan> implements LinkManDao {
  
  //提供構(gòu)造參數(shù),在構(gòu)造方法中傳入具體類型的Class
  public LinkManDaoImpl() {
    super(LinkMan.class);
  }

  @Autowired
  private HibernateTemplate hibernateTemplate;
}

5.提取后的CustomerDao

public interface CustomerDao extends BaseDao<Customer> {

}

6. 提取后的CustomerDaoImpl

@Repository
public class CustomerDaoImpl extends BaseDaoImpl<Customer> implements CustomerDao {
  
  //提供構(gòu)造參數(shù),在構(gòu)造方法中傳入具體的Class
  public CustomerDaoImpl() {
    super(Customer.class);
    // TODO Auto-generated constructor stub
  }

  //注入hibernateTemplate模板
  @Autowired
  private HibernateTemplate hibernateTemplate;
}

7.  如果這樣抽取完成以后,那么在編寫DAO的時(shí)候如果里面都是一些CRUD的操作,在DAO中只需要提供構(gòu)造方法即可。

三、如果將通用的DAO編寫的更好,連構(gòu)造方法都不想要了!?。⌒枰趺醋????  泛型反射

1 解決方案二:通過(guò)泛型的反射抽取通用的DAO

l  如果現(xiàn)在將DAO中的構(gòu)造方法去掉,將父類的通用的DAO中提供無(wú)參數(shù)的構(gòu)造即可,但是需要在無(wú)參數(shù)的構(gòu)造中需要獲得具體類型的Class才可以-----涉及到泛型的反射了。

l  回顧一下泛型:

泛型         :通用的類型。

<>             :念為  typeof

List<E>     :E稱為類型參數(shù)變量

ArrayList<Integer>  :Integer稱為是實(shí)際類型參數(shù)

ArrayList<Integer>  :ArrayList<Integer>稱為參數(shù)化類型

需要做的時(shí)候在父類的構(gòu)造方法中獲得子類繼承父類上的參數(shù)化類型中的實(shí)際類型參數(shù)

泛型反射的步驟:

第一步:獲得代表子類對(duì)象的Class

第二步:查看API

  

Type[] getGenericInterfaces();        :獲得帶有泛型的接口,可以實(shí)現(xiàn)多個(gè)接口。

Type getGenericSuperclass();          :獲得帶有泛型的父類,繼承一個(gè)類。

第三步:獲得帶有泛型的父類

第四步:將帶有泛型的父類的類型轉(zhuǎn)成具體參數(shù)化的類型

第五步:通過(guò)參數(shù)化類型的方法獲得實(shí)際類型參數(shù)

2. 代碼實(shí)現(xiàn)

2.1 修改BaseDaoImpl里面的無(wú)參構(gòu)造方法:

public class BaseDaoImpl<T> implements BaseDao<T> {
  private Class clazz;
  //提供構(gòu)造方法,在構(gòu)造方法中讓繼承的子類向方法中傳入具體類型Class
  /**
   * 不想子類上有構(gòu)造方法,必須在父類中提供無(wú)參的構(gòu)造,在無(wú)參構(gòu)造中獲取具體的類型Class
   * 具體類型中的Class是參數(shù)類型中的實(shí)際類型 參數(shù)
   */
  public BaseDaoImpl() {
    //反射:第一步獲得Class
    Class clazz = this.getClass();//正在被調(diào)用的那個(gè)類的Class,CustomerDaoImpl或LinkManDaoImpl
    //具體查看JDK的API
    Type type = clazz.getGenericSuperclass();//參數(shù)化類型BaseDaoImpl<Customer>,BaseDaoImpl<LinkMan>
    //得到的type就是一個(gè)參數(shù)化類型,將type強(qiáng)轉(zhuǎn)為參數(shù)化類型
    ParameterizedType pType = (ParameterizedType) type;
    //通過(guò)參數(shù)化類型獲得實(shí)際類型參數(shù),得到一個(gè)實(shí)際類型參數(shù)的數(shù)組
    Type[] types = pType.getActualTypeArguments();
    //只獲得第一參數(shù)類型即可
    this.clazz = (Class) types[0];//得到Customer,LinkMan
  }
  //注入HibernateTemplate模板
  @Autowired
  private HibernateTemplate hibernateTemplate;
  //保存信息
  @Override
  public void save(T t) {
    hibernateTemplate.save(t);
  }
  //更新信息
  @Override
  public void update(T t) {
    hibernateTemplate.update(t);
  }
  //刪除信息
  @Override
  public void delete(T t) {
    hibernateTemplate.delete(t);
  }
  //根據(jù)id查詢信息
  @Override
  public T findById(Serializable id) {
    return (T) hibernateTemplate.get(this.clazz, id);
  }
  //查詢所有信息
  @Override
  public List<T> findAll() {
    return (List<T>) hibernateTemplate.find("from "+ this.clazz.getSimpleName());
  }
  //查詢Count(*)行記錄數(shù)
  @Override
  public Integer findCount(DetachedCriteria detachedCriteria) {
    detachedCriteria.setProjection(Projections.rowCount());
    List<Long> list = (List<Long>) hibernateTemplate.findByCriteria(detachedCriteria);
    if(list != null && list.size() > 0) {
      return list.get(0).intValue();
    }
    return null;
  }
  //分頁(yè)查詢信息
  @Override
  public List<T> findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize) {
    detachedCriteria.setProjection(null);
    return (List<T>) hibernateTemplate.findByCriteria(detachedCriteria, startIndex, pageSize);
  }

}

2.2 現(xiàn)在LinkDao和CustomerDao不用改變,修改LinkDaoImpl和CustomerDaoImpl

@Repository
public class LinkManDaoImpl extends BaseDaoImpl<LinkMan> implements LinkManDao {
  //提供構(gòu)造參數(shù),在構(gòu)造方法中傳入具體的Class
/*  public LinkManDaoImpl() {
    super(LinkMan.class);
  }*/

  @Autowired
  private HibernateTemplate hibernateTemplate;
}

@Repository
public class CustomerDaoImpl extends BaseDaoImpl<Customer> implements CustomerDao {
  //提供構(gòu)造參數(shù),在構(gòu)造方法中傳入具體的Class
  /*public CustomerDaoImpl() {
    super(Customer.class);
    // TODO Auto-generated constructor stub
  }*/

  //注入hibernateTemplate模板
  @Autowired
  private HibernateTemplate hibernateTemplate;
}

2.3 后面如果Dao層有特殊方法是可以在比如CustomerDaoImpl中去實(shí)現(xiàn),相似的就不需要了,以此來(lái)到達(dá)抽取Dao層

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java中TypeReference用法詳情說(shuō)明

    Java中TypeReference用法詳情說(shuō)明

    這篇文章主要介紹了Java中TypeReference用法詳情說(shuō)明,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-07-07
  • java 獲取內(nèi)存使用率的流程實(shí)例詳解

    java 獲取內(nèi)存使用率的流程實(shí)例詳解

    這篇文章主要為大家介紹了java 獲取內(nèi)存使用率的流程實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • 基于SpringBoot實(shí)現(xiàn)動(dòng)態(tài)配置數(shù)據(jù)庫(kù)的加載

    基于SpringBoot實(shí)現(xiàn)動(dòng)態(tài)配置數(shù)據(jù)庫(kù)的加載

    這篇文章主要介紹了Spring?Boot?如何動(dòng)態(tài)配置數(shù)據(jù)庫(kù)的加載,現(xiàn)項(xiàng)目有一個(gè)需求,期望通過(guò)在application.yml配置文件中設(shè)置一個(gè)開(kāi)關(guān),來(lái)決定是否加載數(shù)據(jù)庫(kù),文中通過(guò)代碼示例講解的非常詳細(xì),需要的朋友可以參考下
    2024-10-10
  • Lombok同時(shí)使?@Data和@Builder踩坑總結(jié)

    Lombok同時(shí)使?@Data和@Builder踩坑總結(jié)

    這篇文章主要介紹了Lombok同時(shí)使?@Data和@Builder踩坑總結(jié),文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值需要的小伙伴可以參考一下,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-05-05
  • Spring MVC獲取HTTP請(qǐng)求頭的兩種方式小結(jié)

    Spring MVC獲取HTTP請(qǐng)求頭的兩種方式小結(jié)

    這篇文章主要介紹了Spring MVC獲取HTTP請(qǐng)求頭的兩種方式小結(jié),幫助大家更好的理解和使用Spring MVC,感興趣的朋友可以了解下
    2021-01-01
  • Java實(shí)現(xiàn)俄羅斯方塊游戲簡(jiǎn)單版

    Java實(shí)現(xiàn)俄羅斯方塊游戲簡(jiǎn)單版

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)俄羅斯方塊游戲簡(jiǎn)單版,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • springboot+vue項(xiàng)目從第一行代碼到上線部署全流程

    springboot+vue項(xiàng)目從第一行代碼到上線部署全流程

    本文詳細(xì)介紹了如何從零開(kāi)始搭建一個(gè)基于Spring Boot和Vue.js的前后端分離項(xiàng)目,并涵蓋項(xiàng)目需求分析、技術(shù)選型、項(xiàng)目結(jié)構(gòu)設(shè)計(jì)、前后端交互、部署上線等全過(guò)程,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • SpringDataJpa多表操作的實(shí)現(xiàn)

    SpringDataJpa多表操作的實(shí)現(xiàn)

    開(kāi)發(fā)過(guò)程中會(huì)有很多多表的操作,他們之間有著各種關(guān)系,本文主要介紹了SpringDataJpa多表操作的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11
  • springboot+redis實(shí)現(xiàn)微博熱搜排行榜的示例代碼

    springboot+redis實(shí)現(xiàn)微博熱搜排行榜的示例代碼

    本文主要介紹了springboot+redis實(shí)現(xiàn)微博熱搜排行榜的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • idea springboot遠(yuǎn)程debug的操作方法

    idea springboot遠(yuǎn)程debug的操作方法

    這篇文章主要介紹了idea springboot遠(yuǎn)程debug的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-10-10

最新評(píng)論

淮南市| 苏尼特右旗| 瑞丽市| 沂源县| 屏东县| 南江县| 金堂县| 岫岩| 刚察县| 肥乡县| 绥芬河市| 美姑县| 小金县| 凤凰县| 吉安县| 阜新市| 顺义区| 横山县| 贡嘎县| 佛坪县| 大冶市| 桦甸市| 丹凤县| 连城县| 托克逊县| 弥渡县| 江油市| 宁海县| 瓦房店市| 罗平县| 巩义市| 冀州市| 东明县| 寻甸| 通渭县| 嵊泗县| 峨眉山市| 扎鲁特旗| 佛坪县| 沿河| 靖安县|