SSH(二)——实现DAO层和部署DAO层

来源:互联网 发布:网络安全产品分类 编辑:程序博客网 时间:2024/05/18 00:07

1.

在Hibernate持久层之上,可使用DAO组件在此封装数据库操作,这也是Java EE应用里常用的DAO模式。当使用DAO模式时,既体现了业务逻辑组件封装DAO组件的门面模式,也可分离业务逻辑组件和DAO组件的功能:业务逻辑组件负责业务逻辑的变化,而DAO组件负责持久化技术的变化,这正是桥接模式的引用。

2.

引入DAO模式后,每个DAO组件包含了数据库的访问逻辑;每个DAO组件可对一个数据库表完成基本的CRUD操作。

3.

DAO模式的实现至少需要如下三个部分。    一、DAO工厂类    二、DAO接口    三、DAO接口的实现类

4.

DAO模式是一种更符合软件工程的开发方式,使用DAO模式有如下理由:    一、DAO模式抽象出数据访问方式,业务逻辑组件无须理会底层的数据库访问细节,而只专注于业务逻辑的实现,业务逻辑组件只负责业务功能的改变。    二、DAO将数据访问集中在独立的一层,所有的数据访问都由DAO对象完成,这层独立的DAO分离了数据访问的实现与其他业务逻辑,使得系统更具可维护性。    三、DAO还有助于提升系统的可移植性。独立的DAO层使得系统能在不同的数据库之间轻易切换,底层的数据库实现对于业务逻辑是透明的。数据库移植时仅仅影响DAO层,不同数据库的切换不会影响业务逻辑组件,因此提高了系统的可复用性。    四、对于不同的持久层技术,Spring的DAO提供了一个DAO模板,将通用的操作放在模板里完成,而对于特定的操作,则通过回调接口完成。

5.

几个通用的方法:    get(Serializable id);根据主键加载持久化实例    save(Object entity)保存持久化实例    update(Object entity);更新持久化实例    delete(Object entity);删除持久化实例    delete(Serializable id);根据主键删除持久化实例    findAll();获取数据表中全部的持久化实例

6.DAO定义接口
BaseDao.java接口定义如下。

    package org.coolerwu.common.dao;    import java.io.Serializable;    import java.util.List;    public interface BaseDao<T>{        /**         * 根据ID加载实体         */        T get(Class<T> entityClazz, Serializable id);        /**         * 保存实体         */        Serializable save(T entity);        /**         * 更新实体         */        void update(T entity);        /**         * 删除实体         */        void delete(T entity);        /**         * 根据ID删除实体         */        void delete(Class<T> entityClazz, Serializable id);        /**         * 获取所有实体         */        List<T> findAll(Class<T> entityClazz);        /**         * 获取实体总数         */        long findCount(Class<T> entityClazz);        /**         * 根据HQL语句查询实体         */        List<T> query(String hql);        /**         * 根据带占位符参数HQL语句查询实体         */        List<T> query(String hql, Object ... args);    }

EmployeeDao.java接口定义如下。

    package org.coolerwu.mydo.dao;    import java.util.List;    import org.coolerwu.common.dao.BaseDao;    import org.coolerwu.mydo.domain.Employee;    public interface EmployeeDao extends BaseDao<Employee>{        /**         *          * @param user 账号         * @param password 密码         * @return 查询到返回true,否则false         */        List<Employee> queryEmployee(String user, String password);    }

ManagerDao.java接口定义如下。

    package org.coolerwu.mydo.dao;    import org.coolerwu.common.dao.BaseDao;    import org.coolerwu.mydo.domain.Manager;    public interface ManagerDao extends BaseDao<Manager>{    }

7.实现DAO组件
BaseDaoImpl.java实现类的源代码。

    package org.coolerwu.common.dao.impl;    import java.io.Serializable;    import java.util.List;    import org.coolerwu.common.dao.BaseDao;    import org.hibernate.Query;    import org.hibernate.SessionFactory;    public class BaseDaoImpl<T> implements BaseDao<T>{        /**         * DAO组件进行持久化操作底层依赖的SessionFactory组件         */        private SessionFactory sessionFactory;        /**         * 依赖注入SessionFactory所需的setter方法         * @param sessionFactory         */        public void setSessionFactory(SessionFactory sessionFactory) {            this.sessionFactory = sessionFactory;        }        /**         *          * @return         */        public SessionFactory getSessionFactory() {            return sessionFactory;        }        @SuppressWarnings("unchecked")        @Override        public T get(Class<T> entityClazz, Serializable id) {            return (T) getSessionFactory().getCurrentSession().get(entityClazz, id);        }        @Override        public Serializable save(T entity) {            return getSessionFactory().getCurrentSession().save(entity);        }        @Override        public void update(T entity) {            getSessionFactory().getCurrentSession().saveOrUpdate(entity);        }        @Override        public void delete(T entity) {            getSessionFactory().getCurrentSession().delete(entity);        }        @Override        public void delete(Class<T> entityClazz, Serializable id) {            getSessionFactory().getCurrentSession()                .createQuery("select en from " + entityClazz.getSimpleName()                     + " en where en.id = ?0")                .setParameter("0", id)                .executeUpdate();        }        @Override        public List<T> findAll(Class<T> entityClazz) {            return  query("select en from " + entityClazz.getSimpleName()                 + " en");         }        @Override        public long findCount(Class<T> entityClazz) {            List<?> l = query("select count(*) from " + entityClazz.getSimpleName());            if(l != null && l.size() == 1)                return (long)l.get(0);            return 0;        }        @SuppressWarnings("unchecked")        @Override        public List<T> query(String hql) {            return (List<T>)getSessionFactory().getCurrentSession()                    .createQuery(hql)                    .list();        }        @SuppressWarnings("unchecked")        @Override        public List<T> query(String hql, Object... args) {            Query query = getSessionFactory().getCurrentSession()                .createQuery(hql);            for(int i = 0; i < args.length; i++){                query.setParameter(i + "", args[i]);            }            return (List<T>)query.list();        }    }

