Spring结合hibernate配置文件

来源:互联网 发布:c语言数组赋初值0 编辑:程序博客网 时间:2024/05/16 00:27

本实例数据库是MySQL:

 

1.为了方便维护与管理,建立一个数据库配置文件dbconfig.properties,文件内容如下:


dataBaseType = MySQLjdbc.driverClassName=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8jdbc.username=rootjdbc.password=roothibernate.dialect=org.hibernate.dialect.MySQLDialectjdbc.initialPoolSize=10#Output SQL statements to console,true:yes ,false:nohibernate.show_sql=true#Inquires the cache true:yes ,false:nohibernate.cache.use_query_cache=truehibernate.substitutions=true 1, false 0, yes 'Y', no 'N'hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider

2. spring配置数据库文件applicationContext-db.xml

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd">  <bean id="propertyConfigure" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">      <property name="locations">         <list>          <value>classpath:dbconfig.properties</value>         </list>      </property>   </bean>    <!-- 数据库连接池配置,本例以用c3p0方式配置 -->    <bean id="sysDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">      <!-- 数据库驱动 -->      <property name="driverClass"><value>${jdbc.driverClassName}</value></property>      <!-- 数据库连接地址 -->      <property name="jdbcUrl"><value>${jdbc.url}</value></property>       <!-- 用户名 -->      <property name="user"><value>${jdbc.username}</value></property>      <!-- 用户密码 -->      <property name="password"><value>${jdbc.password}</value></property>      <!-- 初始化连接池大小 -->      <property name="initialPoolSize"><value>${jdbc.initialPoolSize}</value></property>    </bean>    <!-- JDBC start 无事务--> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">        <property name="dataSource" ref="sysDataSource" /> </bean> <!-- JDBc end -->     <bean id="sessionFactory"  class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">    <property name="dataSource">   <ref bean="sysDataSource" />  </property>  <property name="hibernateProperties">   <props>    <prop key="hibernate.dialect">${hibernate.dialect}</prop>    <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>                 <prop key="hibernate.cache.provider_class">${hibernate.cache.provider_class}</prop>                <prop key="hibernate.cache.use_query_cache">${hibernate.cache.use_query_cache}</prop>                <prop key="hibernate.jdbc.batch_size">30</prop>   </props>     </property>  <!-- hibernate配置文件(xml类型) -->  <property name="mappingResources">   <list>       <value>/****.xml</value>       </list>  </property>   <!-- hibernate配置文件(annotation类型) -->  <property name="annotatedClasses">   <list>        <value>com.**.pojo.*Model</value>   </list>  </property>  </bean>  <!-- jdbc操作数据库模板 --> <bean id="CDBManager"  class="com.***.CDBManager"></bean></beans>


3. 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" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd">    <!-- 事务管理器,将委托给HibernateTransactionManager进行管理//-->   <bean id="transactionManager"  class="org.springframework.orm.hibernate3.HibernateTransactionManager">  <property name="sessionFactory" ref="sessionFactory" /> </bean>  <!-- 事务处理的AOP配置 所有服务层bean声明都要继承此bean//--> <bean id="TransactionProxyTemplate" abstract="true"  class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">  <property name="transactionManager" ref="transactionManager" />  <property name="transactionAttributes">   <props>       <!-- 为了保证服务层统一的事务处理。服务层接口,类的方法必须以下面的方法为开口  -->       <!--spring 捕获到RuntimeException和其他一些异常时才会回滚,不是所有异常都会回滚,-Exception 设置 为任何异常都回滚     -->    <prop key="get*">PROPAGATION_REQUIRED,readOnly</prop>    <prop key="query*">PROPAGATION_REQUIRED,readOnly</prop>    <prop key="save*">PROPAGATION_REQUIRED,-Exception</prop>    <prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>    <prop key="update*">PROPAGATION_REQUIRED,-Exception</prop>    <prop key="delete*">PROPAGATION_REQUIRED,-Exception </prop>    <prop key="execute*">PROPAGATION_REQUIRED,-Exception</prop>   </props>  </property> </bean>    <!-- 提供普通java类获取spring上下文 通过上下文获取具体bean,调用其中的方法 --> <bean id="springApplicationContextUtil"  class="**.util.SpringApplicationContextUtil"></bean></beans>


4. jdbc数据连接类CDBManager.java

import java.sql.Connection;import java.sql.SQLException;import javax.sql.DataSource;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;/** * <p>Title:简单的数据连接类</p> */public class CDBManager implements ApplicationContextAware {  private static ApplicationContext applicationContext; /**  * 获取数据源  * @return  */ public static DataSource getDataSource() {  DataSource dataSource = (DataSource) applicationContext.getBean("sysDataSource");  return dataSource; } /**  * 获取连接  * @return  */ public static Connection getConn() {  DataSource ds = null;  Connection con = null;  try {   ds = getDataSource();   con = ds.getConnection();  } catch (SQLException e) {   e.printStackTrace();  }  return con; } /**  * 获取数据源上下文  */ public void setApplicationContext(ApplicationContext context) throws BeansException {  applicationContext = context; }}


