jdbcTemplate与hibernateTemplate混用

一直都觉得spring这个框架很不错,对于jdbcTemplate、hibernateTemplate这2个模板更是非常喜欢,有了他们用起来非常方便。一般情况下都是单独使用jdbcTemplate、hibernateTemplate,很少有混用的情况。为什么要混用呢?我想这个大家都懂的。

 

 

 

在这里呢,给大家介绍一个我自己研究的配置(因为网上根本就没有一个完整的配置,都夸夸其谈不做实事,对此种事情本人非常愤慨,对于一个非常需要帮助的人,查到这样的资料,都有慰问他十八代祖宗的想法),供大家参考,望多多指教。本文属原创,转载请注明出处。

 

系统架构(struts2+spring3.0.5+hibernate3.6)采用mvc模式,dao层继承ABaseDao,ABaseDao中封装了jdbcTemplate、hibernateTemplate,并提供jdbc、hibernate两种操作的CUID方法。事务由hibernateTransaction托管并有spring的aop在service层处理。每一个dao都采用泛型方式,注入一个pojo,dao中并不需要写方法,因为ABaseDao都已经实现了,如果ABaseDao中的方法满足不了业务需求,则可以在自己的dao中写相应的方法。这样在servers层就可以直接调用ABaseDao中的方法了,services的每个方法都要throws Exception,注意不要写try-catch,一定要throw出来,事务就靠这个异常回滚呢。

 

不多说,上代码。

1.applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans default-autowire="byName"
 xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xmlns:aop="http://www.springframework.org/schema/aop"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
  http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-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/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

 <!-- 自动注入 -->
 <bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="location" value="classpath:jdbc.properties" />
 </bean>

 <bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource"> 
  <property name="alias" value="CS_dbname"/>
  <property name="driver" value="${jdbc.driverClassName}" />
  <property name="driverUrl" value="${jdbc.url}" />
  <property name="user" value="${jdbc.username}" />
  <property name="password" value="${jdbc.password}" />
  
  <property name="maximumActiveTime" value="600000"/>
  <property name="maximumConnectionCount" value="100"/>
  <property name="minimumConnectionCount" value="10"/>
  <property name="simultaneousBuildThrottle" value="50"/>
        <property name="testBeforeUse" value="true" />
  <property name="houseKeepingTestSql" value="select 1*1 from dual"/>
  
        <property name="prototypeCount" value="5" />
        <property name="trace" value="true" />
        <property name="verbose" value="true" />
 </bean>
 
 <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
  <property name="dataSource" ref="dataSource" />
  <property name="lobHandler" ref="defaultLobHandler"/>
  <property name="configLocation" value="classpath:hibernate.cfg.xml" />
  <property name="hibernateProperties">
   <props>
    <prop key="hibernate.dialect">
     org.hibernate.dialect.MySQLInnoDBDialect
    </prop>
    <prop key="hibernate.connection.autocommit">false</prop>
    <prop key="hibernate.autoReconnect">true</prop>
    <prop key="hibernate.format_sql">false</prop>
    <prop key="hibernate.show_sql">false</prop>
    <prop key="hibernate.hbm2ddl.auto">none</prop>
   </props>
  </property>
 </bean>
 
 <!-- JDBC模板 -->
 <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" >
  <property name="dataSource" ref="dataSource" />
 </bean>
 
 <!-- Hibernate模板 -->
 <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate" >
  <property name="sessionFactory" ref="sessionFactory" />
 </bean>
 <!-- Hibernate事务 -->
 <bean id="hibernateTransaction" class="org.springframework.orm.hibernate3.HibernateTransactionManager" >
  <property name="sessionFactory" ref="sessionFactory" />
  <property name="dataSource" ref="dataSource" />
 </bean>
 
 <!-- blob、clob设置 -->
 <bean id="defaultLobHandler" class="org.springframework.jdbc.support.lob.DefaultLobHandler" lazy-init="true" />

 <!-- AOP事务控制 -->
  <tx:advice id="txAdvice1" transaction-manager="hibernateTransaction">
        <tx:attributes>
            <tx:method name="list*" propagation="NOT_SUPPORTED" />
            <tx:method name="query*" propagation="NOT_SUPPORTED" />
            <tx:method name="get*" propagation="NOT_SUPPORTED" />
            <tx:method name="find*" propagation="NOT_SUPPORTED" />
            <tx:method name="*" propagation="REQUIRED" rollback-for="Throwable"/>
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut id="allManagerMethod" expression="execution(* com.wxthtf.*.*Service.*(..))" />
        <aop:advisor advice-ref="txAdvice1" pointcut-ref="allManagerMethod" />
    </aop:config>
   
    <aop:config>
        <aop:pointcut id="allManagerMethod1" expression="execution(* com.wxthtf.*.*.*Service.*(..))" />
        <aop:advisor advice-ref="txAdvice1" pointcut-ref="allManagerMethod1" />
    </aop:config>
 
 