EmployeeDaoImpl.java实现类的源代码。

    package org.coolerwu.mydo.dao.impl;    import java.util.List;    import org.coolerwu.common.dao.impl.BaseDaoImpl;    import org.coolerwu.mydo.dao.EmployeeDao;    import org.coolerwu.mydo.domain.Employee;    public class EmployeeDaoImpl extends BaseDaoImpl<Employee> implements EmployeeDao{        @Override        public List<Employee> queryEmployee(String user, String password) {            List<Employee> l = query("select a from Employee as a where a.user = ?0 "                    + "and a.password = ?1", user, password);            return l;        }    }

ManagerDaoImpl.java实现类的源代码。

    package org.coolerwu.mydo.dao.impl;    import org.coolerwu.common.dao.impl.BaseDaoImpl;    import org.coolerwu.mydo.dao.ManagerDao;    import org.coolerwu.mydo.domain.Manager;    public class ManagerDaoImpl extends BaseDaoImpl<Manager> implements ManagerDao{    }

8.部署DAO层
1.DAO组件运行的基础

    应用的DAO组件以Hibernate和Spring为基础,由Spring容器负责生成并管理DAO组件。Spring容器复制为DAO组件注入所需要的基础SessionFactory。

daoContext.xml的源代码。

        <?xml version="1.0" encoding="UTF-8"?>        <beans xmlns="http://www.springframework.org/schema/beans"            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"            xmlns:aop="http://www.springframework.org/schema/aop"            xmlns:p="http://www.springframework.org/schema/p"            xmlns:tx="http://www.springframework.org/schema/tx"            xsi:schemaLocation="http://www.springframework.org/schema/beans             http://www.springframework.org/schema/beans/spring-beans-4.0.xsd            http://www.springframework.org/schema/tx             http://www.springframework.org/schema/tx/spring-tx-4.0.xsd            http://www.springframework.org/schema/aop             http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">            <!-- 定义数据源Bean,使用C3P0数据源实现 -->            <!-- 并设置连接数据库的驱动、URL、用户名、密码,            连接池最大连接数、最小连接数、初始连接数等参数  -->            <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"                destroy-method="close"                 p:driverClass="com.mysql.jdbc.Driver"                p:jdbcUrl="jdbc:mysql://localhost:3306/test?useSSL=false"                 p:user="root"                p:password="wulang"                 p:maxPoolSize="200"                 p:minPoolSize="2"                p:initialPoolSize="2"                 p:maxIdleTime="20" />            <!-- 定义Hibernate的SessionFactory,并依赖注入数据源,注入上面定义的dataSource -->            <bean id="sessionFactory"                class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"                p:dataSource-ref="dataSource" >                <!-- annotatedClasses属性用于列出全部持久化类 -->                <property name="annotatedClasses">                    <list>                        <value>org.coolerwu.mydo.domain.Employee</value>                        <value>org.coolerwu.mydo.domain.Manager</value>                    </list>                </property>                <!-- 定义Hibernate的SessionFactory的属性 -->                <property name="hibernateProperties">                    <!-- 指定数据库方言、是否自动建表、是否生成SQL语句等  -->                    <value>                        hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect                        hibernate.hbm2ddl.auto=update                        hibernate.show_sql=true                        hibernate.format_sql=true                        #开启二级缓存                        hibernate.cache.use_second_level_cache=true                        #设置二级缓存的提供者                        hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory                    </value>                </property>            </bean>            <!-- 配置DAO组件的模板 -->            <bean id="daoTemplate" abstract="true" lazy-init="true"                p:sessionFactory-ref="sessionFactory"/>            <bean id="employeeDao" class="org.coolerwu.mydo.dao.impl.EmployeeDaoImpl"                parent="daoTemplate"/>            <bean id="managerDao" class="org.coolerwu.mydo.dao.impl.ManagerDaoImpl"                parent="daoTemplate"/>              </beans>

配置文件先配置了一个DAO组件的模板,配置文件为改模板注入量SessionFactory,而其他DAO组件都继承了该DAO模板,因此,其他实际的DAO组件也会被注入SessionFactory对象。系统的各具体DAO组件实现类中并未提供setSessionFactory()方法,该方法由其父类BaseDaoImpl提供,用于依赖注入SessionFactory对象。