5.普通java类获取spring上下文类 SpringApplicationContextUtil.java

import org.apache.commons.lang.StringUtils;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;/** * <p>Title:springcontex类 </p> * <p>Description:提供供普通java类获取spring上下文 通过上下文获取具体bean,调用其中的方法</p> */public class SpringApplicationContextUtil implements ApplicationContextAware { //声明一个静态变量保存 private static ApplicationContext context;  @SuppressWarnings("static-access") public void setApplicationContext(ApplicationContext context)  throws BeansException {  this.context = context; }     public static ApplicationContext getContext(){  return context; }    public static Object getBean(String beanName){     if (StringUtils.isEmpty(beanName)) {   return null;  }  return getContext().getBean(StringUtils.trim(beanName)); }}


 6.普通spring配置文件(applicationContext-test.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" xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <!-- 测试Dao --> <bean id="testDao" class="com.**.HibernateEntityDao">  <property name="sessionFactory" ref="sessionFactory"></property>  <property name="entityClass" value="com.**.model.TestModel"></property> </bean>  <!-- 测试Service --> <bean id="testService" parent="TransactionProxyTemplate">  <property name="target">   <bean class="com.**.service.imp.testServiceImp">    <property name="testDao" ref="testDao"></property>   </bean>  </property> </bean>  <!-- 测试Action --> <bean id="testAction" class="com.**.action.TestAction">     <property name="testService" ref="testService"></property> </bean> </beans>

7.HIbernateEntityDao.java类

package com.bobo.base.db;import java.io.Serializable;import java.lang.reflect.InvocationTargetException;import java.util.Iterator;import java.util.List;import java.util.regex.Matcher;import java.util.regex.Pattern;import org.apache.commons.beanutils.PropertyUtils;import org.hibernate.Criteria;import org.hibernate.Query;import org.hibernate.SQLQuery;import org.hibernate.Session;import org.hibernate.criterion.Criterion;import org.hibernate.criterion.Order;import org.hibernate.criterion.Projections;import org.hibernate.criterion.Restrictions;import org.hibernate.metadata.ClassMetadata;import org.springframework.orm.hibernate3.HibernateCallback;import org.springframework.orm.hibernate3.support.HibernateDaoSupport;/** * <p>Title:泛型DAO </p> * <p>Description:该类通过泛型定义了基于实体的基础DAO。该类继承HibernateDaoSupport,提供了常用的DAO方法。 * @author   * @version 1.0  2009-05-06 */public class HibernateEntityDao<T>  extends HibernateDaoSupport {private Class<T> entityClass;public void setEntityClass(Class<T> entityClass) {this.entityClass = entityClass;}/** 是否起用查询缓存 TRUE是,FALSE不启用 */private static final boolean ISCACHE = true;/** * 存取过程,删除基本信息 * @param proce 调用存取过程 的字符串 * @param param 参数 */public void callProcedure(String proce,String param){Session session =this.getSession();   SQLQuery query = session.createSQLQuery(proce);  query.setString(0, param);query.executeUpdate();}/** * 根据指定的ID获取实体对象。 *  * @param id *            实体ID * @return 返回指定ID的实体对象,如果没有找到则返回null。 */@SuppressWarnings("unchecked")public T get(Serializable id) {if (id == null) {return null;}return (T) getHibernateTemplate().get(entityClass, id);}/** * 根据指定的ID获取实体对象,支持延迟加载。 *  * @param id 实体ID * @return 返回指定ID的实体对象,如果没有找到则抛出异常。 */@SuppressWarnings("unchecked")public T load(Serializable id) {if (id == null) {return null;}return (T) getHibernateTemplate().load(entityClass, id);}/** * 保存实体对象。 *  * @param entity *            待保存实体对象 */public void save(T entity) {getHibernateTemplate().save(entity);}/** * 保存或修改持久化对象 *  * @param object */public void saveOrUpdate(Object object) {getHibernateTemplate().saveOrUpdate(object);}/** * 更新实体对象. *  * @param entity * 待更新实体对象. */@SuppressWarnings({ "hiding", "unchecked" })public <T> T merge(T entity) {return (T)getHibernateTemplate().merge(entity);}/** * 删除实体对象。 *  * @param entity *            待删除实体对象 */public void remove(T entity) {getHibernateTemplate().delete(entity);}/** * 根据ID删除实体对象。 *  * @param id *            待删除实体对象ID */public void remove(Serializable id) {getHibernateTemplate().delete(get(id));}/** * 删除多个实体对象 *  * @param entitys *            待删除的实体对象集合 */public void remove(List<T> entitys) {for (T entity : entitys) {getHibernateTemplate().delete(entity);}}/** * 根据属性批量删除实体对象 *  * @param name *            属性名 * @param value *            属性值 */public void removeBy(String name, Object value) {Query query = createQuery("delete from " + entityClass.getName() + " where "+ name + "=?", value);query.executeUpdate();}public int remove(String hsql, Object... values) {int result = 0;Query query = createQuery(hsql, values);result = query.executeUpdate();return result;}public int removeByHql(String hsql) {int result = 0;Query query = createQuery(hsql);result = query.executeUpdate();return result;}/** * 清理当前Session。 */public void clear() {getSession().clear();}/** * 创建一个绑定实体类型的条件查询对象。 *  * @param criterions *            查询条件 * @return 返回一个条件查询对象。 */public Criteria createCriteria(Criterion... criterions) {Criteria criteria = getSession().createCriteria(entityClass);for (Criterion c : criterions) {criteria.add(c);}return criteria;}/** * 创建一个查询对象。 *  * @param hql *            HQL语句 * @param values *            参数值 * @return 返回一个查询对象。 */public Query createQuery(String hql, Object... values) {Query query = getSession().createQuery(hql);for (int i = 0; i < values.length; i++) {query.setParameter(i, values[i]);}return query;}/** * 创建一个绑定实体并设定了排序的条件查询对象。 *  * @param orderBy *            排序属性 * @param isAsc *            是否升序 * @param criterions *            查询条件 * @return 返回一个已设定排序的条件查询对象。 */public Criteria createCriteria(String orderBy, Boolean isAsc,Criterion... criterions) {Criteria criteria = createCriteria(criterions);if (isAsc) {criteria.addOrder(Order.asc(orderBy));} else {criteria.addOrder(Order.desc(orderBy));}return criteria;}/** * 获取指定类型的所有实体对象。 *  * @return 返回指定类型的所有实体对象。 */@SuppressWarnings("unchecked")public List<T> getAll() {Criteria criteria = createCriteria();criteria.setCacheable(ISCACHE);return criteria.list();}/** * 获取指定类型的所有实体对象并进行排序。 *  * @param orderBy *            排序的属性名 * @param isAsc *            是否升序 * @return 返回排序后的指定类型的所有实体对象。 */@SuppressWarnings("unchecked")public List<T> getAll(String orderBy, Boolean isAsc) {Criteria criteria = createCriteria(orderBy, isAsc);criteria.setCacheable(ISCACHE);return criteria.list();}/** * 根据属性的值查找实体对象。 *  * @param name *            属性名 * @param value *            属性值 * @return 返回属性值相符的实体对象集合,如果没有找到返回一个空的集合。 */@SuppressWarnings("unchecked")public List<T> findBy(String name, Object value) {Criteria criteria = createCriteria();if (value == null) {criteria.add(Restrictions.isNull(name));} else {criteria.add(Restrictions.eq(name, value));}criteria.setCacheable(ISCACHE);return criteria.list();}/** * 根据属性的值查找实体对象并进行排序。 *  * @param name *            属性名 * @param value *            属性值 * @param orderBy *            排序属性 * @param isAsc *            是否升序 * @return 返回排序后的属性值相符的实体对象集合,如果没有找到返回一个空的集合。 */@SuppressWarnings("unchecked")public List<T> findBy(String name, Object value, String orderBy,boolean isAsc) {Criteria criteria = createCriteria(orderBy, isAsc);if (value == null) {criteria.add(Restrictions.isNull(name));} else {criteria.add(Restrictions.eq(name, value));}criteria.setCacheable(ISCACHE);return criteria.list();}/** * 判断是否存在属性重复的实体对象。 *  * @param entity *            待判断的实体对象 * @param propNames *            属性名,可以多个属性名用","分割 * @return 如果存在重复的实体对象返回false,否则返回true。 */public Boolean isUnique(T entity, String propNames) {Criteria criteria = createCriteria().setProjection(Projections.rowCount());String[] nameList = propNames.split(",");try {for (String name : nameList) {criteria.add(Restrictions.eq(name, PropertyUtils.getProperty(entity, name)));}// 更新实体类时应该排除自身String idName = getIdName();Serializable id = getId(entity);if (id != null && !idName.equals(propNames)) {criteria.add(Restrictions.not(Restrictions.eq(idName, id)));}} catch (Exception e) {throw new RuntimeException(e);}return Integer.parseInt(criteria.uniqueResult().toString()) == 0;}/** * 根据属性的值查找唯一的实体对象。 *  * @param name *            属性名 * @param value *            属性值 * @return 返回指定唯一的实体对象,如果没有找到则返回null。 */@SuppressWarnings("unchecked")public T findUnique(String name, Object value) {Criteria criteria = createCriteria(Restrictions.eq(name, value));criteria.setCacheable(ISCACHE);return (T) criteria.uniqueResult();}/** * 根据HQL查询语句进行查询。 *  * @param hql *            HQL查询语句 * @param values *            参数值 * @return 返回查询得到的分页对象。 */@SuppressWarnings("unchecked")public List findList(String hql, Object... values) {Query query =createQuery(hql, values);query.setCacheable(ISCACHE);return query.list();}/** * 根据HQL查询语句进行查询。 * query.iterate 在启用缓存且查询数据量比较大时 * 性能比 query.list()高 * @param hql HQL查询语句 * @param values 参数值 * @return 返回查询得到Iterator 数据集 。 */@SuppressWarnings("unchecked")public Iterator<T> findIterator(String hql, Object... values) {Query query =createQuery(hql, values);query.setCacheable(ISCACHE);return query.iterate();}/** * 根据HQL查询语句进行分页查询。 *  * @param hql *            HQL查询语句 * @param pageNo *            待获取的页数 * @param pageSize *            每页的记录数 * @param values *            参数值 * @return 返回查询得到的总数。 */@SuppressWarnings("unchecked")public Integer getTotalCount(String hql,Object... values) {String countQueryString = " select count (*) "+ removeSelect(removeOrders(hql));List countlist = createQuery(countQueryString, values).setCacheable(ISCACHE).list();int totalCount = Integer.parseInt(countlist.get(0).toString());return totalCount;}/** * 根据HQL查询语句进行分页查询。 *  * @param hql *            HQL查询语句 * @param pageNo *            待获取的页数 * @param pageSize *            每页的记录数 * @param values *            参数值 * @return 返回查询得到的分页list对象。 */@SuppressWarnings("unchecked")public List findPageList(String hql, Integer pageNo, Integer pageSize,Object... values) {String countQueryString = " select count (*) "+ removeSelect(removeOrders(hql));List countlist = createQuery(countQueryString, values).setCacheable(ISCACHE).list();int totalCount = Integer.parseInt(countlist.get(0).toString());Integer pageCount = 0;if (totalCount % pageSize > 0) {pageCount = totalCount / pageSize + 1;} else {pageCount = totalCount / pageSize;}if (pageNo > pageCount) {pageNo = pageCount;}if (pageNo < 1) {pageNo =1;}Query query = createQuery(hql, values);query.setCacheable(ISCACHE);List list = query.setFirstResult((pageNo - 1) * pageSize).setMaxResults(pageSize).list();return list;}/** * 获取实体类的主键值。 */private Serializable getId(T entity) throws NoSuchMethodException,IllegalAccessException, InvocationTargetException {return (Serializable) PropertyUtils.getProperty(entity, getIdName());}/** * 获取实体类的主键名。 */private String getIdName() {ClassMetadata meta = getSession().getSessionFactory().getClassMetadata(entityClass);return meta.getIdentifierPropertyName();}/** * 去除HQL查询语句的select部分。 *  * @param hql *            HQL查询语句 * @return 返回去除了select部分的语句。 */private String removeSelect(String hql) {int beginPos = hql.toLowerCase().indexOf("from");   return hql.substring(beginPos);}/** * 去除HQL查询语句的order by部分。 *  * @param hql *            HQL查询语句 * @return 返回去除了order by部分的语句。 */private String removeOrders(String hql) {Pattern p = Pattern.compile("order\\s*by[\\w|\\W|\\s|\\S]*",Pattern.CASE_INSENSITIVE);Matcher m = p.matcher(hql);StringBuffer sb = new StringBuffer();while (m.find()) {m.appendReplacement(sb, "");}m.appendTail(sb);return sb.toString();}/** * 支持sql查询 * @param sql * @param values * @return */@SuppressWarnings("unchecked")public List executeSQL(final String sql,final Object... values) {return (List)getHibernateTemplate().execute(new HibernateCallback() {public Object doInHibernate(Session session) {Query query = session.createSQLQuery(sql);for (int i = 0; i < values.length; i++) {query.setParameter(i, values[i]);}return query.list();}});}/** * 支持sql查询 * @param sql * @param values * @return */@SuppressWarnings("unchecked")public List executeSQL(final String sql,final List values) {return (List)getHibernateTemplate().execute(new HibernateCallback() {public Object doInHibernate(Session session) {Query query = session.createSQLQuery(sql);for (int i = 0; i < values.size(); i++) {query.setParameter(i, values.get(i));}return query.list();}});}/** * 支持sql 新增 和修改 * @param sql * @param values * @return */@SuppressWarnings("unchecked")public Object executeSQLInsertOrUpdate(final String sql,final Object... values) {return (Object)getHibernateTemplate().execute(new HibernateCallback() {public Object doInHibernate(Session session) {Query query = session.createSQLQuery(sql);for (int i = 0; i < values.length; i++) {query.setParameter(i, values[i]);}return  query.executeUpdate();}});}/** * 支持sql 新增 和修改 * @param sql * @param values * @return */@SuppressWarnings("unchecked")public Object executeSQLInsertOrUpdate(final String sql,final List values) {return (Object)getHibernateTemplate().execute(new HibernateCallback() {public Object doInHibernate(Session session) {Query query = session.createSQLQuery(sql);for (int i = 0; i < values.size(); i++) {query.setParameter(i, values.get(i));}return  query.executeUpdate();}});}/** * 支持 HQL方式 更新数据 * @param hql * @param values * @return */@SuppressWarnings("unchecked")public Object update(final String hql,final Object... values) {return (Object)getHibernateTemplate().execute(new HibernateCallback() {public Object doInHibernate(Session session) {Query query = session.createQuery(hql);for (int i = 0; i < values.length; i++) {query.setParameter(i, values[i]);}return query.executeUpdate();}});}/*** * HQL查询结果集 根据结果集 返回结果集记录总数 * @param countQueryString   * @param values * @return */@SuppressWarnings("unchecked")public Integer  getQueryPageListCount(String hql,Object...values){int totalCount =0;List countlist = createQuery(hql, values).setCacheable(ISCACHE).list();if (countlist !=null) {totalCount = countlist.size();}return totalCount;}/**** * 分页查询查询记录 同  * getQueryPageListCount(String hql,Object...values) * 一起使用 达到分页查询 * @param hql * @param pageNo 当前页  * @param pageSize 每页大小 * @param values * @return */@SuppressWarnings("unchecked")public List<T> findQueryPageList(String hql, Integer pageNo, Integer pageSize, Object... values) {Query query = createQuery(hql, values);query.setCacheable(ISCACHE);List list = query.setFirstResult((pageNo - 1) * pageSize).setMaxResults(pageSize).list();return list;}/** * 执行返回MAP对象的 返回的对象属性全部为大写字母 * <FIRSTNAME,"JISEN"><LASTNAME,"STANSEN"> * @param sql * @return */@SuppressWarnings("unchecked")public List executeSql(String sql){return this.getSession().createSQLQuery(sql).setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP).list();}}