java dao層和base層_詳解Javaee Dao層的抽取

有時候我們在實現不同功能的時候回看到很多的Dao層的增加、修改、刪除、查找都很相似,修改我們將他們提取BaseDao

一、提取前

1. 提取前的LinkDao層:

public interface LinkManDao {

Integer findCount(DetachedCriteria detachedCriteria);

List 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 list = (List) hibernateTemplate.findByCriteria(detachedCriteria);

if(list != null && list.size() > 0) {

return list.get(0).intValue();

}

return null;

}

@Override

public List findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize) {

detachedCriteria.setProjection(null);

return (List) hibernateTemplate.findByCriteria(detachedCriteria, startIndex, pageSize);

}

@Override

public void save(LinkMan linkMan) {

hibernateTemplate.save(linkMan);

}

//Dao層根據id查找聯系人

@Override

public LinkMan findById(Long lkm_id) {

return hibernateTemplate.get(LinkMan.class, lkm_id);

}

//Dao層更新聯系人信息

@Override

public void update(LinkMan linkMan) {

hibernateTemplate.update(linkMan);

}

//Dao層刪除聯系人

@Override

public void delete(LinkMan linkMan) {

hibernateTemplate.delete(linkMan);

}

}

3. 提取前的CustomerDao

public interface CustomerDao{

void save(Customer customer);

Integer findCount(DetachedCriteria detachedCriteria);

List findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize);

Customer findById(Long cust_id);

void delete(Customer customer);

void update(Customer customer);

List findAll();

}

4.提取前的CustomerDaoImpl

@Repository

public class CustomerDaoImpl implements CustomerDao {

//注入hibernateTemplate模板

@Autowired

private HibernateTemplate hibernateTemplate;

/**

* Dao層保存客戶信息實現方法

*

Title: CustomerDaoImpl

*

Description:

* @param customer

* @see com.sshcrm.dao.CustomerDao#saveCustomer(com.sshcrm.pojo.Customer)

*/

@Override

public void saveCustomer(Customer customer) {

hibernateTemplate.save(customer);

}

//根據條件查詢結果集的總記錄數

@Override

public Integer findCount(DetachedCriteria detachedCriteria) {

//select count(*) from Customer

detachedCriteria.setProjection(Projections.rowCount());

List list = (List) hibernateTemplate.findByCriteria(detachedCriteria);

if(list != null && list.size() > 0) {

return list.get(0).intValue();

}

return null;

}

//根據查詢條件查詢總頁數

@Override

public List findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize) {

//由于在統計總記錄數的時候已經修改了發送的SQL語句,在此需要需要清空

detachedCriteria.setProjection(null);

return (List) 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 findAll() {

return (List) hibernateTemplate.find("from Customer");

}

}

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

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

1. BaseDao層

public interface BaseDao {

void save(T t);

void update(T t);

void delete(T t);

public T findById(Serializable id);

public List findAll();

public Integer findCount(DetachedCriteria detachedCriteria);

public List findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize);

}

2. BaseDaoImpl層

public class BaseDaoImpl implements BaseDao {

private Class clazz;

//提供構造方法,在構造方法中讓繼承的子類向方法中傳入具體類型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);

}

//根據id查詢信息

@Override

public T findById(Serializable id) {

return (T) hibernateTemplate.get(this.clazz, id);

}

//查詢所有信息

@Override

public List findAll() {

return (List) hibernateTemplate.find("from "+ this.clazz.getSimpleName());

}

//查詢Count(*)行記錄數

@Override

public Integer findCount(DetachedCriteria detachedCriteria) {

detachedCriteria.setProjection(Projections.rowCount());

List list = (List) hibernateTemplate.findByCriteria(detachedCriteria);

if(list != null && list.size() > 0) {

return list.get(0).intValue();

}

return null;

}

//分頁查詢信息

@Override

public List findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize) {

detachedCriteria.setProjection(null);

return (List) hibernateTemplate.findByCriteria(detachedCriteria, startIndex, pageSize);

}

}

3. 提取后的LinkManDao

public interface LinkManDao extends BaseDao{

}

4. 提取后的LinkManDaoImpl

@Repository

public class LinkManDaoImpl extends BaseDaoImpl implements LinkManDao {

//提供構造參數,在構造方法中傳入具體類型的Class

public LinkManDaoImpl() {

super(LinkMan.class);

}

@Autowired

private HibernateTemplate hibernateTemplate;

}

5.提取后的CustomerDao

public interface CustomerDao extends BaseDao {

}

6. 提取后的CustomerDaoImpl

@Repository

public class CustomerDaoImpl extends BaseDaoImpl implements CustomerDao {

//提供構造參數,在構造方法中傳入具體的Class

public CustomerDaoImpl() {

super(Customer.class);

// TODO Auto-generated constructor stub

}

//注入hibernateTemplate模板

@Autowired

private HibernateTemplate hibernateTemplate;

}

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

三、如果將通用的DAO編寫的更好,連構造方法都不想要了!!!需要怎么做???? 泛型反射

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

l? 如果現在將DAO中的構造方法去掉,將父類的通用的DAO中提供無參數的構造即可,但是需要在無參數的構造中需要獲得具體類型的Class才可以-----涉及到泛型的反射了。

l? 回顧一下泛型:

泛型???????? :通用的類型。

<>???????????? :念為? typeof

List???? :E稱為類型參數變量

ArrayList? :Integer稱為是實際類型參數

ArrayList? :ArrayList稱為參數化類型

需要做的時候在父類的構造方法中獲得子類繼承父類上的參數化類型中的實際類型參數

泛型反射的步驟:

第一步:獲得代表子類對象的Class

第二步:查看API

973a034643d414ca1a584388b917cf89.png

Type[] getGenericInterfaces();??????? :獲得帶有泛型的接口,可以實現多個接口。

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

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

第四步:將帶有泛型的父類的類型轉成具體參數化的類型

第五步:通過參數化類型的方法獲得實際類型參數

2. 代碼實現

2.1 修改BaseDaoImpl里面的無參構造方法:

public class BaseDaoImpl implements BaseDao {

private Class clazz;

//提供構造方法,在構造方法中讓繼承的子類向方法中傳入具體類型Class

/**

* 不想子類上有構造方法,必須在父類中提供無參的構造,在無參構造中獲取具體的類型Class

* 具體類型中的Class是參數類型中的實際類型 參數

*/

public BaseDaoImpl() {

//反射:第一步獲得Class

Class clazz = this.getClass();//正在被調用的那個類的Class,CustomerDaoImpl或LinkManDaoImpl

//具體查看JDK的API

Type type = clazz.getGenericSuperclass();//參數化類型BaseDaoImpl,BaseDaoImpl

//得到的type就是一個參數化類型,將type強轉為參數化類型

ParameterizedType pType = (ParameterizedType) type;

//通過參數化類型獲得實際類型參數,得到一個實際類型參數的數組

Type[] types = pType.getActualTypeArguments();

//只獲得第一參數類型即可

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);

}

//根據id查詢信息

@Override

public T findById(Serializable id) {

return (T) hibernateTemplate.get(this.clazz, id);

}

//查詢所有信息

@Override

public List findAll() {

return (List) hibernateTemplate.find("from "+ this.clazz.getSimpleName());

}

//查詢Count(*)行記錄數

@Override

public Integer findCount(DetachedCriteria detachedCriteria) {

detachedCriteria.setProjection(Projections.rowCount());

List list = (List) hibernateTemplate.findByCriteria(detachedCriteria);

if(list != null && list.size() > 0) {

return list.get(0).intValue();

}

return null;

}

//分頁查詢信息

@Override

public List findByPage(DetachedCriteria detachedCriteria, Integer startIndex, Integer pageSize) {

detachedCriteria.setProjection(null);

return (List) hibernateTemplate.findByCriteria(detachedCriteria, startIndex, pageSize);

}

}

2.2 現在LinkDao和CustomerDao不用改變,修改LinkDaoImpl和CustomerDaoImpl

@Repository