</beans>

 

 2.ABaseDao

package com.wxthtf.common;

import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;

import org.apache.commons.lang.StringUtils;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementSetter;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.support.lob.LobHandler;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;

/**
 * <li>Title: ABaseDao.java</li>
 * <li>Project: WorkFrame</li>
 * <li>Package: com.crescent.common</li>
 * <li>Description: Dao的基础类</li>
 * <li>Copyright: Copyright (c) 2011</li>
 * <li>Company: wxthtf Technologies </li>
 * <li>Created on May 23, 2011 9:46:09 PM</li>
 *
 * @author chun_chang
 * @version 1.0.0.0
 *
 * @param <T>
 */
public abstract class ABaseDao<T, PK extends Serializable> {
 private Class<T> entityClass = null;
 //private Serializable id = null;

 @SuppressWarnings("unchecked")
 public ABaseDao(){
  Type genType = getClass().getGenericSuperclass();
  Type[] params = ((ParameterizedType) genType).getActualTypeArguments();
  entityClass = (Class<T>) params[0];
  //id = (Serializable) params[1];
 }

 protected JdbcTemplate jdbcTemplate = null;
 protected HibernateTemplate hibernateTemplate = null;
 protected LobHandler defaultLobHandler = null;

 private String pageSqlPrefix = "select tt.* from (select t.*, rownum num from ( ";
 private String pageSqlSuffix = " ) t) tt where ? < num and num <= ?";

 /*
  * 1.jdbc部分 ***************************************************************
  */

 /**
  * 描述:getPageSql oracle分页
  * @param sql
  * @return
  * @throws Exception
  * @CreateOn Jul 26, 2011  8:45:16 PM
  * @author chun_chang
  */
 protected String getPageSql(String sql) throws Exception  {
  StringBuffer buff = new StringBuffer(pageSqlPrefix);
  buff.append(sql).append(pageSqlSuffix);
  return buff.toString();
 }

 
 
 /**
  * query
  */
 public int queryForInt(String sql)  throws Exception {
  return this.jdbcTemplate.queryForInt(sql);
 }

 public int queryForInt(String sql, Object[] params)  throws Exception {
  return this.jdbcTemplate.queryForInt(sql, params);
 }

