RSS 2.0 Версия для КПК (Бета)
Конференция JavaTalks  :  Java форум
JavaTalks - форум программистов
Java форум JavaTalks
форум программистов 
 FAQFAQ   ПоискПоиск   ПользователиПользователи   ГруппыГруппы   РегистрацияРегистрация 
 ПрофильПрофиль   Войти и проверить личные сообщенияВойти и проверить личные сообщения   ВходВход 
DAO-уровень

 
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Java форум JavaTalks -> Примеры
Предыдущая тема :: Следующая тема  
Автор Сообщение
Староверъ
Ктапубеп


Зарегистрирован: 26.01.2008
Сообщения: 5392
Откуда: Русь

СообщениеДобавлено: Ноя 29, 2009 14:40    Заголовок сообщения: DAO-уровень Ответить с цитатой

DAO - это уровень в проекте, который берет на себя осуществление работы с БД. Приэтом все приложение не будет знать с чем оно работает: с какой СУБД и с СУБД ли вообще, оно просто будет получать объекты из какого-то контейнера объектов. Базовый интерфейс для всех DAO-классов:
Код:
package ru.javatalks.dao;

import java.util.List;

public interface Dao<T> {
    /**
     * Base method for object saving (controls object inserting and updating).
     *
     * @param entity object to save
     */
    public void saveObject(T entity);

    /**
     * Base method for deleting a specified object
     *
     * @param entity a object to delete
     */
    public void deleteObject(T entity);

    /**
     * Base method for object deleting that bases on object class and id.
     *
     * @param id - an id (primary key) of the object
     */
    public void deleteObject(Number id);

    /**
     * Base method for extracting object that bases on object class and id. If
     * no object found returns null
     *
     * @param id the identifier (primary key) of the class
     * @return filled object
     */
    public T getObject(Number id);

    /**
     * Base method that used to extract all objects of concrete type. Like
     * record search in a table
     *
     * @return list of filled objects
     */
    public List<T> getAllObjects();

    /**
     * Get count of all objects of given type.
     *
     * @return count of objects
     */
    public int getAllObjectsCount();

    /**
     * The HQL, SQL or other request in the form of the prepared statement.
     *
     * @param request the request to database
     * @param values  values to put instead of "?"
     * @return list of objects that setisfy the criteria
     */
    public List<T> getObjects(String request, Object[] values);
}
Все DAO-классы должны будут реализовывать этот интерфейс.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Староверъ
Ктапубеп


Зарегистрирован: 26.01.2008
Сообщения: 5392
Откуда: Русь

СообщениеДобавлено: Ноя 29, 2009 14:48    Заголовок сообщения: RE: DAO-уровень Ответить с цитатой

Реализация DAO для связки Spring+Hibernate:
Код:
package ru.javatalks.dao.hibernate;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import ru.javatalks.dao.Dao;

import java.util.List;

/**
 * Base class for hibernate DAO.
 *
 * @author nazica
 * @author ctapobep
 * @author unknown
 */
@SuppressWarnings("unchecked")
public class HibernateDao<T> extends HibernateDaoSupport implements Dao<T> {

    private Class entityClass;

    /**
     * Creates a dao that works with specified entity class.
     *
     * @param entityClass class to collaborate with database
     */
    public HibernateDao(Class entityClass) {
        this.entityClass = entityClass;
    }

    public List<T> getAllObjects() {
        return getHibernateTemplate().loadAll(getEntityClass());
    }

    public T getObject(Number id) {
        return (T) getHibernateTemplate().get(getEntityClass(), id);
    }

    public int getAllObjectsCount() {
        DetachedCriteria criteria = DetachedCriteria.forClass(getEntityClass()).setProjection(
                Projections.rowCount());
        return (Integer) getHibernateTemplate().findByCriteria(criteria).get(0);
    }

    public void saveObject(T object) {
        getHibernateTemplate().saveOrUpdate(object);
    }

    public void deleteObject(Number id) {
        getHibernateTemplate().delete(getObject(id));
    }

    public void deleteObject(T object) {
        getHibernateTemplate().delete(object);
    }

    /**
     * Finds objects by HQL.
     *
     * @param hql        query to find objects by
     * @param parameters parameters if query is prepared statement and contains "?"
     * @return objects that are match specified criteria
     */
    protected List<T> findByHQL(String hql, Object[] parameters) {
        return getHibernateTemplate().find(hql, parameters);
    }

    public List<T> getObjects(String request, Object[] values) {
        return findByHQL(request, values);
    }

    /**
     * Gets the class of the entity the DAO works with.
     *
     * @return the class of the entity the DAO works with
     */
    public Class<T> getEntityClass() {
        return entityClass;
    }

}
Как правило конкретный DAO имеет целый набор дополнительных методов, их все описывают в каком-либо интерфейсе, например, UserDao, и тогда конкретный UserDaoImpl будет реализовывать этот интерфейс и наследоваться от HibernateDao. Для того, чтоб создать какой-то конкретный DAO, нужно просто создать объект класса UserDaoImpl, передать ему SessionFactory. Описание в Spring-конфиге в таком случае будет приблизительно следующим:
Код:
    <bean id="hibernateDao" class="ru.javatalks.dao.hibernate.HibernateDao" abstract="true">
        <property name="sessionFactory" ref="hibernateSessionFactory"/>
     </bean>
    <bean id="userDao" class="ru.javatalks.dao.hibernate.impl.UserDaoImpl" parent="hibernateDao">
        <constructor-arg value="ru.javatalks.dao.sample.User"/>
    </bean>
userDao - это уже конкретный DAO для конкретного entity - User.
Вернуться к началу
Посмотреть профиль Отправить личное сообщение Отправить e-mail
Показать сообщения:   
Этот форум закрыт, вы не можете писать новые сообщения и редактировать старые.   Эта тема закрыта, вы не можете писать ответы и редактировать сообщения.    Список форумов Java форум JavaTalks -> Примеры Часовой пояс: GMT + 3
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах


Java and all Java-related trademarks and logos are trademarks or registered trademarks of Oracle Corporation in the United States and other countries.
Этот сайт не относится к фирме Oracle Corporation и не поддерживается ею.

© 2006-2010 www.javatalks.ru: форум java программистов
Используется скрипт phpBB © 2001, 2010 phpBB Group

GetJava Download Button Rambler's Top100
Хостинг от bizname.ru
При поддержке hitech.com.ua