public class LinkManDaoImpl extends BaseDaoImpl implements LinkManDao {

//提供構造參數,在構造方法中傳入具體的Class

/* public LinkManDaoImpl() {

super(LinkMan.class);

}*/

@Autowired

private HibernateTemplate hibernateTemplate;

}

@Repository

public class CustomerDaoImpl extends BaseDaoImpl implements CustomerDao {

//提供構造參數,在構造方法中傳入具體的Class

/*public CustomerDaoImpl() {

super(Customer.class);

// TODO Auto-generated constructor stub

}*/

//注入hibernateTemplate模板

@Autowired

private HibernateTemplate hibernateTemplate;

}

2.3 后面如果Dao層有特殊方法是可以在比如CustomerDaoImpl中去實現,相似的就不需要了,以此來到達抽取Dao層

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/275810.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/275810.shtml
英文地址,請注明出處:http://en.pswp.cn/news/275810.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

暢銷書《深入淺出Vue.js》作者,在阿里淘系1年的收獲成長

大家好&#xff0c;我是若川。今天推薦一篇95年的博文的文章。他的故事應該挺多人知道。如果不知道可以看他的博客 https://github.com/berwin/blog點擊下方卡片關注我、加個星標時間好快&#xff0c;眨眼間&#xff0c;加入阿里已經一年了。這一年發生了很多事&#xff0c;整體…

GrideView屬性的學習

GridView 控件可公開分頁事件和排序事件&#xff0c;以及在創建當前行或將當前行綁定至數據時發生的事件。單擊一個命令控件&#xff08;例如&#xff0c;包含在 GridView 控件中作為其中的一部分的 Button 控件&#xff09;時也會引發事件。下表描述了由 GridView 控件公開的事…

插圖 引用 同一行兩個插圖_將圖標變成插圖的五個簡單步驟

插圖 引用 同一行兩個插圖Every creative person has probably already been in this situation: A project, be it a website, an app — or as far as I am concerned: often a news story would benefit from an appealing side visual. But neither budget nor time makes …

urllib庫parse模塊的使用

官方文檔轉載于:https://www.cnblogs.com/vector-wyw/p/10416010.html

java dateutil 獲取時間戳_java DateUtil工具類時間戳類型轉換詳解

本文實例為大家分享了DateUtil工具類時間戳類型轉換的具體代碼&#xff0c;供大家參考&#xff0c;具體內容如下package com.sinosoft.media.sms.util;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;public class DateUtil {//當前…

fluorinefx C# 版的開源rtmp服務器

fluorinefx C# 版的開源rtmp服務器 - [其它資源] 版權聲明&#xff1a;轉載時請以超鏈接形式標明文章原始出處和作者信息及本聲明http://25swf.blogbus.com/logs/28529745.html fluorinefx支持的 .net 框架集有 1.1 2.0 3.5 以及 mono 1.2.4支持的東東Flex, Flash Remoting (RP…

web登錄界面設計_出色的Web界面設計的7條規則

web登錄界面設計When you work on a website or on the design of web pages, remember that their success is not determined by the beauty of their visual style. In fact, in his article “10 Principles Of Good Website Design”, Vitaly Friedman stated:當您在網站或…

關于為什么我推薦大家看vue代碼的隨想

大家好&#xff0c;我是若川。今天給大家推薦一篇大圣老師在知乎的回答&#xff0c;很快能看完。我也曾經回答過這個問題。若川知乎高贊&#xff1a;有哪些必看的 JS 庫&#xff1f;不要為了讀源碼而讀源碼&#xff0c;但要學會看源碼。自己常用的熟悉的庫的源碼值得讀讀。點擊…

算法 - 最好、最壞、平均復雜度

注&#xff1a;本文僅為筆記。 原文 極客時間 - 數據結構與算法之美 - 04 | 復雜度分析&#xff08;下&#xff09;&#xff1a;淺析最好、最壞、平均、均攤時間復雜度 最好、最壞時間復雜度 略&#xff0c;比較容易分析。 平均時間復雜度 需考慮概率來計算。 概率論中的加權平…

java編譯多個包_javac一次性編譯多個包下的.java文件

