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

Spring JDBC PreparedStatementSetter接口示例

org.springframework.jdbc.core.PreparedStatementSetter接口充當(dāng)JdbcTemplate類(lèi)使用的一般回調(diào)接口。該接口在JdbcTemplate類(lèi)提供的PreparedStatement上設(shè)置了使用相同SQL的批處理中的每個(gè)更新的值。實(shí)現(xiàn)負(fù)責(zé)設(shè)置必要的參數(shù)。已經(jīng)提供帶有占位符的SQL,使用此接口比PreparedStatementCreator更容易:JdbcTemplate將創(chuàng)建PreparedStatement,回調(diào)僅負(fù)責(zé)設(shè)置參數(shù)值。

接口的聲明

以下是org.springframework.jdbc.core.PreparedStatementSetter接口的聲明 -

public interface PreparedStatementSetter

用法

步驟1 - 使用配置的數(shù)據(jù)源創(chuàng)建一個(gè)JdbcTemplate對(duì)象。
步驟2 - 使用JdbcTemplate對(duì)象方法進(jìn)行數(shù)據(jù)庫(kù)操作,同時(shí)傳遞PreparedStatementSetter對(duì)象來(lái)替換查詢中的占位符。

實(shí)例

以下示例將演示如何使用JdbcTemplate類(lèi)和PreparedStatementSetter接口進(jìn)行讀取查詢。這里我們將從student表中讀取記錄。

語(yǔ)法

final String SQL = "select * from Student where id = ? ";
List <Student> students = jdbcTemplateObject.query(SQL, new PreparedStatementSetter() {
   public void setValues(PreparedStatement preparedStatement) throws SQLException {
      preparedStatement.setInt(1, id);
  }
},
new StudentMapper());

在上面示例(語(yǔ)法)代碼中 -

  • SQL - 選擇查詢語(yǔ)句來(lái)來(lái)讀取學(xué)生記錄信息。
  • jdbcTemplateObject - StudentJDBCTemplate對(duì)象從數(shù)據(jù)庫(kù)中讀取Student對(duì)象。
  • PreparedStatementSetter - PreparedStatementSetter對(duì)象在查詢中設(shè)置參數(shù)。
  • StudentMapper - StudentMapper是一個(gè)RowMapper對(duì)象,用于將每個(gè)獲取的記錄映射到學(xué)生對(duì)象。

實(shí)例項(xiàng)目

要了解上述與Spring JDBC相關(guān)的概念,下面我們編寫(xiě)一個(gè)select查詢語(yǔ)句的示例。打開(kāi)Eclipse IDE,并按照以下步驟創(chuàng)建一個(gè)Spring應(yīng)用程序,這里創(chuàng)建一個(gè)名稱為:PreparedStatementSetter 的項(xiàng)目。

步驟說(shuō)明

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

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

以下是Maven配置文件: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>PreparedStatementSetter</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>PreparedStatementSetter</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ù)訪問(wèn)對(duì)象接口文件: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 Student getStudent(Integer id);
    public void create(String name, Integer age);

}

以下是文件: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;
   }
}

實(shí)現(xiàn)類(lèi)StudentJDBCTemplate.java實(shí)現(xiàn)了定義的DAO接口 - StudentDAO.java,以下是文件: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 org.springframework.jdbc.core.PreparedStatementSetter;

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 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;
    }

    public Student getStudent(final Integer id) {
        final String SQL = "select * from Student where id = ? ";
        List<Student> students = jdbcTemplateObject.query(SQL, new PreparedStatementSetter() {
            public void setValues(PreparedStatement preparedStatement) throws SQLException {
                preparedStatement.setInt(1, id);
            }
        }, new StudentMapper());
        return students.get(0);
    }
}

以下是文件: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("Suzend", 23);

        System.out.println("------Get Student Info by ID=1 --------");
        Student student = studentJDBCTemplate.getStudent(1);
        System.out.print("ID : " + student.getId());
        System.out.println(", Age : " + student.getAge());

        System.out.println("------Listing Multiple Records--------");
        List<Student> students = studentJDBCTemplate.listStudents();
        for (Student record : students) {
            System.out.print("ID : " + record.getId());
            System.out.print(", Name : " + record.getName());
            System.out.println(", Age : " + record.getAge());
        }
    }
}

以下是文件: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 目錄,如果放置錯(cuò)了,程序可能會(huì)因?yàn)檎也坏酱伺渲梦募鲥e(cuò)。

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

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

------Records Creation--------
Created Record Name = Maxsu Age = 21
Created Record Name = Curry Age = 22
Created Record Name = Suzend Age = 23
------Get Student Info by ID=1 --------
ID : 1, Age : 21
------Listing Multiple Records--------
ID : 1, Name : Maxsu, Age : 21
ID : 2, Name : Curry, Age : 22
ID : 3, Name : Suzend, Age : 23