鍍金池/ 教程/ Java/ Spring JDBC多批次操作
Spring JDBC調(diào)用存儲函數(shù)
Spring JDBC NamedParameterJdbcTemplate類示例
Spring JDBC SimpleJdbcCall類示例
Spring JDBC PreparedStatementSetter接口示例
Spring JDBC環(huán)境設(shè)置
Spring JDBC多批次操作
Spring JDBC SimpleJdbcInsert類示例
Spring JDBC RowMapper接口示例
Spring JDBC對象批量操作
Spring JDBC ResultSetExtractor接口示例
Spring JDBC配置數(shù)據(jù)源
Spring JDBC處理CLOB類型字段
Spring JDBC刪除數(shù)據(jù)
Spring JDBC更新數(shù)據(jù)
Spring JDBC SqlUpdate類示例
Spring JDBC SqlQuery類示例
Spring JDBC插入數(shù)據(jù)
Spring JDBC StoredProcedure類示例
Spring JDBC JdbcTemplate類示例
Spring JDBC入門程序
Spring JDBC調(diào)用存儲過程
Spring JDBC查詢數(shù)據(jù)
Spring JDBC批量操作
Spring JDBC處理BLOB類型字段
Spring JDBC教程

Spring JDBC多批次操作

以下示例將演示如何使用spring jdbc在單個調(diào)用中進行多批次更新。 我們將在批量大小為1的多批次操作中更新student表中的記錄。

student表的結(jié)果如下 -

CREATE TABLE student(
   id   INT NOT NULL AUTO_INCREMENT,
   name VARCHAR(20) NOT NULL,
   age  INT NOT NULL,
   PRIMARY KEY (id)
);

語法:

String SQL = "update Student set age = ? where id = ?";
int[][] updateCounts = jdbcTemplateObject.batchUpdate(SQL,students,1,
   new ParameterizedPreparedStatementSetter<Student>() {
      public void setValues(PreparedStatement ps, Student student)
         throws SQLException {
         ps.setInt(1, student.getAge());
         ps.setInt(2, student.getId());    
      }
   });

在上面語法中 -

  • SQL - 更新語句以更新學(xué)生的年齡。
  • ParameterizedPreparedStatementSetter - 批量執(zhí)行者,在PerparedStatement中設(shè)置值,每個項目由Student對象列表識別。
  • jdbcTemplateObject - NamedParameterJdbcTemplate對象來更新數(shù)據(jù)庫中的學(xué)生對象。
  • updateCounts - int[][]數(shù)組包含每個更新查詢更新的行計數(shù)(數(shù)量)。

創(chuàng)建項目

要了解上面提到的Spring JDBC相關(guān)的概念,這里創(chuàng)建一個項目用來演示如何執(zhí)行多次更新批處理操作。打開Eclipse IDE,并按照以下步驟創(chuàng)建一個名稱為:MultipleBatchOperation 的Spring應(yīng)用程序項目。

步驟說明

  1. 參考第一個Spring JDBC項目來創(chuàng)建一個Maven項目 - http://www.yiibai.com/springjdbc/first_application.html
  2. 更新bean配置并運行應(yīng)用程序。

完整的項目結(jié)構(gòu)如下所示 -

文件 : pom.xml 的內(nèi)容 -

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.yiibai</groupId>
    <artifactId>MultipleBatchOperation</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>MultipleBatchOperation</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.40</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.1.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.1.4.RELEASE</version>
        </dependency>
    </dependencies>
</project>

以下是數(shù)據(jù)訪問對象接口文件:StudentDAO.java的代碼內(nèi)容:

package com.yiibai;

import java.util.List;
import javax.sql.DataSource;


public interface StudentDAO {
    /**
     * This is the method to be used to initialize database resources ie.
     * connection.
     */
    public void setDataSource(DataSource ds);

    /**
     * This is the method to be used to list down all the records from the
     * Student table.
     */
    public List<Student> listStudents();

    public void create(String name, Integer age);

    public void batchUpdate(final List<Student> students);
}

以下是文件:Student.java的代碼內(nèi)容:

package com.yiibai;

public class Student {
    private Integer age;
    private String name;
    private Integer id;

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getAge() {
        return age;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public Integer getId() {
        return id;
    }
}

以下是文件:StudentMapper.java的代碼內(nèi)容:

package com.yiibai;

import java.sql.ResultSet;
import java.sql.SQLException;
import org.springframework.jdbc.core.RowMapper;

public class StudentMapper implements RowMapper<Student> {
   public Student mapRow(ResultSet rs, int rowNum) throws SQLException {
      Student student = new Student();
      student.setId(rs.getInt("id"));
      student.setName(rs.getString("name"));
      student.setAge(rs.getInt("age"));
      return student;
   }
}

以下是文件:StudentJDBCTemplate.java的代碼內(nèi)容:

package com.yiibai;

import java.sql.PreparedStatement;
import java.util.List;
import javax.sql.DataSource;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.ParameterizedPreparedStatementSetter;
import java.sql.SQLException;

public class StudentJDBCTemplate implements StudentDAO {
    private DataSource dataSource;
    private JdbcTemplate jdbcTemplateObject;

    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
        this.jdbcTemplateObject = new JdbcTemplate(dataSource);
    }