 /**
  * 描述:queryForString 只查询一个字段
  * @param sql
  * @return
  * @throws Exception
  * @CreateOn Jul 6, 2011  5:24:28 PM
  * @author chun_chang
  */
 @SuppressWarnings("unchecked")
 public String queryForString(String sql) throws Exception  {
  return (String) this.jdbcTemplate.queryForObject(sql, new RowMapper(){

   public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
    String str = rs.getString(1);
    return StringUtils.isBlank(str) ? "" : str;
   }

  });
 }

 /**
  * 描述:queryForString 只查询一个字段
  * @param sql
  * @param params
  * @return
  * @throws Exception
  * @CreateOn Jul 6, 2011  5:24:45 PM
  * @author chun_chang
  */
 @SuppressWarnings("unchecked")
 public String queryForString(String sql, Object[] params)  throws Exception {
  return (String) this.jdbcTemplate.queryForObject(sql, params, new RowMapper(){

   public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
    String str = rs.getString(1);
    return StringUtils.isBlank(str) ? "" : str;
   }

  });
 }

 public T queryForObject(String sql) throws Exception {
  List<T> list = this.queryForList(sql);
  if(null == list || list.size() == 0) {
   return null;
  } else {
   return list.get(0);
  }
 }

 public T queryForObject(String sql, Object[] params) throws Exception {
  List<T> list = this.queryForList(sql, params);
  if(null == list || list.size() == 0) {
   return null;
  } else {
   return list.get(0);
  }
 }

 public List<T> queryForList(String sql) throws Exception {
  return this.jdbcTemplate.query(sql, new BeanPropertyRowMapper<T>(entityClass));
 }

 public List<T> queryForList(String sql, Object[] params) throws Exception {
  return this.jdbcTemplate.query(sql, params, new BeanPropertyRowMapper<T>(entityClass));
 }

 @SuppressWarnings("unchecked")
 public List<String> query(String sql) throws Exception {
  return this.jdbcTemplate.query(sql, new RowMapper(){

   public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
    return rs.getString(1);
   }

  });
 }

 @SuppressWarnings("unchecked")
 public List<String> query(String sql, Object[] params) throws Exception {
  return this.jdbcTemplate.query(sql, params, new RowMapper(){

   public Object mapRow(ResultSet rs, int rowNum) throws SQLException {
    String str = rs.getString(1);
    return StringUtils.isBlank(str) ? "" : str;
   }

  });
 }

 /**
  * insert、update
  */
 public int save(String sql, final Object[] params) throws Exception {
  return this.jdbcTemplate.update(sql, new PreparedStatementSetter(){

   public void setValues(PreparedStatement ps) throws SQLException {
    for(int i = 1; i <= params.length; i++) {
     ps.setObject(i, params[i - 1]);
    }
   }

  });
 }

 public int[] batchSave(String sql, final List<Object[]> list) throws Exception {
  return this.jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter(){

   public int getBatchSize() {
    return list.size();
   }

   public void setValues(PreparedStatement ps, int i) throws SQLException {
    Object[] params = list.get(i);
    for(int j = 1; j <= params.length; j++) {
     ps.setObject(j, params[j - 1]);
    }
   }

  });
 }

 public int[] batchSave(String sql, final Object[] params) throws Exception {
  return this.jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter(){

   public int getBatchSize() {
    return params.length;
   }

   public void setValues(PreparedStatement ps, int i) throws SQLException {
    ps.setObject(1, params[i]);
   }

  });
 }

 /**
  * delete
  */
 public int delete(String sql) throws Exception {
  return this.jdbcTemplate.update(sql);
 }
 
 public int delete(String sql, final Object... params) throws Exception {
  return this.jdbcTemplate.update(sql, params);
 }

 public int deleteById(String sql, final String id) throws Exception {
  return this.jdbcTemplate.update(sql, new PreparedStatementSetter(){

   public void setValues(PreparedStatement ps) throws SQLException {
    ps.setObject(1, id);
   }

  });
 }

 public int[] batchDeleteByIds(String sql, final String[] ids) throws Exception {
  return this.jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter(){

   public int getBatchSize() {
    return ids.length;
   }

   public void setValues(PreparedStatement ps, int i) throws SQLException {
    ps.setObject(1, ids[i]);
   }

  });
 }

 public int[] batchDeleteByIds(String sql, final List<String> list) throws Exception {
  return this.jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter(){

   public int getBatchSize() {
    return list.size();
   }

   public void setValues(PreparedStatement ps, int i) throws SQLException {
    ps.setObject(1, list.get(i));
   }

  });
 }

 /*
  * 2.hibernate部分 ***************************************************************
  */
 
 /**
  * 描述:queryString4Paging 使用HQL进行分页查询
  * @param fields 要查询的字段数组
  * @param fromAndWhereHql from与where条件字符串
  * @param start 开始条数
  * @param limit 长度
  * @param params where条件参数
  * @return
  * @throws Exception
  * @CreateOn Jul 6, 2011  5:33:54 PM
  * @author chun_chang
  */
 public String queryString4Paging(final String[] fields, final String fromAndWhereHql, final int start, final int limit, final Object[] params)
  throws Exception {
  
  if(null == fields || fields.length <= 0){
   return "{totalProperty:0,root:[]}";
  }
  
  if(StringUtils.isBlank(fromAndWhereHql) || start < 0 || limit < 0) {
   return "{totalProperty:0,root:[]}";
  }

  int totalProperty = 0;
  String json = "[]";
  JSONArray jsonArray = null;
  String[] jsonField = new String[fields.length];
  
  String countHql = "select count(*) " + fromAndWhereHql;
  StringBuffer queryHql = new StringBuffer("select ");
  for(int k=0; k<fields.length; k++){
   String field = fields[k];
   queryHql.append(field).append(",");
   if(field.lastIndexOf(".") > 0){
    jsonField[k] = field.substring(field.lastIndexOf(".") + 1, field.length());
   } else {
    jsonField[k] = field;
   }
  }
  queryHql.deleteCharAt(queryHql.length() - 1);
  queryHql.append(" ").append(fromAndWhereHql);
  
  List<?> list = this.hibernateTemplate.find(countHql, params);
  try {
   totalProperty = Integer.valueOf(String.valueOf(list.get(0)));
  } catch(Exception e) {
   totalProperty = 0;
  }
  
  List<?> list1 = this.execute(queryHql.toString(), start, limit, params);
  if(null != list1 && list1.size() > 0){
   List<Map<String, Object>> resultList = new ArrayList<Map<String, Object>>();
   if(jsonField.length > 1){
    for(int j = 0; j < list1.size(); j++) {
     Object[] obj = (Object[]) list1.get(j);
     Map<String, Object> map = new HashMap<String, Object>();
     for(int i = 0; i < jsonField.length; i++) {
      map.put(jsonField[i], obj[i]);
     }
     resultList.add(map);
    }
   } else {
    for(int j = 0; j < list1.size(); j++) {
     String obj = String.valueOf(list1.get(j));
     Map<String, Object> map = new HashMap<String, Object>();
     map.put(jsonField[0], obj);
     resultList.add(map);
    }
   }
   jsonArray = JSONArray.fromObject(resultList);
   json = jsonArray.toString();
  }
  return "{totalProperty:" + totalProperty + ",root:" + json + "}";
 }
 
 public T getById(String id) throws Exception {
  return this.hibernateTemplate.get(entityClass, id);
 }

 public List<T> getAll() throws Exception {
  return this.hibernateTemplate.loadAll(entityClass);
 }

 public List<T> find(String hql) throws Exception {
  return find(hql, (Object[]) null);
 }

 public List<T> find(String hql, Object value) throws Exception {
  return find(hql, new Object[] { value });
 }

 @SuppressWarnings("unchecked")
 public List<T> find(String hql, Object... values) throws Exception {
  return this.hibernateTemplate.find(hql, values);
 }

 public Serializable save(T entity) throws Exception {
  Serializable ser = this.hibernateTemplate.save(entity);
  this.hibernateTemplate.flush();
  return ser;
 }

 public void update(T entity) throws Exception {
  this.hibernateTemplate.update(entity);
  this.hibernateTemplate.flush();
 }

 public void saveOrUpdate(T entity) throws Exception {
  this.hibernateTemplate.saveOrUpdate(entity);
  this.hibernateTemplate.flush();
 }

 public void saveOrUpdate(List<T> list) throws Exception {
  this.hibernateTemplate.saveOrUpdateAll(list);
  this.hibernateTemplate.flush();
 }

 public void delete(T entity) throws Exception {
  this.hibernateTemplate.delete(entity);
  this.hibernateTemplate.flush();
 }

 public void deleteById(PK id) throws Exception {
  T t = this.hibernateTemplate.get(entityClass, id);
  if(t != null) {
   this.hibernateTemplate.delete(t);
  }
 }

 public int deleteAll() throws Exception {
  final String hql = "delete from " + entityClass.getName();
  int count = this.hibernateTemplate.execute(new HibernateCallback<Integer>(){

   public Integer doInHibernate(Session session) throws HibernateException, SQLException {
    return session.createQuery(hql).executeUpdate();
   }

  });
  this.hibernateTemplate.flush();
  return count;
 }

 protected List<?> execute(final String hql, final int start, final int limit, final Object... params) {
  List<?> list = this.hibernateTemplate.execute(new HibernateCallback<List<?>>(){

   public List<?> doInHibernate(Session session) throws HibernateException, SQLException {
    Query query = session.createQuery(hql);
    query.setFirstResult(start);
    query.setMaxResults(limit);
    if(null != params){
     for(int i = 0; i < params.length; i++) {
      query.setParameter(i, params[i]);
     }
    }
    return query.list();
   }

  });
  this.hibernateTemplate.flush();
  return list;
 }
 
 
 public void deleteAll(Collection<?> entities) throws Exception {
  this.hibernateTemplate.deleteAll(entities);
  this.hibernateTemplate.flush();
 }

 public JdbcTemplate getJdbcTemplate() {
  return jdbcTemplate;
 }

 public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
  this.jdbcTemplate = jdbcTemplate;
 }

 public LobHandler getDefaultLobHandler() {
  return defaultLobHandler;
 }

 public void setDefaultLobHandler(LobHandler defaultLobHandler) {
  this.defaultLobHandler = defaultLobHandler;
 }

 public HibernateTemplate getHibernateTemplate() {
  return hibernateTemplate;
 }

 public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
  this.hibernateTemplate = hibernateTemplate;
 }
}

 

 

