<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                在我們的教務管理系統中,除了需要有TeacherDao,我們在后面還需要KlassDao, StudentDao等等其實的數據訪問層。而這些數據訪問層在進行CURD操作時,代碼大部分都是相同的。在本節中,讓我們共同學習如何使用抽像類與接口來改寫DAO層的CURD操作。 # 基類 我們新建TestDao,并在該類中,寫入`get(Long id)`及`delete(Teacher teacher)`方法,然后我們用TeacherDao來進行繼承. ![https://box.kancloud.cn/36eb70c7a526600a85c85d4bf6eb396a_1234x568.png](https://box.kancloud.cn/36eb70c7a526600a85c85d4bf6eb396a_1234x568.png) 但現在問題來了,我們在調用TeacherDao的get()方法時,返回Teacher是沒有問題的。但如果調用StudentDao的get()方法,則應該返回的是Student實體,而非Teacher。所以TestDao中的get(Long id)方法的返回值其實是不確定的。即:它即有可能返回的的Teacher實體,也可以返回Student實體。而java又是強類型語言,是必須指定函數的返回值的。怎么辦呢? 為了解決這個問題,我們引入接口。 # 接口 新建實體接口,其它實體來繼承該接口: ![https://box.kancloud.cn/38935d774d89fa371d40d9d21029ef80_962x600.png](https://box.kancloud.cn/38935d774d89fa371d40d9d21029ef80_962x600.png) 此時,我們的返回值的類型,就可以聲明為該接口類型了: ![https://box.kancloud.cn/8aa51d6c6f58b34d63b88d821e881f55_1222x562.png](https://box.kancloud.cn/8aa51d6c6f58b34d63b88d821e881f55_1222x562.png) 同時,我們增加了`getFeaturedClass()`,它的返回值是一個實體類。我們共同來查看如下時序圖,來看看`getFeaturedClass()`的在StudentDao進行`get`操作時的具體作用. ![https://box.kancloud.cn/512feaf0b512909e92344f2852cef0ac_1396x668.png](https://box.kancloud.cn/512feaf0b512909e92344f2852cef0ac_1396x668.png) 我們看到,在TestDao在執行`get`操作時,又調用了StudentDao中的`getFeaturedClass()`方法。而該方法決定了第6步操作同樣將返回一個`Student`實體。 通過上圖我們看出,要使TestDao的get()操作成功,那么繼承它的實現類則必須存在`getFeaturedClass()`,否則,將導致找不到`getFeaturedClass`方法的異常。為了避免其它實現類在進行繼承后可能忘記寫`getFeaturedClass()`的問題,我們為其增加接口來進行約束。 ![https://box.kancloud.cn/c6e81667f52ae7dd6f613c85a50f6d56_1288x854.png](https://box.kancloud.cn/c6e81667f52ae7dd6f613c85a50f6d56_1288x854.png) # 規范接口 實際上,抽像類更多的,是在實現接口中一些具體通用性的方法。而在實現類中,去實現接口中的非通用方法。比如,在上圖中,TestDao做為抽像類,其實現了具體的數據獲取與刪除的方法。而StudentDao做為實現類,實現了接口中非通用的`getFeaturedClass()`方法。接口做的更多的,是規范與約束程序,按照這種思想,我們再次進行改寫: ![https://box.kancloud.cn/aaa639a9093a38c845ed3f057fdbda27_1334x888.png](https://box.kancloud.cn/aaa639a9093a38c845ed3f057fdbda27_1334x888.png) 至此,我們將接口做為返回類型,解決了返回值并不確認為哪種對象的問題;我們還應用接口對類進行了規范與約束;我們還應用了抽像類,來實現了那些通用的方法。如果本節中講過的,你非常清晰的明了其中的脈絡,那么恭喜你。在學習JAVA的路上,你邁出了進階的一步。 <hr /> 具體代碼: 我們對Dao接口進行補充,同時將TestDao改個名字:AbstractDao,并聲明為Abstract。最后,增加TeacherDao中的接口方法. ``` /* * 在接口中聲明方法 */ package com.mengyunzhi.javaee.dao; import com.mengyunzhi.javaee.entity.IdEntity; import java.io.Serializable; import java.util.Collection; /** * Dao. Interface. */ public interface Dao { Class<?> getFeaturedClass(); IdEntity get(Serializable id); Serializable create(IdEntity object); IdEntity update(IdEntity object); int delete(Serializable id); int delete(IdEntity object); Collection<?> paginate(int page, int pageSize); Collection<?> all(); } ``` 抽像類繼承了接口,并實現接口聲明的方法 ``` /* * $Id$ * * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package com.mengyunzhi.javaee.dao; import com.mengyunzhi.javaee.exception.CreateException; import com.mengyunzhi.javaee.exception.UpdateException; import com.mengyunzhi.javaee.entity.IdEntity; import java.io.Serializable; import java.util.ArrayList; import java.util.Collection; import org.hibernate.HibernateException; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.TransactionException; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; /** * AbstractDao. */ public abstract class AbstractDao implements Serializable, Dao { /** * */ private static final long serialVersionUID = 1L; private static SessionFactory sessionFactory; protected static Session getCurrentSession() { // 每個數據庫只需要一個sessionFactory,在這里進行單一實例處理。 if (null == sessionFactory) { // 實例化并加載數據庫配置文件 Configuration configuration = new Configuration().configure(); // 構造服務注冊對象 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(configuration.getProperties()) .buildServiceRegistry(); // 創建會話工廠(session factory)) sessionFactory = configuration.buildSessionFactory(serviceRegistry); } // 創建會話(這里的session也是會話的意思,我們以前接觸的http中的session,處理的是用戶與服務器的對話) return sessionFactory.getCurrentSession(); } public IdEntity get(Serializable id) { IdEntity object = null; // 創建會話(這里的session也是會話的意思,我們以前接觸的http中的session,處理的是用戶與服務器的對話) Session session = getCurrentSession(); // 開啟事務(使用緩沖池進行數據庫的連接) Transaction transaction = session.beginTransaction(); // 在這里,必須使用try catch finally語句。來確定會話正常關閉. // 否則,當操作數據庫產生錯誤時,你可能需要重啟mysql服務 try { // 使用Teacher.class來獲取到Teacher的類名(包括包名) object = (IdEntity) session.get(getFeaturedClass(), id); // 提交事務 transaction.commit(); // 捕獲異常 } catch (HibernateException e) { // 如果事務執行異常,則回滾事務 if (null != transaction) { transaction.rollback(); } // 打印異常 e.printStackTrace(); } finally { // 如果session處于開啟狀態,則關閉session if (session.isOpen()) { // 關閉會話 session.close(); } } return object; } public Serializable create(IdEntity object) { // 創建會話(這里的session也是會話的意思,我們以前接觸的http中的session,處理的是用戶與服務器的對話) Session session = getCurrentSession(); // 開啟事務(使用緩沖池進行數據庫的連接) Transaction transaction = session.beginTransaction(); // 在這里,必須使用try catch finally語句。來確定會話正常關閉. // 否則,當操作數據庫產生錯誤時,你可能需要重啟mysql服務 try { // 新增數據 session.save(object); // 提交事務 transaction.commit(); // 捕獲異常 } catch (HibernateException e) { // 如果事務執行異常,則回滾事務 if (null != transaction) { try { transaction.rollback(); } catch (TransactionException te) { // 拋出異常 te.printStackTrace(); } } // 拋出異常 e.printStackTrace(); } finally { // 如果session處于開啟狀態,則關閉session if (session.isOpen()) { // 關閉會話 session.close(); } } return object.getId(); } public IdEntity update(IdEntity object) { // 創建會話(這里的session也是會話的意思,我們以前接觸的http中的session,處理的是用戶與服務器的對話) Session session = getCurrentSession(); // 開啟事務(使用緩沖池進行數據庫的連接) Transaction transaction = session.beginTransaction(); // 在這里,必須使用try catch finally語句。來確定會話正常關閉. // 否則,當操作數據庫產生錯誤時,你可能需要重啟mysql服務 try { // 刪除 session.update(object); // 提交事務 transaction.commit(); // 捕獲異常 } catch (HibernateException e) { // 如果事務執行異常,則回滾事務 if (null != transaction) { try { transaction.rollback(); } catch (TransactionException te) { // 拋出異常 throw (te); } } // 拋出異常 throw (e); } finally { // 如果session處于開啟狀態,則關閉session if (session.isOpen()) { // 關閉會話 session.close(); } } return object; } public int delete(Serializable id) { IdEntity idEntity = this.get(id); return this.delete(idEntity); } public int delete(IdEntity object) { // 創建會話(這里的session也是會話的意思,我們以前接觸的http中的session,處理的是用戶與服務器的對話) Session session = getCurrentSession(); // 開啟事務(使用緩沖池進行數據庫的連接) Transaction transaction = session.beginTransaction(); // 在這里,必須使用try catch finally語句。來確定會話正常關閉. // 否則,當操作數據庫產生錯誤時,你可能需要重啟mysql服務 try { // 刪除 session.delete(object); // 提交事務 transaction.commit(); // 捕獲異常 } catch (HibernateException e) { // 如果事務執行異常,則回滾事務 if (null != transaction) { try { transaction.rollback(); } catch (TransactionException te) { // 拋出異常 throw (te); } } // 拋出異常 throw (e); } finally { // 如果session處于開啟狀態,則關閉session if (session.isOpen()) { // 關閉會話 session.close(); } } return 0; } @SuppressWarnings("unchecked") public Collection<?> all() { // 創建會話(這里的session也是會話的意思,我們以前接觸的http中的session,處理的是用戶與服務器的對話) Session session = getCurrentSession(); // 開啟事務(使用緩沖池進行數據庫的連接) Transaction transaction = session.beginTransaction(); Collection<IdEntity> entities = new ArrayList<IdEntity>(); // 在這里,必須使用try catch finally語句。來確定會話正常關閉. // 否則,當操作數據庫產生錯誤時,你可能需要重啟mysql服務 try { // 查詢Teacher表,注意:是Teacher ,而不是 teacher Query query = session.createQuery("from " + getFeaturedClass().getSimpleName()); // 預查詢,只有在事務提交時,才進行查詢操作 entities = query.list(); // 提交事務 transaction.commit(); // 捕獲異常 } catch (HibernateException e) { // 如果事務執行異常,則回滾事務 if (null != transaction) { try { transaction.rollback(); } catch (TransactionException te) { te.printStackTrace(); } } // 打印異常 e.printStackTrace(); } finally { // 如果session處于開啟狀態,則關閉session if (session.isOpen()) { // 關閉會話 session.close(); } } return entities; } @SuppressWarnings("unchecked") public Collection<?> paginate(int page, int pageSize) { // 創建會話(這里的session也是會話的意思,我們以前接觸的http中的session,處理的是用戶與服務器的對話) Session session = getCurrentSession(); // 開啟事務(使用緩沖池進行數據庫的連接) Transaction transaction = session.beginTransaction(); Collection<IdEntity> entities = new ArrayList<IdEntity>(); // 在這里,必須使用try catch finally語句。來確定會話正常關閉. // 否則,當操作數據庫產生錯誤時,你可能需要重啟mysql服務 try { // 查詢Teacher表,注意:是Teacher ,而不是 teacher String hql = "from " + getFeaturedClass().getSimpleName(); // 預查詢,只有在事務提交時,才進行查詢操作 entities = (ArrayList<IdEntity>) session.createQuery(hql) .setFirstResult(page) .setMaxResults(pageSize) .list(); // 提交事務 transaction.commit(); // 捕獲異常 } catch (HibernateException e) { // 如果事務執行異常,則回滾事務 if (null != transaction) { try { transaction.rollback(); } catch (TransactionException te) { te.printStackTrace(); } } // 打印異常 e.printStackTrace(); } finally { // 如果session處于開啟狀態,則關閉session if (session.isOpen()) { // 關閉會話 session.close(); } } return entities; } } ``` 在TeacherDao中,實現抽象類中未實現的方法: ``` package com.mengyunzhi.javaee.dao; import com.mengyunzhi.javaee.entity.Teacher; public class TeacherDao extends AbstractDao { /** * */ private static final long serialVersionUID = 1L; @Override public Class<Teacher> getFeaturedClass() { // 返回Teacher實體類 return Teacher.class; } } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看