- 浏览: 73586 次
文章分类
最新评论
-
benjaminz:
话说,我现在是用8i的client连接10g的数据库所有和数据 ...
oracle 9i的客户端好像是访问不了10g的服务器的 -
icefire:
性能问题!
一般是是在log.debug("&quo ...
日志的写法 -
zhangfengsimon:
YuLimin 写道<p>这是完全错误的理解,是不 ...
log4j xml 配置方式 -
YuLimin:
<p>这是完全错误的理解,是不是在想当然?< ...
log4j xml 配置方式 -
sun_cat:
昨天晚上本来打算上传附件的 可是老是上传不上去
偶是刚开始学s ...
一个DAO 一个Interface 搞定spring + hibernate+动态hql查询
找了一些spring的文章看了下,有所启发,于是大概的总结了下,希望大家多提提意见
为了实现自己程序对spring和hibernate的过分依赖,因此自己写了一个接口,封装了8个常用的数据库操作
接口如下
java 代码
- package com.pig.dao;
- import java.io.Serializable;
- import java.util.Collection;
- import java.util.List;
- import org.springframework.dao.DataAccessException;
- /**
- * 实现具体数据访问的接口,该接口将程序和框架进行了分离,提供了抽象出来的几个常用的方法 优点:减少了对spring,hibernate的依赖
- * 缺点:提供了有限的几个方法,可能造成提供的方法不全
- *
- * @author lizhihui
- * @see DAOInterfaceHibernate3Imp
- */
- public interface DAOInterface {
- /**
- * Persist the given transient instance.
- * @param entity the transient instance to persist
- * @return the generated identifier
- */
- public Serializable save(Object entity);
- /**
- * Save or update the given persistent instance,
- * according to its id (matching the configured "unsaved-value"?).
- * @param entity the persistent instance to save or update
- * (to be associated with the Hibernate Session)
- * @throws DataAccessException in case of Hibernate errors
- * @see net.sf.hibernate.Session#saveOrUpdate(Object)
- */
- public void saveOrUpdate(Object entity) throws DataAccessException;
- /**
- * Save or update all given persistent instances,
- * according to its id (matching the configured "unsaved-value"?).
- * @param entities the persistent instances to save or update
- * (to be associated with the Hibernate Session)
- * @throws DataAccessException in case of Hibernate errors
- * @see net.sf.hibernate.Session#saveOrUpdate(Object)
- */
- public void saveOrUpdate(Collection entities) throws DataAccessException;
- /**
- * Delete the given persistent instance.
- * @param entity the persistent instance to delete
- * @throws org.springframework.dao.DataAccessException in case of Hibernate errors
- * @see net.sf.hibernate.Session#delete(Object)
- */
- public void delete(Object entity) throws DataAccessException;
- /**
- * Delete the instance according to identifier
- * @param c class of instance
- * @param id identifier
- * @throws org.springframework.dao.DataAccessException in case of Hibernate errors
- */
- public void delete(Class c, Serializable id) throws DataAccessException;
- /**
- * Delete all given persistent instances.
- *
This can be combined with any of the find methods to delete by query
- * in two lines of code, similar to Session's delete by query methods.
- * @param entities the persistent instances to delete
- * @throws org.springframework.dao.DataAccessException in case of Hibernate errors
- * @see net.sf.hibernate.Session#delete(String)
- */
- public void delete(Collection entities) throws DataAccessException;
- /**
- * Return the persistent instance of the given entity class
- * with the given identifier, throwing an exception if not found.
- *
This method is a thin wrapper around
- * {@link net.sf.hibernate.Session#load(Class, java.io.Serializable)} for convenience.
- * For an explanation of the exact semantics of this method, please do refer to
- * the Hibernate API documentation in the first instance.
- * @param entityClass a persistent class
- * @param id an identifier of the persistent instance
- * @return the persistent instance
- * @throws org.springframework.orm.ObjectRetrievalFailureException if not found
- * @throws org.springframework.dao.DataAccessException in case of Hibernate errors
- * @see net.sf.hibernate.Session#load(Class, java.io.Serializable)
- */
- public Object load(Class entityClass, Serializable id) throws DataAccessException;
- /**
- * Execute an HQL query
- * @param queryString a query expressed in Hibernate's query language
- * @return a List containing the results of the query execution
- * @throws org.springframework.dao.DataAccessException in case of Hibernate errors
- * @see net.sf.hibernate.Session#find(String, Object[], net.sf.hibernate.type.Type[])
- * @see net.sf.hibernate.Session#createQuery
- */
- public List find(String queryString) throws DataAccessException;
- }
他的实现
java 代码
- package com.pig.dao;
- import java.io.Serializable;
- import java.sql.SQLException;
- import java.util.Collection;
- import java.util.List;
- import org.apache.commons.logging.Log;
- import org.apache.commons.logging.LogFactory;
- import org.hibernate.HibernateException;
- import org.hibernate.Query;
- import org.hibernate.Session;
- import org.springframework.dao.DataAccessException;
- import org.springframework.orm.hibernate3.HibernateCallback;
- import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
- public class DAOInterfaceHibernate3Imp extends HibernateDaoSupport implements DAOInterface {
- private static Log log=LogFactory.getLog(DAOInterfaceHibernate3Imp.class);
- public void delete(Object entity) throws DataAccessException {
- getHibernateTemplate().delete(entity);
- }
- public void delete(Class c, Serializable id) throws DataAccessException {
- Object entiry = load(c, id);
- getHibernateTemplate().delete(entiry);
- }
- public void delete(Collection entities) throws DataAccessException {
- getHibernateTemplate().deleteAll(entities);
- }
- public List find(String queryString) throws DataAccessException {
- return getHibernateTemplate().find(queryString);
- }
- public Object load(Class entityClass, Serializable id) throws DataAccessException {
- return getHibernateTemplate().load(entityClass, id);
- }
- public Serializable save(Object entity) {
- return getHibernateTemplate().save(entity);
- }
- public void saveOrUpdate(Object entity) throws DataAccessException {
- getHibernateTemplate().saveOrUpdate(entity);
- }
- public void saveOrUpdate(Collection entities) throws DataAccessException {
- getHibernateTemplate().saveOrUpdateAll(entities);
- }
- }
这样如果 hibernate如果有了变得 只改变他的实现类就可以了,甚至可以改变成其他的中间件实现
在程序中只用了实现了一个DAO,感觉他可以对所以的类操作了,至于其他的和业务相关联的操作 例如用户登陆,修改秘密等操作 我把他们归结到了 service中,这样service的实现可能要好多的类和接口
大家看下我的DAO
java 代码
- package com.pig.dao;
- import java.io.Serializable;
- import java.util.Collection;
- import java.util.List;
- import org.springframework.dao.DataAccessException;
- import com.pig.util.PropertyResource;
- public class BasicDAO {
- private DAOInterface dao;
- private PropertyResource sqlMapping;
- public BasicDAO(){
- }
- public void delete(Object entity) throws DataAccessException {
- dao.delete(entity);
- }
- public void delete(Class c, Serializable id) throws DataAccessException {
- dao.delete(c,id);
- }
- public void delete(Collection entities) throws DataAccessException {
- dao.delete(entities);
- }
- public List find(String queryStringKey,Object[] args) throws DataAccessException {
- return dao.find(sqlMapping.getFormattedString(queryStringKey, args));
- }
- public Object load(Class entityClass, Serializable id) throws DataAccessException {
- return dao.load(entityClass, id);
- }
- public Serializable save(Object entity) {
- return dao.save(entity);
- }
- public void saveOrUpdate(Object entity) throws DataAccessException {
- dao.saveOrUpdate(entity);
- }
- public void saveOrUpdate(Collection entities) throws DataAccessException {
- dao.saveOrUpdate(entities);
- }
- }
在这个DAO中注入了一个DAOInterface 和 一个properties 文件 这个文件可以根据key来找到对应的hql 或者sql语句 并将参数格式化进去,看下这个方法
java 代码
- public List find(String queryStringKey,Object[] args) throws DataAccessException {
- return dao.find(sqlMapping.getFormattedString(queryStringKey, args));
- }
这个方法直接根据给定的hql语句 查询出结果集。本来还想给出一个根据hql来更新数据库的操作,但是发现hibernate好像没有提供这个接口(我对hibernate的了解还不是很多)
下面将读取hql文件的的类也一并给出 大家参考下把,这个hql文件应该放到classpath下
java 代码
- package com.pig.util;
- import java.text.MessageFormat;
- import java.util.*;
- /**
- * read properties file in classpath
- * @author lzh
- * @version 1.0
- */
- public class PropertyResource {
- private String resourceName;
- private Locale locale;
- private Map<String, String> properties;
- public PropertyResource() {
- }
- private void init() {
- if (properties == null) {
- properties = new Hashtable<String, String>();
- ResourceBundle rb = null;
- if (locale == null) {
- rb = ResourceBundle.getBundle(resourceName);
- } else {
- rb = ResourceBundle.getBundle(resourceName, locale);
- }
- Enumeration<String> e = rb.getKeys();
- String key = null;
- String value = null;
- while (e.hasMoreElements()) {
- key = e.nextElement();
- value = rb.getString(key);
- properties.put(key, value);
- }
- }
- }
- public String getString(String key) {
- if (properties == null) {
- init();
- }
- return properties.get(key);
- }
- public String getString(String key, String defaultValue) {
- if (properties == null) {
- init();
- }
- String value = properties.get(key);
- return value == null ? defaultValue : value;
- }
- public String getFormattedString(String key, Object args[]) {
- String msg = MessageFormat.format(getString(key), args);
- return msg;
- }
- public Locale getLocale() {
- return locale;
- }
- public void setLocale(Locale locale) {
- this.locale = locale;
- }
- public String getResourceName() {
- return resourceName;
- }
- public void setResourceName(String resourceName) {
- this.resourceName = resourceName;
- }
- }
最后大家看下我spring的配置文件把,这个配置文件还配置了对事务的管理(参考了他人的做法)
java 代码
- <!-- Hibernate SessionFactory -->
- <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
- <property name="dataSource" ref="dataSource"/>
- <property name="mappingResources">
- <list>
- </list>
- </property>
- <property name="hibernateProperties">
- <props>
- <prop key="hibernate.dialect">${hibernate.dialect}</prop>
- <prop key="hibernate.show_sql">true</prop>
- <prop key="hibernate.generate_statistics">true</prop>
- </props>
- </property>
- <property name="eventListeners">
- <map>
- <entry key="merge">
- <bean class="org.springframework.orm.hibernate3.support.IdTransferringMergeEventListener"/>
- </entry>
- </map>
- </property>
- </bean>
- <!-- Transaction manager for a single Hibernate SessionFactory (alternative to JTA) -->
- <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
- <property name="sessionFactory" ref="sessionFactory"/>
- </bean>
- <!--define bean of transaction interceptor -->
- <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor">
- <property name="transactionManager" ref="transactionManager" />
- <property name="transactionAttributes">
- <props>
- <prop key="insert*">PROPAGATION_REQUIRED</prop>
- <prop key="find*">PROPAGATION_REQUIRED,readOnly</prop>
- <prop key="*">PROPAGATION_REQUIRED</prop>
- </props>
- </property>
- </bean>
- <!-- define BeanNameAutoProxyCreator-->
- <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
- <property name="beanNames">
- <!-- 所有名字以DAO,Service结尾的bean,将由该"bean后处理器"为其创建事务代理;实际上应该在业务层进行事务管理,这里只是举一个简单例子 -->
- <value>*DAO,*Service</value>
- </property>
- <!-- 下面定义BeanNameAutoProxyCreator所需的事务拦截器-->
- <property name="interceptorNames">
- <list>
- <!-- 可以增加其他的拦截器 -->
- <value>transactionInterceptor</value>
- </list>
- </property>
- </bean>
- <!-- ========================= BUSINESS OBJECT DEFINITIONS ========================= -->
- <bean id="daoInterface" class="com.pig.dao.DAOInterfaceHibernate3Imp">
- <property name="sessionFactory" ref="sessionFactory"/>
- </bean>
- <bean id="sqlPropertyResource" class="com.pig.util.PropertyResource">
- <property name="resourceName" value="com.pig.resource"/>
- </bean>
- <bean id="basicDAO" class="com.pig.dao.BasicDAO">
- <property name="dao" ref="daoInterface"/>
- <property name="sqlMapping" ref="sqlPropertyResource"/>
- </bean>
希望大家能多提意见,偶对spring才看了没几天,看了大家的贴子,可以说是照葫芦画瓢 见笑见笑
评论
6 楼
sun_cat
2007-03-15
昨天晚上本来打算上传附件的 可是老是上传不上去
偶是刚开始学spring 希望大家多多指教
偶是刚开始学spring 希望大家多多指教
5 楼
eyejava
2007-03-15
BasicDAO 包装DAOInterface 还真有点怪怪的,只是多了一个find方法而已.
另外hql 放在配置文件里面运行期间的参数接收将很麻烦.
appgen 已经提供生成dao代码的模版, 这些重复的代码都可以不用手工写的.
另外hql 放在配置文件里面运行期间的参数接收将很麻烦.
appgen 已经提供生成dao代码的模版, 这些重复的代码都可以不用手工写的.
4 楼
jfy3d
2007-03-15
我也这么用 不过是Ibatis的
因为SQL在SQLMAP 里 功能应该比ResourceBundle更多些
连service也简化了
普通GRUD的service
只要
public UserService extends BaseService {
}
就可以了
单DAO 确实提高很大生产速度
因为SQL在SQLMAP 里 功能应该比ResourceBundle更多些
连service也简化了
普通GRUD的service
只要
public UserService extends BaseService {
}
就可以了
单DAO 确实提高很大生产速度
3 楼
daoger
2007-03-15
这是常用的配置方式中的一种,希望LZ进一步研究,能有更好的文章分享!
2 楼
huangpengxiao
2007-03-15
严重同意楼上
1 楼
lighter
2007-03-14
1、建议楼主打包一下程序,方便看一下,这样拉下来,看得头昏
2、“搞定spring + hibernate+动态hql查询”有标题党的嫌疑,有时间看清楚后再回复你的帖子
2、“搞定spring + hibernate+动态hql查询”有标题党的嫌疑,有时间看清楚后再回复你的帖子
相关推荐
Hibernate是一个面向Java环境的对象关系映射(ORM)框架,它提供了对数据库操作的高级抽象,使得开发者能够以面向对象的方式来操作数据库。通过Hibernate,开发者可以将实体对象与数据库表进行映射,从而极大地提高...
- **HQL**:Hibernate 查询语言,一种类似于 SQL 的查询语言,但更加面向对象。 #### 五、具体知识点详解 ##### 1. Hibernate 映射文件 ```xml <hibernate-mapping> <generator class="uuid.hex"></...
HibernateTemplate是Spring提供的一个方便的类,它简化了与Hibernate的交互,通过预定义的方法封装了常见的Hibernate操作。使用HibernateTemplate时,你需要继承Spring的HibernateDaoSupport类,并注入...
- **Hibernate**:是一个强大的ORM(对象关系映射)框架,用于简化数据库操作,实现对象和关系型数据库之间的映射。 - **Spring**:作为依赖注入和面向切面编程的容器,管理应用程序的生命周期,同时也是连接其他两...
Hibernate支持多种数据库,提供了丰富的查询API,包括HQL(Hibernate Query Language)和Criteria API。 整合Spring和Hibernate,我们可以利用Spring的依赖注入机制来管理Hibernate的SessionFactory和Session,从而...
2. **Hibernate**:Hibernate是JPA的一个实现,它提供了一套强大的ORM工具,包括对象-关系映射、查询语言(HQL)和事件处理机制。 3. **Spring JPA支持**:Spring框架提供了对JPA的全面支持,包括自动配置、事务...
本教程旨在介绍如何将Struts2、Spring以及Hibernate这三个框架整合起来,并通过一个具体的分页显示示例来进行实践,帮助读者快速上手并理解整个开发流程。 #### 三、核心组件解析 1. **Struts2**:负责处理用户请求...
在IT行业中,Spring和Hibernate是两个非常重要的框架,Spring是一个全面的后端开发框架,而Hibernate则是一个对象关系映射(ORM)工具,主要用于数据库操作。当我们将它们整合在一起时,可以实现强大的数据访问能力...
Spring是一个全面的后端开发框架,提供依赖注入、AOP(面向切面编程)、事务管理等功能,而Hibernate则是一个强大的ORM(对象关系映射)框架,简化了数据库操作。将两者结合,可以实现数据访问层的解耦和更优雅的...
在Java开发中,Hibernate是一个非常流行的ORM(对象关系映射)框架,它允许开发者通过面向对象的方式来操作数据库,而无需直接编写SQL语句。在这个场景中,我们将探讨如何使用Hibernate与SQL Server 2005数据库进行...
Hibernate是一个对象关系映射(ORM)框架,它允许开发者用面向对象的方式来操作数据库,而Spring则是一个全面的企业级应用框架,提供依赖注入、事务管理、AOP等核心功能。当这两者结合使用时,可以构建出高效、灵活...
Struts2、Spring和Hibernate是Java开发中三大主流框架,它们各自负责Web应用程序的不同层面,共同构建了一个强大的企业级应用开发平台。这三个框架的整合,通常被称为SSH(Struts2-Spring-Hibernate)集成,旨在提供...
在Web开发中,数据分页查询是一个常见的需求,它能够帮助用户更有效地浏览大量信息,而Hibernate作为一款流行的Java ORM框架,提供了方便的分页查询功能。本篇将详细讲解如何在Hibernate中进行分页查询,并结合...
这两个方法分别接受HQL(Hibernate Query Language)查询语句、开始记录偏移量(offset)和每页记录数(length)作为参数。 ```java public interface MemberDao { public List queryForPage(final String hql, ...
Spring Data JPA还支持更复杂的查询,如使用`@Query`注解编写自定义SQL或者HQL,或者使用` Specifications`进行动态查询。此外,它还提供了事务管理、懒加载、级联操作等特性,使得数据访问更加灵活和强大。 在实际...
- 第一个方法接受HQL(Hibernate Query Language)语句、偏移量`offset`以及每页大小`pageSize`作为参数。 - 第二个方法除了HQL语句、偏移量`offset`和每页大小`pageSize`外,还接受一个参数`value`,用于设置查询...
1. `findByPage(String hql, final int offset, final int pageSize)`:这个方法接收一个HQL(Hibernate Query Language)查询语句,偏移量(offset)和每页大小(pageSize)。在回调方法`doInHibernate`中,通过`...
为了方便分页操作,通常会设计一个分页工具类 `PageTool`,它包含以下属性: - `page`: 当前页码 - `rows`: 每页显示的记录数 - `list`: 当前页的数据列表 - `total`: 总记录数 - `pages`: 总页数 ```java public ...
Spring Data 是一个强大的Java框架,它简化了与各种数据存储(如关系数据库、NoSQL数据库、图数据库等)的交互。这个框架的核心是提供统一的API来操作数据,减少了手动编写DAO(数据访问对象)层的繁琐工作。下面将...
在实际应用中,我们可以创建一个分页工具类,该类接收Hibernate的Session对象、查询条件、每页大小和当前页数作为参数,然后利用Criteria或HQL进行分页查询。分页工具类通常会包含以下方法: 1. `List<T> ...