`
确实比较男
  • 浏览: 115317 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

J2EE开发框架搭建(6) - 使用hibernate4完成基本Dao的封装

阅读更多

现在orm框架有很多,比如说guzz,hibernate,mybaits....,在封装一个框架的时候我们可以选择一种,也可以选择多种实现,供以后使用选择,这里我只实现了hibernate,目录结构图如下:

1. 首先查询BaseRepository这个接口,该接口泛型 :T 表示实体类型;ID表示主键类型;虽然在框架里面已经提供了查询的结构Searchable,但是Searchable也不能做到无限强大,比如一个多变关联查询,嵌套查询是没有办法完成的,所有只能自己编写sql语句,但是hibernate编写sql语句都只能写在java代码里面,用过mybaits的朋友就知道sql语句可以配置在xml里面 ,这里我们就可以简单的仿照mybaits来完成,在这个接口中就提供了调用xml中的sql语句的方法,具体怎么实现后面再说明:

 

package com.hqhop.framework.common.orm;

///import .....

/**
 * <p>
 * 抽象DAO层基类 提供一些简便方法<br/>
 * <p/>
 * <span style="color:#ff0000;">泛型 :T 表示实体类型;ID表示主键类型</span>
 * <p>
 * Version: 1.0
 * 
 * @author silentwu
 */
public interface BaseRepository<T extends AbstractEntity<ID>, ID extends Serializable> extends PagingAndSortingRepository<T, ID> {

	/**
	 * 根据主键删除
	 * 
	 * @param ids
	 */
	public void delete(ID... ids);

	/**
	 * 根据条件查询所有 条件 + 分页 + 排序
	 * 
	 * @param searchable
	 * @return
	 */
	public Page<T> findAll(Searchable searchable);
	/**
	 * 根据条件统计所有记录数
	 * 
	 * @param searchable
	 * @return
	 */
	public long count(Searchable searchable);

	public void update(T entity);

	/**
	 * 自定义sql更新
	 * 
	 * @param sqlKey
	 * @param params
	 */
	public void update(String sqlKey, Object... params);
	/**
	 * 自定义sql查询
	 * 
	 * @param sqlKey
	 * @param params
	 * @return
	 */
	public List<T> findAll(String sqlKey, Object... params);
	public Page<T> findPage(Pageable pageable, String sqlKey, Object... params);
	/**
	 * 自定义sql删除
	 * 
	 * @param sqlKey
	 * @param params
	 */
	public void delete(String sqlKey, Object... params);
}

 

该接口继承了spring的PagingAndSortingRepository接口,然而PagingAndSortingRepository又继承了CrudRepository接口,所以BaseRepository就具有了基本的增删改查以及自己定义的一些方法:

 

@NoRepositoryBean
public interface PagingAndSortingRepository<T, ID extends Serializable> extends CrudRepository<T, ID> {
	Iterable<T> findAll(Sort sort);
	Page<T> findAll(Pageable pageable);
}
@NoRepositoryBean
public interface CrudRepository<T, ID extends Serializable> extends Repository<T, ID> {
	<S extends T> S save(S entity);
	<S extends T> Iterable<S> save(Iterable<S> entities);
	T findOne(ID id);
	boolean exists(ID id);
	Iterable<T> findAll();
	Iterable<T> findAll(Iterable<ID> ids);
	long count();
	void delete(ID id);
	void delete(T entity);
	void delete(Iterable<? extends T> entities);
	void deleteAll();
}

2. 接下来查看BaseRepository的实现类BaseRepositoryImpl,由于要使用hibernate操作数据库,所以要提供session,在hibernate4中已经建议直接使用session操作数据库,建议不要在使用hibernateTemplate;要使用sessionFactory.getCurrentSession()来获取当前的线程中的session就必须开启事物,所以在spring-config.xml中加入下代码:

 

 

<!-- 开启注解事务 只对当前配置文件有效 -->
<tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true" />
<!-- 配置Hibernate事务管理器 -->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
	<property name="sessionFactory" ref="sessionFactory" />
</bean>

在BaseRepositoryImpl就可以使用如下代码了:

 

 

@Autowired
private SessionFactory sessionFactory;
public Session getSession() {
	// 事务必须是开启的(Required),否则获取不到
	return sessionFactory.getCurrentSession();
}

3. 在BaseRepositoryImpl中还必须要有一个Class 属性,指定运行时刻BaseRepositoryImpl操作的实体类,因为在hibernate中做了sql查询或者是hql查询,查询的结果通过反射转化为实体类返回到service。那么又怎么给这个Class对象赋值呢?在这里我们需要自己定义一个注解Repository,在这个注解中就记录了BaseRepositoryImpl要操作的实体类:

 

 

/**
 * 
 * @author silentwu
 *
 */
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@org.springframework.stereotype.Repository
public @interface Repository {
	/**
	 * Repository在spring容器中的实例名称
	 */
	String value() default "";

	/**
	 * Repository处理的实体类
	 * 
	 * @return
	 */
	Class<?> entity();
}

接下来我们就可以直接在BaseRepositoryImpl中获取这个注解来得到Class,在BaseRepositoryImpl中添加如下代码:

 

 

private Class<T> clazz;
@PostConstruct
@SuppressWarnings("unchecked")
public void init() throws Exception {
	<span style="color:#ff0000;">Repository repository = this.getClass().getAnnotation(Repository.class);</span>
	if (Utils.isNotEmpty(repository)) {
		if (Utils.isNotEmpty(repository.entity())) {
			<span style="color:#ff0000;">this.clazz = (Class<T>) repository.entity();</span>
			this.countAllQL = String.format(COUNT_QUERY_STRING, clazz.getName());
			this.findAllQL = String.format(FIND_QUERY_STRING, clazz.getName());
		} else {
			throw new Exception(Repository.class + "注解的entity不能为空!");
		}
	} else {
		throw new Exception(this.getClass() + " 必须要使用" + Repository.class + "注解!");
	}
}

在init()方法上面添加了@PostConstruct注解,表示在类被spring容器实例化后要执行的方法;也可以实现spring的InitializingBean接口来达到同样的效果(但是spring已经不推荐使用这种方式)

 

4. 在前面的章节中,我们提供了逻辑删除的接口LogicDeleteable,具体实现逻辑的删除就是在BaseRepositoryImpl中,在BaseRepositoryImpl中提供了多个删除方法,但是主要的删除操作只有一个delete(T entity),其他的删除都是调用的这个:

 

/**
 * 检查是否实现了逻辑删除接口
 * 
 * @return
 */
private boolean checkLogicDeleteable() {
	Class[] inters = this.clazz.getInterfaces();
	boolean flag = false;
	for (int i = 0; i < inters.length; i++) {
		if ("LogicDeleteable".equals(inters[i].getSimpleName())) {
			flag = true;
			break;
		}
	}
	return flag;
}
@Override
public void delete(T entity) {
	if (Utils.isNotEmpty(entity)) {
		if (entity instanceof LogicDeleteable) {
			((LogicDeleteable) entity).markDeleted();
			update(entity);
		} else {
			this.getSession().delete(entity);
		}
	}
}

在删除对象的时候首先判断是否实现了LogicDeleteable接口,若为true ==> 调用markDeleted(); 否则真实删除。

5.BaseRepository,BaseRepositoryImpl的使用方式,操作User实体类:

接口UserDao

 

public interface UserDao extends BaseRepository<User, String> {

}

实现类UserDaoImpl,使用@Repository注解,指定操作的实体类

 

@Repository(entity = User.class)
public class UserDaoImpl extends BaseRepoitoryImpl<User, String> implements UserDao {

}



 

 

 

 

 

 

 

 

 

 



分享到:
评论

相关推荐

    J2EE--Eclipse+Struts+Hibernate+Spring

    5. **业务逻辑**:使用Hibernate进行数据访问,通过DAO(Data Access Object)层封装数据库操作。Spring可以帮助管理这些DAO和Service层的bean。 6. **前端展示**:利用Struts的Action和Result来处理HTTP请求,与视...

    精通J2EE--Eclipse、Struts、Hibernate及Spring整合应用案例第3章

    作为目前最为流行的轻量级持久化框架之一,Hibernate简化了Java应用与数据库之间的交互,通过封装JDBC(Java Database Connectivity),让开发人员能够以面向对象的方式操作数据库,从而避免了复杂的SQL代码编写。...

    J2EE企业级项目开发-1期 任务3-7 修改操作的实现.doc

    - 使用Hibernate进行ORM,编写实体类、配置映射文件,实现DAO(数据访问对象)接口,以完成对数据库中文章信息的读取、更新操作。 6. **业务逻辑层**: - 设计并实现Service接口及其实现类,封装修改文章的操作,...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    第二篇 建立和使用J2EE的开发平台 第三章 建立Java的开发平台 3.1 建立Java的开发环境 3.1.1 下载JDK 3.1.2 安装JDK 3.1.3 设定Path、Classpath和JAVA_HOME 3.2 验证JDK是否安装成功 3.3 建立J2EE的开发环境 3.3.1 ...

    J2EE企业级项目开发-1期 任务3-8 实训项目单.doc

    【J2EE企业级项目开发】是针对软件技术专业学生的一项实训课程,旨在培养学生的实际操作能力和对企业级应用的理解。本实训项目的核心是构建一个BBS管理系统,具体目标是实现文章列表模块的删除操作。以下是关于这个...

    精通J2EE--ECLIPSE、STRUTS、HIBERNATE及SPRING整合应用案例代码-ch05

    在Java企业级开发中,J2EE(Java 2 Platform, Enterprise Edition)是一个重要的平台,它为构建分布式、多层的企业级应用程序提供了丰富的框架和API。本案例代码着重讲解了如何利用Eclipse作为开发工具,结合Struts...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    第二篇 建立和使用J2EE的开发平台 第三章 建立Java的开发平台 3.1 建立Java的开发环境 3.1.1 下载JDK 3.1.2 安装JDK 3.1.3 设定Path、Classpath和JAVA_HOME 3.2 验证JDK是否安装成功 3.3 建立J2EE的开发环境 3.3.1 ...

    开发者突击_Java+Web主流框架整合开发_J2EE+Struts+Hibernate+Spring+源代码

    因此,"开发者突击_Java+Web主流框架整合开发_J2EE+Struts+Hibernate+Spring+源代码"这个资源对于初学者和有经验的开发者来说都是宝贵的参考资料,能帮助他们快速上手并精通SSH2框架的整合开发。

    J2EE企业级项目开发-3期(KC007) 2.7 J2EE应用程序组件文档.doc

    在J2EE企业级项目开发中,组件是构建应用程序的关键元素。组件的概念源自于面向对象编程,它封装了数据和方法,提供了属性和行为。在JavaEE上下文中,组件是独立的功能单元,由相关的类和文件组成,它们相互协作以...

    J2EE核心框架代码2

    "44使用Struts + DAO + Hibernate完成用户登陆"展示了如何整合Struts、DAO(数据访问对象)和Hibernate来实现用户登录功能。Struts是一个经典的MVC(模型-视图-控制器)框架,它帮助组织和管理应用程序的控制逻辑。...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (2)

    第二篇 建立和使用J2EE的开发平台 第三章 建立Java的开发平台 3.1 建立Java的开发环境 3.1.1 下载JDK 3.1.2 安装JDK 3.1.3 设定Path、Classpath和JAVA_HOME 3.2 验证JDK是否安装成功 3.3 建立J2EE的开发环境 3.3.1 ...

    J2EE电子商务系统开发从入门到精通--基于Struts和Hibernate技术实现

    4. **Service层开发**:定义业务逻辑接口和服务实现,调用DAO层完成具体业务功能,如用户注册、商品浏览、购物车管理等。 5. **Struts Action设计**:编写Action类,处理HTTP请求,调用Service层的方法,更新模型...

    J2EE之DAO设计模式

    DAO(Data Access Object)设计模式是Java开发中用于数据库访问的一种常见模式,它在J2EE应用程序中扮演着至关重要的角色。DAO模式的主要目的是将业务逻辑层与数据存储层进行解耦,使得代码更加模块化,易于维护和...

    轻量级 J2EE 企业应用实战:Struts+Spring+Hibernate 整合开发源代码.rar

    Struts、Spring 和 Hibernate 是 Java 企业级应用开发中的三个重要框架,它们分别负责不同的职责。Struts 是一个 MVC(Model-View-Controller)框架,主要用于处理 Web 应用的前端逻辑;Spring 是一个全面的后端解决...

    J2EE电子商务系统开发从入门到精通:基于Struts和Hibernate技术实现

    ### J2EE电子商务系统开发从入门到精通:基于Struts和Hibernate技术实现 #### J2EE概论 - **双层架构与多层架构的区别**: - 双层架构通常指的是客户端/服务器(Client/Server, C/S)架构,这种架构下的应用程序在...

    基于j2ee框架开发的博客管理系统

    【基于J2EE框架开发的博客管理系统】是一个典型的Web应用程序,使用Java企业版(Java 2 Platform, Enterprise Edition,简称J2EE)技术构建。J2EE是一个多层架构平台,用于开发和部署分布式、面向服务的Web应用,...

    J2EE案例开发-源代码.

    2. **DAO(Data Access Object)模式**:查看源码中是否使用了DAO来封装数据库访问,以实现业务逻辑与数据访问的解耦。 3. **EJB的使用**:分析EJB的实现,包括无状态会话Bean、有状态会话Bean和实体Bean,以及它们...

    j2ee项目实训——hibernate框架技术

    在J2EE项目开发中,Hibernate是一个非常重要的持久层框架,它简化了数据库与Java对象之间的交互,使得开发者可以更加专注于业务逻辑,而非繁琐的SQL语句编写。本实训主要围绕Hibernate框架技术展开,旨在帮助你深入...

    j2ee项目struts+hibernate

    Struts和Hibernate是Java开发中的两个重要框架,它们在J2EE项目中有着广泛的应用。Struts是一个MVC(Model-View-Controller)框架,主要处理Web应用的控制层逻辑,而Hibernate则是一个对象关系映射(ORM)框架,简化...

Global site tag (gtag.js) - Google Analytics