实例:

1.MenuDao

package com.wxthtf.sys.menu;

import com.wxthtf.common.ABaseDao;
import com.wxthtf.pojo.SecurityMenu;


/**
 * <li>Title: MenuDao.java</li>
 * <li>Project: WorkFrame</li>
 * <li>Package: com.crescent.sys.menu</li>
 * <li>Description: </li>
 * <li>Copyright: Copyright (c) 2011</li>
 * <li>Company: wxthtf Technologies </li>
 * <li>Created on May 23, 2011 10:04:58 PM</li>
 *
 * @author chun_chang
 * @version 1.0.0.0
 *
 */
public class MenuDao extends ABaseDao<SecurityMenu, String>{
 
}

 

2.MenuService

package com.wxthtf.sys.menu;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import net.sf.json.JSONObject;

import org.apache.commons.lang.StringUtils;
import org.springframework.jdbc.core.RowMapper;

import com.wxthtf.common.FormatUtil;
import com.wxthtf.pojo.SecurityFunction;
import com.wxthtf.pojo.SecurityMenu;
import com.wxthtf.pojo.SecurityUsers;
import com.wxthtf.sys.role.RoleFuncsMapDao;

/**
 * <li>Title: MenuService.java</li>
 * <li>Project: WorkFrame</li>
 * <li>Package: com.crescent.sys.menu</li>
 * <li>Description: </li>
 * <li>Copyright: Copyright (c) 2011</li>
 * <li>Company: wxthtf Technologies </li>
 * <li>Created on May 24, 2011 9:55:48 PM</li>
 *
 * @author chun_chang
 * @version 1.0.0.0
 *
 */