    public List<Student> listStudents() {
        String SQL = "select * from Student";
        List<Student> students = jdbcTemplateObject.query(SQL, new StudentMapper());
        return students;
    }

    public void batchUpdate(final List<Student> students) {
        String SQL = "update Student set age = ? where id = ?";
        int[][] updateCounts = jdbcTemplateObject.batchUpdate(SQL, students, 1,
                new ParameterizedPreparedStatementSetter<Student>() {
                    public void setValues(PreparedStatement ps, Student student) throws SQLException {
                        ps.setInt(1, student.getAge());
                        ps.setInt(2, student.getId());
                    }
                });
        System.out.println("Records updated!");
    }

    public void create(String name, Integer age) {
        // TODO Auto-generated method stub
        String insertQuery = "insert into student (name, age) values (?, ?)";

        jdbcTemplateObject.update(insertQuery, name, age);
        System.out.println("Created Record Name = " + name + " Age = " + age);
        return;
    }
}

以下是程序執(zhí)行入口文件:MainApp.java的代碼內(nèi)容:

package com.yiibai;

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

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.yiibai.StudentJDBCTemplate;

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("application-beans.xml");

        StudentJDBCTemplate studentJDBCTemplate = (StudentJDBCTemplate) context.getBean("studentJDBCTemplate");

        System.out.println("------Records Creation--------");
        studentJDBCTemplate.create("Maxsu", 21);
        studentJDBCTemplate.create("Curry", 22);
        studentJDBCTemplate.create("Xiaowei", 25);

        List<Student> initialStudents = studentJDBCTemplate.listStudents();
        System.out.println("Initial Students");
        for (Student student2 : initialStudents) {
            System.out.print("ID : " + student2.getId());
            System.out.println(", Age : " + student2.getAge());
        }

        Student student = new Student();
        student.setId(1);
        student.setAge(17);

        Student student1 = new Student();
        student1.setId(3);
        student1.setAge(18);

        List<Student> students = new ArrayList<Student>();
        students.add(student);
        students.add(student1);

        studentJDBCTemplate.batchUpdate(students);

        List<Student> updatedStudents = studentJDBCTemplate.listStudents();
        System.out.println("Updated Students");
        for (Student student3 : updatedStudents) {
            System.out.print("ID : " + student3.getId());
            System.out.println(", Age : " + student3.getAge());
        }
    }
}

以下是Bean和數(shù)據(jù)庫配置文件:application-beans.xml的代碼內(nèi)容:

<?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/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd ">

    <!-- Initialization for data source -->
    <bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=utf8&useSSL=true" />
        <property name="username" value="root" />
        <property name="password" value="123456" />
    </bean>

    <!-- Definition for studentJDBCTemplate bean -->
    <bean id="studentJDBCTemplate" class="com.yiibai.StudentJDBCTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>

</beans>

注意: application-beans.xml 文件的位置是:{workspace}/fistapp/src/main/java 目錄,如果放置錯了,程序可能會因為找不到此配置文件而出錯。

完成創(chuàng)建源代碼和bean和數(shù)據(jù)庫連接信息的文件配置后,運行應(yīng)用程序。這里先簡單說明一下運行的步驟,在項目名稱(MultipleBatchOperation)上點擊右鍵,在彈出的菜單中選擇:【Run As】-> 【Maven test】

在運行測試成功后,應(yīng)該會輸出類似以下內(nèi)容(含有 BUILD SUCCESS 的信息) 。
接下來,點擊類文件:MainApp.java 選擇【Run As】->【Java Application】,如果應(yīng)用程序一切正常,這將打印以下消息:

------Records Creation--------
Created Record Name = Maxsu Age = 21
Created Record Name = Curry Age = 22
Created Record Name = Xiaowei Age = 25
Initial Students
ID : 1, Age : 21
ID : 2, Age : 22
ID : 3, Age : 25
Records updated!
Updated Students
ID : 1, Age : 17
ID : 2, Age : 22
ID : 3, Age : 18

數(shù)據(jù)庫中的student表中的數(shù)據(jù)被修改為:

mysql> select * from student;
+----+--------+-----+
| id | name   | age |
+----+--------+-----+
|  1 | Maxsu  |  17 |
|  2 | Curry  |  22 |
|  3 | Xiaowei |  18 |
+----+--------+-----+
3 rows in set

mysql>