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对象。
阅读全文
1 0
- SSH(二)——实现DAO层和部署DAO层
- SSH框架——(二)四层结构:DAO,Service,Controller,View层
- 完成SSH项目 -- 实现dao层
- SSH中公共Dao层、Dao接口
- dao层和service层
- dao层和service层
- Service层和Dao层
- ssh 下dao 层测试
- SSH的Dao层封装
- SSH框架之dao层
- SSH中DAO层抽取
- Dao层
- DAO层
- 三大框架整合ssh(二)------DAO层
- 三大框架整合ssh(二)------DAO层 源码
- MyBatis (二) Dao层开发
- java实现遍历树形菜单方法——Dao层
- junit4 测试dao层 和service层
- 欢迎使用CSDN-markdown编辑器
- RecyclerView 源码分析(一)
- POJ1061---青蛙的约会(同余方程,拓展gcd)
- 冒泡排序
- Android自定义View时获取文字宽高
- SSH(二)——实现DAO层和部署DAO层
- 游戏中的人工智能(一)
- CSS、JS 放置位置与前端性能的关系?
- 交换两个数
- 深入探究C++的new/delete操作符
- 利用Pandas读取文件路径或文件名称包含中文的csv文件
- mapreduce-常见的inputformat实现类和outputformat实现类
- ionic侧拉
- Gensim学习