public class MenuService {
 private MenuDao menuDao = null;

 

public String delMenu(String id)  throws Exception {
  // 检查菜单是否被桌面使用
  String sql = "select count(*) from home_panels where menuId = ?";
  int count = this.menuDao.queryForInt(sql, new Object[]{ id });
  if(count == 0){// 菜单没有被使用
   sql = "select functionId from security_function where menuId like '" + id + "%'";
   List<String> list = this.funcsDao.query(sql);
   
   sql = "delete from security_role_function where functionId = ?";
   this.roleFuncsMapDao.batchDeleteByIds(sql, list);
   
   sql = "delete from security_function where menuId like '" + id + "%'";
   this.funcsDao.delete(sql);
   
   sql = "delete from security_menu where menuId like '" + id + "%'";
   this.menuDao.delete(sql);
   return "1";
  } else {
   return "0";
  }
 }

 

 public MenuDao getMenuDao() {
  return menuDao;
 }

 public void setMenuDao(MenuDao menuDao) {
  this.menuDao = menuDao;
 }

 

}

 

 

 

【转录调控网络】代谢组学与其他组学的联合分析经典模式简介 多组学联合分析经典模式转录组学&代谢组学联合分析 转录组学&代谢组学联合分析 转录组是获得生物体内基因表达的重要方法,代谢组是生物体表型的基础和直接体现者。 转录组测序可以得到大量差异表达基因和调控代谢通路,但由于基因与表型之间很难之间关联,导致关键的信号通路难以确定,因此往往达不到预期的研究目的。代谢产物是生物体在内外调控下基因转录的最终结果,是生物体表型的物质基础。 在系统生物学研究时代,生物过程复杂多变,基因调控网络复杂。针对特定的生理、病理等表型进行研究,利用转录组的数据获得大量差异 阅读详情