標準的javac可以跟一個加一個文件名&#xff0c;該文件里保存了源文件列表&#xff0c;使用下面的命令&#xff1a;javac sourcefilecd xxxdir *.java/s/b > srclist.txtor dir x:/yyy/zzz/*.java/s/b > srclist.txtjavac -cp .;xxx/yyy/zzz.jar;x…

555的傳說

鄭昀 20101118 昨天聽1039電臺才知道&#xff0c;北美電影里常出現的555開頭號碼是行規慣例&#xff0c;因為當年貝爾系統為測試鏈路中所有交換機的基本功能&#xff0c;全部由5組成的號碼&#xff08;555–5555&#xff09;作為特別的測試號碼被保留&#xff0c;時至今日只剩下…

沒想到你是這樣的npm install

大家好&#xff0c;我是若川。今天給大家推薦一篇關于 npm install 的好文。很快能看完。點擊下方卡片關注我、加個星標學習源碼整體架構系列、年度總結、JS基礎系列前言項目中執行npm install發生了什么&#xff0c;眾所周知&#xff0c;執行npm install時會在當前項目目錄的n…

Django——Model

一、 ORM 在 MVC 或者說 MTV 設計模式中&#xff0c;模型&#xff08;M&#xff09;代表對數據庫的操作。那么如何操作數據庫呢&#xff1f; 我們可以在 Python 代碼中嵌入 SQL 語句。 但是問題又來了&#xff0c;Python 怎么連接數據庫呢&#xff1f;可以使用類似 pymysql 這一…

大理石在哪兒_如何創建用戶體驗寫作課程而又不失大理石

大理石在哪兒I’m a UX Writer. It’s a designated human on the software development team who writes words for interfaces. All the words. From the tiniest tooltips to navigation, to buttons, to errors, and so on, ad infinitum. UX writing is less writing and …

理解 JavaScript 閉包

簡介 Closure 所謂“閉包”&#xff0c;指的是一個擁有許多變量和綁定了這些變量的環境的表達式&#xff08;通常是一個函數&#xff09;&#xff0c;因而這些變量也是該表達式的一部分。 閉包是 ECMAScript &#xff08;JavaScript&#xff09;最強大的特性之一&#xff0c;但…

in the java search_elasticsearch which: no java in (/sbin:/bin:/usr/sbin:/usr/bin)

機器&#xff1a;centos7.2javahome&#xff1a;export JAVA_HOME/root/jdk1.8.0_60export PATH$JAVA_HOME/bin:$PATHexport CLASSPATH.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar[rooti-j73a8nn6 ~]# java -versionjava version “1.8.0_60”Java(TM) SE Runtime Envir…

Vuex 源碼還有一些缺陷?

我看了vuex3和vuex4的源碼也輸出了文章&#xff0c;看到這篇時&#xff0c;vuex還有缺陷&#xff1f;看了看確實是好文&#xff0c;不愧是大佬寫的。文章不算長&#xff0c;推薦給大家看看。點擊下方卡片關注我、加個星標學習源碼整體架構系列、年度總結、JS基礎系列眾所周知&a…

三級菜單頁面布局_三級菜單的最快導航布局

三級菜單頁面布局重點 (Top highlight)When users navigate an interface, there’s a need for speed. The faster it is for them to find what they’re looking for, the more time they’ll save on their task.用戶導航界面時&#xff0c;需要提高速度。 他們找到所需內容…

java contains 通配符_java刪除文件支持通配符

packagecom.covics.zfh;importjava.io.File;importjava.io.FilenameFilter;/*** 實現帶*號的刪除文件*authordoudou**/public classTestDeleteFile {public static voidmain(String args[]) {boolean delFile //windows//deleteFileWithSign("E:\\fileDeleteTest\\test\\t…

「線性基」學習小結

向量空間 向量空間亦稱線性空間。 形式化的&#xff0c;我們定義一個向量空間\((P,V,,\cdot)\) 其中 \(P\)是一個域&#xff0c;\(V\)是一個非空的集合&#xff0c;其中的集合稱作向量&#xff0c;同時定義兩種運算分別為向量加法和標量乘法 一個\(P\)上的向量空間\((P,V,,\cdo…