重写Spring的HibernateDaoSupport 简化Dao层写法

Dao写的多了,两个问题。1,spring的配置文件中对每个Dao都配置注入SessionFactory。2,Dao中好多代码雷同性太高。对于第一个问题,使用spring的自动扫描机制加annotation解决,第二个问题,则重新书写HibernateDaoSupport解决。在重写的support类中使用annotation完成SessionFactory的注入,并抽象Dao中常用的代码。

 

附件中用源码 及打好的jar包。直接将jar包导入即可使用。

 

使用范例:

spring配置文件:

 

<?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:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd
           http://www.springframework.org/schema/aop 
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
           http://www.springframework.org/schema/tx 
           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd">
	<!-- 打开Spring自动扫描机制 -->
	<context:component-scan base-package="org.qrsx" />
	<!-- 定义数据源Bean,使用C3P0数据源实现 -->
	<bean id="dataSource"
		class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
		<!-- 指定连接数据库的驱动 -->
		<property name="driverClass" value="com.mysql.jdbc.Driver" />
		<!-- 指定连接数据库的URL -->
		<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/11OA" />
		<!-- 指定连接数据库的用户名 -->
		<property name="user" value="root" />
		<!-- 指定连接数据库的密码 -->
		<property name="password" value="root" />
		<!--连接池中保留的最大连接数。Default: 15 -->
		<property name="maxPoolSize" value="40" />
		<!-- 指定连接数据库连接池的最小连接数 -->
		<property name="minPoolSize" value="10" />
		<!-- 指定连接数据库连接池的初始化连接数 取值应在minPoolSize与maxPoolSize之间。Default: 3 -->
		<property name="initialPoolSize" value="15" />
		<!--最大空闲时间,25000秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 -->
		<property name="maxIdleTime" value="25000" />
		<!--如果设为true那么在取得连接的同时将校验连接的有效性。Default: false -->
		<property name="testConnectionOnCheckin" value="true" />
		<!--每18000秒检查所有连接池中的空闲连接。Default: 0 -->
		<property name="idleConnectionTestPeriod" value="18000" />
	</bean>
	<!--定义了Hibernate的SessionFactory -->
	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<!-- 配置Hibernate的参数 -->
		<property name="hibernateProperties">
			<props>
				<!-- 指定数据库的方言 -->
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
				<!-- JDBC执行批量更新语句的大小 清除缓存(定期清除缓存,减小压力 -->
				<prop key="hibernate.jdbc.batch_size">30</prop>
			</props>
		</property>
		<property name="mappingResources">
			<!-- 映射的文件 -->
			<list>
				<value>org/qrsx/model/Hibernate.hbm.xml</value>
			</list>
		</property>
	</bean>
</beans>

 

Dao

 

public interface RoleDao extends EntityDao<Role> {
	/**
	 * 根据角色名称查询.
	 * @param roleName
	 * @return
	 */
	Role get(String roleName);
	/**
	 * 查询最大排序。
	 * @return
	 */
	Integer findMaxSort();
	/**
	 * 根据序号查询。
	 * @param sort
	 * @return
	 */
	Role getBySort(Integer sort);
	/**
	 * 排序。所有大于此排序号的role全部排序减一。
	 * @param sort
	 * @return
	 */
	Integer updateBatch(Integer sort);
	/**
	 * 查询数据的数量
	 * @return
	 */
	Integer findCount();
	/**
	 * 分页查询
	 * @param firstResult
	 * @param maxResults
	 * @return
	 */
	List<Role>find(Integer firstResult,Integer maxResults);
}

 DaoImpl

 

@Repository
public class RoleDaoHibernate extends EntityHibernateDaoSupport<Role> implements RoleDao {

	@Override
	public List<Role> find() {
		final String HQL="from Role order by sort";
		return super.find(HQL);
	}

	@Override
	public Role get(String roleName) {
		final String HQL= "from Role where roleName=?";
		return super.get(HQL, roleName);
	}

	@Override
	public Integer findMaxSort() {
		final String HQL= "select max(sort) from Role";
		return super.findAgg(HQL);
	}

	@Override
	public Role getBySort(Integer sort) {
		final String HQL= "from Role where sort=?";
		return super.get(HQL, sort);
	}

	@Override
	public Integer updateBatch(Integer sort) {
		final String HQL="update Role set sort=sort-1 where sort>?";
		return super.execute(HQL,sort);
	}

	@Override
	public Integer findCount() {
		final String HQL="select count(id) from Role";
		return super.getAgg(HQL);
	}

	@Override
	public List<Role> find(Integer firstResult, Integer maxResults) {
		final String HQL="from Role";
		return super.find(HQL, maxResults, firstResult);
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值