相关推荐

glibc手动升级高版本导致系统(RedHat/Centos)异常(无法开机等)的解决方法(回退低版本glibc)

我的系统是Redhat7.6, 理论上Redhat7/Centos7都可以使用该方法解决问题。 首先慎重提醒各位:glibc升级会产生无法预料的后果!由于Android NDK需要高版本的glibc才可以使用,所以作死手动去更新了glibc2.18,使得重启系统后图形界面消失。(Redhat/Centos升级此类安装包最好用yum升级,因为系统内的程序对他们的依赖很大,升级会导致大部分程序无法使用...

weixin_42881528的博客 9698

JdbcTemplate查询返回JavaBean的几种方法

关于JdbcTemplate的官方描述如下: org.springframework.jdbc.core.JdbcTemplate 大约的讲,将JdbcTemplate返回的list结果集生成JavaBean我找到四种方式,都还不错。 本例比较特殊,该JavaBean里面包含一个child属性,该属性类型为List,见代码,而查询父子的SQL及需要的结果完全不同。 见代码 Use...

weixin_33831196的博客 2456

Obsidian免费同步全攻略:手把手教你用OneDrive+Remotely Save插件跨设备同步笔记

本文提供了一份详细的Obsidian免费同步方案指南,核心是利用OneDrive云存储与Remotely Save插件实现跨设备笔记同步。文章手把手教学,涵盖插件安装、OneDrive授权配置、桌面端与移动端的同步设置,并解答了常见问题,帮助用户在不依赖官方付费服务的情况下,构建稳定、自主的免费同步工作流。

bash7scripter的博客 849

spring的jdbctemplate与hibernate

为什么80%的码农都做不了架构师?>>> ...

weixin_34393428的博客 502

Matlab2018a崩溃解决的办法No sandbox or build area path

Matlab 2018a (No sandbox or build area path)出现崩溃后需要使用terminal进行如下操作: cd /home/david/MySoft/MATLAB/R2018a/bin/glnxa64 (你的matlab路径) mkdir exclude mv libfreetype* exclude/ 执行后图片如下: 如果你用的Windows系统,请手动按照上面步骤剔除了dll。 Matlab 2018a (No sandbox or build are

David Xiao 1万+

Unity中Newtonsoft.Json的使用(一)

在Unity中下载Newtonsoft.Json,并进行序列化和反序列化

洛苍离的博客 1万+

Spring结合hibernate和jdbcTemplate多数据源事物问题

首先说明我的环境Spring3.2.8+hibernate3.6.10.Final+tomcat7 在写这篇博客前在网上查询了相关资料 ,网上给出的结论是:如果有多个相同的数据源,开启了多个事物,使用spring的声明式事物(AOP配置:1、xml配置 2、注解Transaction 两者都是。关于编程式事物就自行百度)管理事物,一旦发生RunTimeException异常,那么多个事物都会回滚

chuxue1989的专栏 2547

匹配博弈双边选择算法

刚学图论匹配方面的一些知识,记录下来。

ymengm的博客 2435

在spring中同时使用jdbcTemplate和hibernateTemplate

在spring中同时使用jdbcTemplate和hibernateTemplate 就像我们知道的一样,Hibernate是ORM领域事实上的标准,它在操作数据库方面,提供了最大程度的遍历与快捷,而hibernate与spring的结合,更是将这种便利发挥到了极致,这其中得益于HibernateDaoSupport 和HiberateTemplate以及HibernateTransation

wczy_peng的专栏 2490

Supreme小程序自动化抢购终端——源码架构与执行流程全解析

本系统是一套基于开发的桌面端小程序自动化抢购终端。把只有开发者能跑的脚本,包装成普通用户也能操作的桌面工具。参数自动捕获 → 商品多关键词检索 → sku/尺码/库存映射 → 多商品任务队列 → 定时/立即抢购 → 订单创建 → 支付参数拉取 → 本地服务生成支付链接 → 手机微信扫码付款这套 Supreme 抢购终端,表面上看是一个"下单工具"。但从工程角度审视,它已经具备了一个小型桌面自动化系统GUI 层:CustomTkinter 现代化界面,线程安全业务层:多商品队列、定时调度、任务编排。

猫敷雪 206

基于英特尔 RealSense D455 相机实现裂缝尺寸以及深度测量

D455 相机可用于对这些零部件进行高精度的表面检测,快速准确地测量裂缝的尺寸和深度,实现自动化的质量控制和缺陷筛查,提高生产效率和产品质量。D455 相机能够对焊缝表面进行细致扫描,测量焊缝的宽度、深度以及焊缝表面的不规则程度等参数,帮助检测焊缝是否存在缺陷,如未焊透、焊瘤等,为焊接质量的评估和改进提供数据支持。:RGB 传感器采用全局快门,并且其视场与深度视场相匹配,能够提供更出色的 RGB 图像质量,以及深度图像和 RGB 图像之间的更好对应性,从而可提高扫描质量。可以看出宽度和高度都是十分准确的。

qq_53545309的博客 1715

jdbctemplate 事务_JdbcTemplate和HibernateTemplate

今天把程序开发中常用的两种JDBC方法整理一下,以后做CRUD开发时,对于什么样的sql语句选用什么方法来实现也有个可遵循的依据。基于Spring框架,要支持JDBC,需要关注的一个核心接口就是DaoSupport。DaoSupport常用的三种dao支持有:HibernateDaoSupportJdbcDaoSupportTopLinkDaoSupport今天主要介绍HibernateDaoSu...

weixin_33236595的博客 421

4、接收天线:接收电压、功率和传输系数

本文详细探讨了接收天线的性能参数,包括接收电压、功率和传输系数,通过建立等效电路模型分析接收偶极子的电流和开路电压,并定义电压和功率传输函数。研究揭示了天线长度、工作频率及极化失配对传输性能的影响,并提出了优化接收天线性能的策略,为天线系统的设计与优化提供了理论支持。

ll5678的博客 233

Hibertnate与JDBC混合使用

Hibernate与JDBCtemplate如何混用? 一开始在项目中使用的是Hibernate,但是发现Hibernate在做批量操作时,效率不是很理想。所以现在采用JDBCTemplate和Hibernate混用,现在问题是如何配置他们的事务? 两者都用同一个datasource ,同一spring管理事务就没有问题。   另外要注意两点: 1. 由于Spring ...

ZXCVBNM645的博客 444

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

HibernateTransactionManager事物管理

如果一个方法中既用了HibernateTemplate,又用了JdbcTemplate,应该怎么配单实例的db事务呢(多例免谈)用 DataSouceTransactionManager是不行的,而用HibernateTransactionManager就可以保证 原因的话看下它们源代码,会发现HibernateTransactionManager中的处理可以保证SessionFactoryUt

wo240的专栏 473

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

HibernateTransactionManager管理事务

如果一个方法中既用了HibernateTemplate,又用了JdbcTemplate,应该怎么配单实例的db事务呢(多例免谈)用 DataSouceTransactionManager是不行的,而用HibernateTransactionManager就可以保证 原因的话看下它们源代码,会发现HibernateTransactionManager中的处理可以保证SessionFactoryUt

wo240的专栏 1124

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

HibernateTransactionManager事务管理

博客分类:  Hibernate HibernateDAOSpringMySQLJDBC  如果一个方法中既用了HibernateTemplate,又用了JdbcTemplate,应该怎么配单实例的db事务呢(多例免谈)用 DataSouceTransactionManager是不行的,而用HibernateTransactionManager就可以保证  原因的话看下它们源代

evilcry2013的博客 912

Spring中HibernateDaoSuport、HibernateTemplate、jdbcTemplate

spring提供访问数据库的有三种方式: HibernateDaoSupport,HibernateTemplate(推荐使用),jdbcTemplate HibernateTemplate:org.springframework.orm.hibernate3.HibernateTemplate HibernateDaoSupport:org.springframework.orm.hib

u010469430的专栏 922

jdbctemplate查询大批量数据_JdbcTemplate和HibernateTemplate

今天把程序开发中常用的两种JDBC方法整理一下,以后做CRUD开发时,对于什么样的sql语句选用什么方法来实现也有个可遵循的依据。基于Spring框架,要支持JDBC,需要关注的一个核心接口就是DaoSupport。DaoSupport常用的三种dao支持有:HibernateDaoSupportJdbcDaoSupportTopLinkDaoSupport今天主要介绍HibernateDaoSu...

weixin_42502165的博客 1254

JdbcTemplate and HibernateTemplate

首先获取JdbcTemplate对象public static JdbcTemplate getJdbcTemplate(){ //创建dataSource DriverManagerDataSource dataSource=new DriverManagerDataSource(); dataSource.setDriverClassName("com.mysql.jdbc.Dri...

To__Life的博客 447

jdbcTemplate与hibernate共享事务管理

HibernateTemplate一般是为了加快开发效率,还有就是使用Hibernate的时候,更简洁,更便利,而统一的声明事务,又让本来就已经很简洁的Hibernate对事务的处理,大大简化 但任何事务都有两面性,在带来大量便捷的同时,Hibernate也给我们留下了一点小小的遗憾,比如众所周知的,在处理大批量数据查询的时候,Hibernate的查询效率,是不尽人意的,有人做过测试,在高并发查询

sarck3的专栏 1641

JDBCTemplate和HibernateTemplate事物源码解析

由于项目中对批量的sql进行入库处理。所以打算用jdbcTemplate。在其他的增删改查中都是用hibernateTemplate。 在这里考虑到一个问题,就是当jdbcTemplate和hibernateTemplate结合用的时候,事物是怎么样的了? 经过测试:在一个方法中同时使用jdbcTemplate,和hibernateTemplate对数据进行增加操作。然后抛出异

xiaomin1991222的专栏 479

spring的HibernateDaoSupport以及HibernateTemplate和jdbcTemplate的选择问题

spring提供访问数据库的有三种方式: HibernateDaoSupport,HibernateTemplate(推荐使用),jdbcTemplate HibernateTemplate:org.springframework.orm.hibernate3.HibernateTemplate HibernateDaoSupport:org.springframework.orm.hib

zcywell的专栏 2万+

hibernateTemplate和JDBCTemplate

现在许多项目都采用hibernateTemplate和JDBCTemplate混用的方式 HibernateTemplate一般是为了加快开发效率,还有就是使用Hibernate的时候,更简洁,更便利,而统一的声明事务,又让本来就已经很简洁的Hibernate对事务的处理,大大简化 但任何事务都有两面性,在带来大量便捷的同时,Hibernate也给我们留下了一点小小的遗憾,比如众所周知的,在处

ygl6150373的博客 1982

jdbcTemplate 和 hibernateTemplate的运用比较

现在许多项目都采用hibernateTemplate和JDBCTemplate混用的方式 HibernateTemplate一般是为了加快开发效率,还有就是使用Hibernate的时候,更简洁,更便利,而统一的声明事务,又让本来就已经很简洁的Hibernate对事务的处理,大大简化 但任何事务都有两面性,在带来大量便捷的同时,Hibernate也给我们留下了一点小小的遗憾,比如众所周知的,在处理大

rotman173的专栏 1569
上一篇: 创建静态数组store
下一篇: jdbcTemplate与hibernateTemplate混用
chun521
博客等级 码龄20年 11粉丝 144原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值