`
确实比较男
  • 浏览: 112399 次
  • 性别: 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: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: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 ...

    搞定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多层架构的Web开发框架研究.pdf

    在经典的J2EE四层体系结构的基础上增加数据持久层,提出了基于J2EE五层体系结构的Web开发框架;分析了基于Struts框架的J2EE架构中实现对象持久性的局限性,从中分离出对象持久层,并将Hibernate这个面向对象的轻量级...

    《程序天下:J2EE整合详解与典型案例》光盘源码

    第二篇 建立和使用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框架的个人博客系统项目毕业设计论文(源码和论文)

    由于J2EE的开源的框架中提供了MVC模式实现框架Struts、对象关系模型中的Hibernate 的框架及拥有事务管理和依赖注入的Spring。利用现存框架可以更快开发系统。所以选择Java技术作为blog 的开发工具。 为了增加系统的...

    Web开发+java+ssh框架

    Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端...

    SSH基于Eclipse将Web层分页封装成通用模块

    教学-传智播客-项目视频经典之作巴巴运动网106集-28将Web层分页封装成通用模块源代码 所需要的jar文件: (一)、Hibernate: 位于 "\hibernate-distribution-3.3.2.GA" 目录下的jar文件: hibernate3.jar 位于 "\...

    将Web层分页封装成通用模块源代码

    教学-传智播客-项目视频经典之作巴巴运动网106集-28将Web层分页封装成通用模块源代码 所需要的jar文件: (一)、Hibernate: 位于 "\hibernate-distribution-3.3.2.GA" 目录下的jar文件: hibernate3.jar 位于 "\...

    基于JAVA公共资源模块的设计与开发(源代码+论文).zip

    Smart 在线考试项目(以下简称“Smart”),将在struts+sprintg 管理的hibernate作为平台框架搭建具体的Smart在线考试业务系统。 采用struts MVC框架主要用于将Smart的数据流和业务流分开,采用hibernate,主要用于更...

    J2EE核心:iBatis_DAO入门与进阶.doc

    在核心J2EE模式中是这样介绍DAO模式的:为了建立一个健壮的J2EE应用,应该将所有对数据源的访问操作抽象封装在一个公共API中。用程序设计的语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务...

    thinker:自制j2ee快速开发框架,mystyle2.0升级版

    工作中的积累,搭建的j2ee应用快速开发手架,重点在代码重构,一些常用功能的演示,工具,插件等的整理。ps:(参考,,) springmvc、spring、hibernate为基础框架 mysql数据库 前端使用基于bootstrap的metronic组件库...

    xmljava系统源码-app:基于SpringMVC、Hibernate、Redis、Shiro、JqueryEasyUI的J2EE快速开发

    J2EE快速开发框架 项目简介 使用Maven对项目进行模块化管理,提高项目的易开发性、扩展性。 实现了通用的系统管理模块功能,包含:用户、角色、权限、菜单、字典管理。 实现了基于AOP解耦的日志模块。 实现了通用的...

    支持多数据库的ORM框架ef-orm.zip

    框架的API设计直接面向数据库操作,不绕弯子,开发者只需要数据库基本知识,不必学习大量新的操作概念即可使用API完成各种DDL/DML操作。 最大限度利用编译器减少编码错误的可能性 API设计和元数据模型(meta-model...

    jeecg-framework-3.1.0.RELEASE

    表单处理等功能,再配合代码生成器的使用,将J2EE的开发效率提高6倍以上,可以将代码减少60%以上。 JEECG V3.0版本六大技术点: 1.代码生成器 2.UI快速开发库 3.在线流程设计 4.系统日志记录 5.Web GIS支持 6.移动平台...

    积分管理系统java源码-mystyle:我的风格

    工作中的积累,搭建的j2ee应用快速开发手架,重点在代码重构,一些常用功能的演示,工具,插件等的整理 ##功能要点简介 以springmvc、sprng、hibernate为基础框架搭建java web快速开发手架.ps:(参考,) mysql数据库 ...

    一个空的SSH框架,同时也支持servlet。扩展性能强,灵活度高。

    自己为一个汽车MIS系统架构的一个框架,主框架为SSH,同时根据需要扩展了servlet和JDBC(适应于大数据量查询),典型的J2EE三层结构,分为表现层、中间层(业务逻辑层)和数据服务层。三层体系将业务规则、数据访问...

    Spring面试题

    6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等 7.spring属于低侵入式设计,代码的污染极低 8.独立于各种应用服务器 9.spring的DI机制降低了业务对象替换的复杂性 10.Spring的高度开放...

    JEECG快速开发平台-其他

    1、采用SpringMVC+Hibernate+Minidao(类Mybatis)+Easyui(UI库)+Jquery+Boostrap+Ehcache+Redis+Ztree+Vue+Boostrap-table+ElementUI等基础架构2、采用面向声明的开发模式,基于泛型编写极少代码即可实现复杂的数据...

    java面试题

    4:Spring DAO:打开关闭数据库连接 5:Spring WEB:为基于WEB服务的应用程序提供上下文服务 6:Spring Context:向Spring框架提供上下文信息 7:Spring MVC:分离模型、视图、控制器、以便更容易定制 折构函数...

Global site tag (gtag.js) - Google Analytics