簡體   English   中英

有關如何使用DAO類和Service類

[英]For what to use DAO classes and Service classes

我已經閱讀了有關DAO類和Service類的信息,但我不了解它們的用途。 我已經在Spring和Hibernate的Maven中啟動了一個項目,直到現在我在servlet.xml中添加了hibernate的配置:

<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
            <prop key="hibernate.show_sql">true</prop>
        </props>
    </property>
    <property name="annotatedClasses">
        <list>
              <value>com.fabbydesign.model.Useradmin</value>
        </list>
    </property>
</bean>

控制器登錄的方法如下:

@RequestMapping(value = "/do.html", method = RequestMethod.POST)
public String doLogin(@Valid @ModelAttribute("userLogin") LoginForm lf, BindingResult bindingResult, Map<String, Object> model, HttpServletRequest request){

    //bindingResult.rejectValue("username", "label.title"); - to add new message error
    logger.trace("showLogin - post");

    //check fields if the filds are filled and respects the size from beans
    if(bindingResult.hasErrors())
        return "login";

    boolean userExists = loginService.checkLogin(lf.getUsername(), lf.getPassword());

    if(!userExists){
        bindingResult.rejectValue("username", "login.username.wrongUserOrPassword");
        return "login";
    }
    else{//set session
        request.getSession().setAttribute(adminSesName, true);
    }

    return "redirect:/admin/dashboard.html";
}

loginServiceImpl:

@Service("loginService")

公共類LoginServiceImpl實現LoginService {

@Autowired
private LoginDAO loginDAO;

public void setLoginDAO(LoginDAO loginDAO) {
    this.loginDAO = loginDAO;
}

public Boolean checkLogin(String userName, String userPassword) {
    return loginDAO.checkLogin(userName, userPassword);
}

和loginDAOimpl:

@Repository("loginDAO")

公共類LoginDAOImpl實現LoginDAO {

@Resource(name = "sessionFactory")
protected SessionFactory sessionFactory;

public void setSessionFactory(SessionFactory sessionFactory) {
    this.sessionFactory = sessionFactory;
}

protected Session getSession() {
    return sessionFactory.openSession();
}

final static Logger logger = Logger.getLogger(LoginDAOImpl.class);

public boolean checkLogin(String username, String password) {

    Boolean userFound = false;
    Session session = sessionFactory.openSession();
    String sql = "from Useradmin where username = ?";
    Query<?> query = session.createQuery(sql);
    query.setParameter(0, username);

    List<?> list = query.list();
    if ((list != null) && (list.size() == 1)) {
        Useradmin ua = (Useradmin) list.get(0);

        if (BCrypt.checkpw(password, ua.getPassword())) {
            userFound = true;
        }

    }
    return userFound;
}

那么,我應該在服務類和DAO類中寫什么? 我所了解的是,用於處理數據庫數據的代碼需要保留在DAO類中,但是服務類卻有什么用? 謝謝!

您可以參考以下簡單示例:

1. PersonDao只關心數據庫操作。

package com.pechen.dao;

import java.util.List;

import com.pechen.entity.Person;

public interface PersonDao {

    public void save(Person p);

    public List<Person> list();

}

2. PersonDaoImpl是實現。

package com.pechen.dao;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;

import com.pechen.entity.Person;

public class PersonDaoImpl implements PersonDao {

    @Autowired
    private SessionFactory sessionFactory;

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }

    public void save(Person p) {
        Session session = sessionFactory.openSession();
        Transaction tx = session.beginTransaction();
        session.save(p);
        tx.commit();
        session.close();
    }

    @SuppressWarnings("unchecked")
    public List<Person> list() {
        Session session = sessionFactory.openSession();
        List<Person> rst = session.createQuery("from person").getResultList();
        session.close();
        return rst;
    }

}

3. PersonService關心業務邏輯,您可以在數據庫操作之前做任何想做的事情。

package com.pechen.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;

import com.pechen.dao.PersonDao;
import com.pechen.dao.PersonDaoImpl;
import com.pechen.entity.Person;

public class PersonService {

    @Autowired
    private PersonDao personDao;

    public void setPersonDao(PersonDaoImpl personImpl) {
        this.personDao = personImpl;
    }

    public void savePerson(Person person) {
        // other business logic
        this.personDao.save(person);
        System.out.println("Save person successfully: " + person);
    }

    public List<Person> getPersons() {
        // other business logic
        return this.personDao.list();
    }

}

DAO提供到數據庫和操作的連接。

服務層提供邏輯以對發送到DAO和從DAO發送的數據進行操作。

還具有安全性-如果您的服務層與數據庫無關,則很難通過客戶端從客戶端訪問數據庫,除非通過服務。

服務層提供業務運營和調用DAO層。

DAO層用於數據庫層。 表示它執行數據操作。 在這里放置數據的檢索,數據的保存和其他數據庫操作。

這個問題的答案可能非常詳盡,因此我將在此處嘗試堅持一些具體細節,並在必要時發布鏈接。

為了一些基礎

分層和分層體系結構:您必須了解應用程序的分層和分層之間的區別。

參考:- 層與層應用之間有什么區別?

N層與N層架構/設計

因此,如果您的應用程序具有三個主要層:表示層,服務層和數據庫層,那么服務層就是保留服務類的層。 這是向應用程序添加核心業務邏輯的地方。 例如,如果您正在使用三層開發票務應用程序,並且您已添加了全面的身份驗證功能,則該功能是可以的。

  1. 網頁將成為表示層的一部分。
  2. 諸如驗證用戶ID,加密檢查,超時檢查等功能將成為您的服務層(服務類)的一部分
  3. 與數據庫的連接以及各個交互將在數據庫層(Hibernate)中處理。

另外:如今,應用程序體系結構不僅僅局限於三層系統。 分布式應用程序體系結構已得到越來越多的采用,其中上面第2點提到的服務層分為多個小型服務,每個服務都有自己的數據庫。 (關鍵字檢查: Microservices )。 同樣,他們使用消息傳遞隊列進行交互,但是談論所有這些事情與此問題無關。

推薦:1.您將閱讀有關服務層設計的文章,以及不同的需求如何導致服務類的不同設計。 2.您了解了服務設計中通常使用的設計模式,例如提供者,工廠,單身人士等。

我希望我已經回答了你的問題。

注意:您需要用“體系結構”標記問題,因為它比Java編程更多的是體系結構問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM