1. 程式人生 > >使用JdbcTemplate進行批量操作

使用JdbcTemplate進行批量操作

spring.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:context="http://www.springframework.org/schema/context"
	xmlns:jee="http://www.springframework.org/schema/jee" 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/jee
						http://www.springframework.org/schema/jee/spring-jee-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">


	<context:annotation-config />

	<context:component-scan base-package="com.spring" />


	<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close">
		<property name="driverClassName" value="com.mysql.jdbc.Driver" />
		<property name="url" value="jdbc:mysql://210.30.12.3:3306/spring" />
		<property name="username" value="root" />
		<property name="password" value="sa" />

	</bean>

	<bean id="sessionFactory"
		class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
		<property name="dataSource" ref="dataSource" />
		<property name="packagesToScan">
			<list>
				<value>com.spring.model</value>
			</list>
		</property>
		<property name="hibernateProperties">
			<props>
				<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
				<prop key="hibernate.show_sql">true</prop>
				<prop key="hibernate.format_sql">true</prop>
				<prop key="hibernate.hbm2ddl.auto">update</prop>
			</props>
		</property>

	</bean>

	<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">
		<property name="sessionFactory" ref="sessionFactory" />
	</bean>

	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource" />
	</bean>

	<bean id="entityServiceImpl" class="com.spring.service.impl.EntityServiceImpl" />

	<bean id="batchOperationDao" class="com.spring.dao.BatchOperationDao" />

	<tx:annotation-driven transaction-manager="txManager" />

	<bean id="txManager"
		class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
		<property name="dataSource" ref="dataSource" />
	</bean>

	<!-- <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> 
		<tx:method name="get*" read-only="true" /> <tx:method name="insert*" rollback-for="Throwable" 
		/> <tx:method name="*" /> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut 
		expression="execution(* com.spring.service..*.*(..))" id="entityServiceOperation" 
		/> <aop:advisor advice-ref="txAdvice" pointcut-ref="entityServiceOperation" 
		/> </aop:config> -->

</beans>




 

JdbcTemplate的批量操作特性需要實現特定的介面BatchPreparedStatementSetter來進行的, 通過實現這個介面,並將其傳入batchUpdate方法進行呼叫。 這個介面有兩個方法需要實現。一個叫做getBatchSize來提供當前需要批量操作的數量。另外一個方法是setValues 允許你為prepared statement設定引數。這個方法將在整個過程中被呼叫的次數,則取決於你在getBatchSize中所指定的大小。 下面的示例展示了根據傳入的list引數更新person表,而傳入的list同時作為批量操作的引數

package com.spring.dao;

import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;

import com.spring.model.Person;

/**
 * <p>
 * 批量操作,批量更新
 * </p>
 * 
 * @author changlun.cheng
 * @since 2012-4-28
 * @see BatchPreparedStatementSetter
 * @see JbdcTemplate
 */
public class BatchOperationDao {

	private JdbcTemplate jdbcTemplate;

	public int[] batchUpdate(final List<Person> persons) {

		String sql = "update person p set name = ?, age = ? where id = ? ";

		int[] updateCount = this.jdbcTemplate.batchUpdate(sql,
				new BatchPreparedStatementSetter() {
					@Override
					public void setValues(PreparedStatement ps, int i)
							throws SQLException {
						ps.setString(1, persons.get(i).getName());
						ps.setInt(2, persons.get(i).getAge());
						ps.setInt(3, persons.get(i).getId());
						System.out.println(persons.get(i).getId());
					}

					@Override
					public int getBatchSize() {
						return persons.size();
					}
				});

		return updateCount;
	}

	@Resource(name = "jdbcTemplate")
	public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
		this.jdbcTemplate = jdbcTemplate;
	}

}

Boot,java

package com.spring.util;

import java.util.ArrayList;
import java.util.List;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.spring.dao.BatchOperationDao;
import com.spring.model.Person;
import com.spring.service.EntityService;

public class Boot {

	public static void main(String[] args) {

		ApplicationContext ac = new ClassPathXmlApplicationContext(
				new String[] { "spring.xml" }, Boot.class);

		EntityService es = (EntityService) ac.getBean("entityServiceImpl");

		Person p = new Person();

		p.setId(8);

		p.setAge(23);

		p.setName("**");

		// es.update(p);

		// System.out.println(es.delete(p));

		es.insert(p);

		// es.getPerson("stop");

		BatchOperationDao bt = (BatchOperationDao) ac
				.getBean("batchOperationDao");

		List<Person> persons = new ArrayList<Person>();

		p.setAge(322);

		persons.add(p);

		p.setName("youdao");

		persons.add(p);

		p.setName("reyoudao");

		persons.add(p);

		System.out.println(bt.batchUpdate(persons)[0]);

		batch();
	}

	private static void batch() {

	}
}

相關推薦

使用JdbcTemplate進行批量操作

spring.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/200

mybatis進行批量操作時的需要設定allowMultiQueries=true

    前言:在專案開發的時遇到同時執行多條刪除或者更新語句,將語句放到mysql命令列來執行是沒有問題的,可到了mybatis就報錯,為啥呢? 解決: 請大家先看一段程式碼: <update id="updateId"> delete from

mybatis使用foreach進行批量操作 The error may involve defaultParameterMap

觸發現象 xml: <insert id="insertByList"> <foreach collection="tagList" item="tag" separator=";"> insert into table(name) se

JedisCluster模式嘗試進行批量操作

搭建完redis集群后,可以通過jedis的JedisCluster來訪問Redis叢集,這裡列出使用jedisCluster的spring bean配置方式:   <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConf

使用Redis的管道(Pipeline)進行批量操作

Redis管道技術簡介 Reids是一個cs模式的Tcp服務,類似於http的請求。 當客戶端傳送一個請求時,伺服器處理之後會將結果通過響應報文返回給客戶端 。 那麼當需要傳送多個請求時,難道每次都要等待請求響應,再發送下一個請求嗎? 當然不是,這

MyBatis利用動態SQL進行批量操作

什麼是動態SQL 簡單來說就是可以根據使用者輸入的查詢條件生成不同的查詢SQL。 動態SQL有哪些元素 --判斷元素:if,choose --關鍵字元素:where,set,trim --迴

JdbcTemplate batchUpdate 批量操作加事務

JdbcTemplate batchUpdate 可以用來進行批量操作,但在中途某條資料出錯時如何處理? 加入spring事務,目前發現一種能通過spring程式設計式事務(基於TransactionTemplate 的事務管理)可以實現。 1.不帶返回型別 public void transfer(f

JAVA對MYSQL資料庫進行批量操作,addBatch(),executeBatch()方法

有人說MySql的JDBC驅動,不是真正支援批量操作的,就算你在程式碼中呼叫了批量操作的方法,MySql的JDBC驅動也是按照一般操作來處理的。 但其實並非如此,Mysql 是有特殊的方式優化整個batch insert 結果的。 可不可以先假設 batch 的方式與非

SQL SERVER中使用Merge進行批量操作

在.net開發過程中,經常會和資料庫打交道。微軟的產品包裡,SQL SERVER便是一個強大的資料庫管理系統(DBS)。我們編寫的.net程式怎麼和DBS進行互動呢?筆者最常用的便是ado.net元件,其中包括了執行sql命令,執行儲存過程等豐富的操作方法。在ERP(企業

PowerDesigner中使用vbscript訪問物件進行批量操作

Power Designer是資料建模中一個比較常用的工具,比較擅長大規模的E-R模型的設計。對於一些批量操作,可以通過vbscript指令碼進行。用法:開啟物理模型,點選選單“Tools->Execute Commands -> Edit/Run Script...",或者快捷鍵(Ctr

JdbcTemplate 執行批量操作

public RemoveBaseEmergencyEventsArrayResponse removeBaseEmergencyEvents(RemoveBaseEmergencyEventsArray rbeArr) {   final List<String&g

mybatis使用foreach進行批量插入和刪除操作

JD div foreach class AR tis 默認 post AC 一、批量插入 1.mapper層 int insertBatchRoleUser(@Param("lists") List<RoleUser> lists);//@Param

【java】【mybatis】在使用mybatis進行批量插入,批量更新等批量操作時,切割In集合List進行分批批量操作的java中的切割代碼

lse span ati 批量更新 次數 sublist 調用 size ==       紅字部分代表mybatis的批量操作調用方法:       int num = 0; int maxLength = 200; in

jsp中對資料進行批量刪除操作

批量刪除的SQL:delete from user where uid in(主鍵列表);  UserBiz:  //批量刪除  public boolean batchDelete(String[] uids);  UserBizImpl: public

js 通過全選操作進行批量刪除與批量修改

效果圖 1.先說js進行全選:  //展示這麼多,其實只需要看標紅部分就行 <form name="action" class="form-horizontal" role="form" method="post" enctype="multipart

2500-使用MyBatis操作MySQL進行批量更新的注意事項

原則上一條SQL只更新一條資料庫操作,但有時需要批量操作資料,特別是一些DML語句,在操作資料庫時,資料庫會報出異常,不允許混合語句,此時需要額外配置進行相容。 例如: Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorExce

Spring JdbcTemplate批量操作

使用SimpleJdbcTemplate進行批量操作 SimpleJdbcTemplate類提供了另外一種批量操作的方式。無需實現一個特定的介面,你只需要提供所有在呼叫過程中要用到的引數,框架會遍歷這些引數值,並使用內建的prepared statement類進行批量操作。API將根據你是否使用

從零學springboot——使用jdbcTemplate的方式自定義sql進行資料庫操作

引入jdbcTemplate依賴 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-sta

使用python連線資料庫並且進行批量新增資料的操作

1.搭建python的mysql環境在cmd中進入C:\Python34\Scripts資料夾,輸入pip install PyMySQL即可安裝,python的外掛安裝基本都可以通過pip這個命令實現。2.寫一個簡單的指令碼進行驗證。關於python的編輯器,推薦使用PyC

通過http介面進行批量post操作(json格式)

//通過@Test或者main方法來進行    相關依賴 //poi <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</ar