经过半天的努力,终于配置成功了,最后因为事务的原因,又折腾了一小时,这就是菜鸟的悲剧。先声明一下,项目是用maven创建的。
废话少说,先上代码
package com.stoscm.service;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;
import org.springframework.jdbc.CannotGetJdbcConnectionException;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.stoscm.pojo.ExpressSettlementExpress;
/**
* JdbcTemplate批量更新操作
* @author Administrator
*
*/
@Service
public class ExpressSettlementExpressBatchModfiyService{
@Autowired
private static JdbcTemplate jdbcTemplate;
/**
* 批量更新
*
* @param eseExpressArr
*/
@Transactional
public int[] batchModfiy(final List<ExpressSettlementExpress> eseList) {
try {
//ApplicationContext ctx=new FileSystemXmlApplicationContext("classpath:/applicationContext-basic.xml");
// jdbcTemplate = new JdbcTemplate((DataSource) ctx.getBean("dataSource"));
WebApplicationContext wac = ContextLoader.getCurrentWebApplicationContext();
jdbcTemplate = new JdbcTemplate((DataSource) wac.getBean("dataSource"));
String sql = "update t_express_settlement_express set lastEditTime=NOW() " +
", warehouse = ?, branchExpress = ?, express = ?, area = ?" +
", subregion = ?, first = ?, firstPrice = ?, additional = ?" +
", additionalPrice = ?, arbArbitariec = ?, formExpenses = ?" +
", weightExpenses = ?, deliveryExpenses = ?, remark = ?" +
", lastEditorCode = ? where id = ?";
BatchPreparedStatementSetter setter = new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i)
throws SQLException {
// TODO Auto-generated method stub
ps.setString(1, eseList.get(i).getWarehouse().getNumber());
ps.setLong(2, eseList.get(i).getBranchExpress().getNumber());
ps.setLong(3, eseList.get(i).getBranchExpress().getNumber());
ps.setLong(4, eseList.get(i).getArea().getNumber());
ps.setLong(5, eseList.get(i).getSubregion().getNumber());
ps.setInt(6, eseList.get(i).getFirst());
ps.setBigDecimal(7, eseList.get(i).getFirstPrice());
ps.setInt(8, eseList.get(i).getAdditional());
ps.setBigDecimal(9, eseList.get(i).getAdditionalPrice());
ps.setBigDecimal(10, eseList.get(i).getArbArbitariec());
ps.setBigDecimal(11, eseList.get(i).getFormExpenses());
ps.setBigDecimal(12, eseList.get(i).getWeightExpenses());
ps.setBigDecimal(13, eseList.get(i).getDeliveryExpenses());
ps.setString(14, eseList.get(i).getRemark());
ps.setString(15, eseList.get(i).getLastEditor().getId().toString());
ps.setLong(16, eseList.get(i).getId());
}
@Override
public int getBatchSize() {
// TODO Auto-generated method stub
return eseList.size();
}
};
int[] i = jdbcTemplate.batchUpdate(sql, setter);
DataSourceUtils.getConnection((DataSource) ctx.getBean("dataSource")).commit();
return i;
} catch (CannotGetJdbcConnectionException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (BeansException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
DataSourceUtils.getConnection((DataSource) ctx.getBean("dataSource")).commit();
这一句很重要,要不然数据库虽然操作成果,但不会提交事务,也就是数据库不会更新数据。
applicationContext-basic.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" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.1.xsd">
<!-- 注解支持 -->
<context:annotation-config />
<!-- 启动组件扫描,排除@Controller组件,该组件由SpringMVC配置文件扫描-->
<context:component-scan base-package="com.stoscm">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Controller" />
</context:component-scan>
<!-- 强制使用CGLIB代理 -->
<aop:aspectj-autoproxy proxy-target-class="true" />
<!-- properties -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath*:/system.properties</value>
<value>classpath*:/jdbc.properties</value>
</list>
</property>
</bean>
<!-- 拦截器 -->
<bean id="serverUrlIntercepter" class="com.stoscm.commons.interceptor.ServerUrlInterceptor">
<property name="ctxPath" value="${ctx.url}"/>
</bean>
<!-- dataSource -->
<bean id="dataSourceTarget" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxIdle" value="${dbcp.maxIdle}" />
<property name="maxActive" value="${dbcp.maxActive}" />
<property name="maxWait" value="10000" />
<property name="validationQuery" value="select 1 from DUAL" />
<property name="testOnBorrow" value="true" />
<property name="testWhileIdle" value="true" />
<property name="timeBetweenEvictionRunsMillis" value="${dbcp.timeBetweenEvictionRunsMillis}" />
<property name="minEvictableIdleTimeMillis" value="${dbcp.minEvictableIdleTimeMillis}" />
<property name="numTestsPerEvictionRun" value="5" />
<property name="defaultAutoCommit" value="false" />
</bean>
<bean id="dataSource" class="net.sf.log4jdbc.Log4jdbcProxyDataSource">
<constructor-arg ref="dataSourceTarget" />
</bean>
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<!--mybatis3 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="configLocation" value="classpath:/mybatis-config.xml" />
<property name="mapperLocations" value="classpath:/mapper/*Mapper.xml" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- 映射器接口文件设置基本的包路径 并自动生成DAO接口DaoImpl的实现 内置已经创建SqlSessionFactory -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.stoscm.dao" />
</bean>
</beans>
有关jdbcTemplate的使用,http://blog.csdn.net/dyllove98/article/details/7772463这里更加详细
分享到:
相关推荐
SpringBoot JdbcTemplate批量操作是提高数据处理效率的重要手段,尤其在处理大量数据插入或更新时。JdbcTemplate作为Spring框架的一部分,提供了便捷且安全的数据库访问方式,它简化了JDBC的使用,避免了手动管理...
批量操作的关键在于有效地利用了`PreparedStatement`,它预编译SQL语句并允许多次执行,只需要改变参数值,这样可以避免因重复解析SQL而带来的性能开销。同时,`JdbcTemplate`提供了异常处理和资源管理,使得代码更...
包括MyBatis-Plus提供的批量更新,JdbcTemplate提供的批量更新,在xml中循环拼接sql批量更新、case when语句批量更新、replace into方式批量更新、ON DUPLICATE KEY UPDATE批量更新。 适用于对Spring Boot和数据库...
包括MyBatis-Plus提供的批量更新,JdbcTemplate提供的批量更新,在xml中循环拼接sql批量更新、case when语句批量更新、replace into方式批量更新、ON DUPLICATE KEY UPDATE批量更新。 适用于对Spring Boot和数据库...
包括MyBatis-Plus提供的批量更新,JdbcTemplate提供的批量更新,在xml中循环拼接sql批量更新、case when语句批量更新、replace into方式批量更新、ON DUPLICATE KEY UPDATE批量更新。 适用于对Spring Boot和数据库...
包括MyBatis-Plus提供的批量更新,JdbcTemplate提供的批量更新,在xml中循环拼接sql批量更新、case when语句批量更新、replace into方式批量更新、ON DUPLICATE KEY UPDATE批量更新。 适用于对Spring Boot和数据库...
包括MyBatis-Plus提供的批量更新,JdbcTemplate提供的批量更新,在xml中循环拼接sql批量更新、case when语句批量更新、replace into方式批量更新、ON DUPLICATE KEY UPDATE批量更新。 适用于对Spring Boot和数据库...
包括MyBatis-Plus提供的批量更新,JdbcTemplate提供的批量更新,在xml中循环拼接sql批量更新、case when语句批量更新、replace into方式批量更新、ON DUPLICATE KEY UPDATE批量更新。 适用于对Spring Boot和数据库...
包括MyBatis-Plus提供的批量更新,JdbcTemplate提供的批量更新,在xml中循环拼接sql批量更新、case when语句批量更新、replace into方式批量更新、ON DUPLICATE KEY UPDATE批量更新。 适用于对Spring Boot和数据库...
包括MyBatis-Plus提供的批量更新,JdbcTemplate提供的批量更新,在xml中循环拼接sql批量更新、case when语句批量更新、replace into方式批量更新、ON DUPLICATE KEY UPDATE批量更新。 适用于对Spring Boot和数据库...
包括MyBatis-Plus提供的批量更新,JdbcTemplate提供的批量更新,在xml中循环拼接sql批量更新、case when语句批量更新、replace into方式批量更新、ON DUPLICATE KEY UPDATE批量更新。 适用于对Spring Boot和数据库...
Spring的JdbcTemplate插入操作返回主键ID的方法 - - ITeye技术网站
包括MyBatis-Plus提供的批量更新,JdbcTemplate提供的批量更新,在xml中循环拼接sql批量更新、case when语句批量更新、replace into方式批量更新、ON DUPLICATE KEY UPDATE批量更新。 适用于对Spring Boot和数据库...
包括MyBatis-Plus提供的批量更新,JdbcTemplate提供的批量更新,在xml中循环拼接sql批量更新、case when语句批量更新、replace into方式批量更新、ON DUPLICATE KEY UPDATE批量更新。 适用于对Spring Boot和数据库...
包括MyBatis-Plus提供的批量更新,JdbcTemplate提供的批量更新,在xml中循环拼接sql批量更新、case when语句批量更新、replace into方式批量更新、ON DUPLICATE KEY UPDATE批量更新。 适用于对Spring Boot和数据库...
在Java的Spring框架中,JdbcTemplate是一个非常重要的组件,它为数据库操作提供了简便的模板方法。在处理大量数据时,传统的分页方式可能会导致内存溢出,这时可以使用游标滚动来实现高效的分页。本篇文章将深入探讨...
批量插入数据在处理大量数据时能显著提升性能,因为数据库通常会对批量操作进行优化。在`JdbcDaoSupport`中,我们可以通过`JdbcTemplate`的`batchUpdate(String sql, BatchPreparedStatementSetter setter)`方法来...
包括MyBatis-Plus提供的批量更新,JdbcTemplate提供的批量更新,在xml中循环拼接sql批量更新、case when语句批量更新、replace into方式批量更新、ON DUPLICATE KEY UPDATE批量更新。 适用于对Spring Boot和数据库...
SpringJdbcTemplate是一个模板类,它提供了大量的方法来执行SQL查询、更新、存储过程等操作。这些方法会自动处理JDBC相关的资源关闭、异常转换等细节,使得代码更加整洁和健壮。 2. **数据库自适应** Spring...
包括MyBatis-Plus提供的批量更新,JdbcTemplate提供的批量更新,在xml中循环拼接sql批量更新、case when语句批量更新、replace into方式批量更新、ON DUPLICATE KEY UPDATE批量更新。 适用于对Spring Boot和数据库...