📜  Spring – 准备好的语句 JDBC 模板

📅  最后修改于: 2022-05-13 01:55:26.886000             🧑  作者: Mango

Spring – 准备好的语句 JDBC 模板

在企业应用程序中,数据访问/存储在关系数据库中是一种常见要求。作为Java SE 的重要组成部分, Java数据库连接 (JDBC) 定义了一组标准 API,以独立于供应商的方式访问关系数据库。但是,在使用 JDBC 时,开发人员必须管理所有与数据库相关的资源并显式处理数据库异常。

为了使 JDBC 更易于使用,Spring 框架提供了一个抽象框架来与 JDBC 交互。 Spring 中的 JDBC 模板类旨在为不同类型的 JDBC 操作提供模板方法。每个模板方法负责控制整个流程并允许覆盖流程的特定任务。

接口 PreparedStatementSetter

Spring 在 JdbcTemplate 类使用的org.springframework.jdbc.core包中提供了PreparedStatementSetter接口。这是一个回调接口,它在JdbcTemplate类提供的 PreparedStatement 上设置值,用于使用相同 SQL 的批处理中的多个更新中的每一个。它为 SQL 提供了占位符,实现负责设置必要的参数。 JdbcTemplate 将创建 PreparedStatement 并且回调只负责设置参数值。

@FunctionalInterface
public interface PreparedStatementSetter

该接口包含一个方法,即

setValues(PreparedStatement ps):它在给定的 PreparedStatement 上设置参数值。

void setValues(PreparedStatement ps) 抛出 SQLException

  • ps – 调用 setter 方法的 PreparedStatement。
  • 它抛出 SQLException – 如果遇到 SQLException(即不需要捕获 SQLException)

Spring JDBC 应用程序

为了理解上述概念,我们将创建一个基本的 Spring JDBC 应用程序来访问数据库中的数据。我们将使用 PostgreSQL 数据库和 Eclipse IDE 来创建这个项目。

创建应用程序的步骤

步骤 1:在 PostgreSQL 中创建数据库表

在 PostgreSQL 数据库中创建表 - ' frameworks ',列 - 'id'、'name'、'description'。

框架 - 表

框架——表格

在下表中插入一些数据,如下所示。

表 - 数据

表 - 数据

第 2 步:在 Eclipse 中创建 Spring 应用程序

  • 创建 Spring 项目 - Spring_JDBC。将 postgresql jar 和 spring jar 文件添加到项目中。
  • jar 文件在 Maven 存储库中可用。
  • 最终的项目结构将如下所示,
项目结构

项目结构

第三步:在“com.geeks.beans”包下创建Bean类、DAO类和Mapper类文件

创建'框架。 Java ' bean 类文件,具有 'id'、'name'、'description' 作为属性及其 getter/setter 方法。

框架。 Java文件:

Java
package com.geeks.beans;
  
public class Framework {
      
    private int id;
    private String name;
    private String description;
      
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
      
}


Java
package com.geeks.beans;
  
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
  
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementSetter;
  
public class FrameworkDao {
      
    private JdbcTemplate jdbcTemp;
  
    public JdbcTemplate getJdbcTemp() {
        return jdbcTemp;
    }
  
    public void setJdbcTemp(JdbcTemplate jdbcTemp) {
        this.jdbcTemp = jdbcTemp;
    }
      
     public Framework getDetail(final String name) {
          final String SQL = "select * from public.frameworks where name = ? ";
          List  details = jdbcTemp.query(
             SQL, new PreparedStatementSetter() {
                 
             public void setValues(PreparedStatement preparedStatement) throws SQLException {
                preparedStatement.setString(1, name);
             }
          },
          new FrameworkMapper());
          return details.get(0);
       }
  
}


Java
package com.geeks.beans;
  
import java.sql.ResultSet;
import java.sql.SQLException;
  
import org.springframework.jdbc.core.RowMapper;
  
public class FrameworkMapper implements RowMapper{
  
    @Override
    public Framework mapRow(ResultSet rs, int map) throws SQLException {
  
        Framework framework = new Framework();
        framework.setId(rs.getInt("id"));
        framework.setName(rs.getString("name"));
        framework.setDescription(rs.getString("description"));
        return framework;
    }
  
}


XML


  
    
        
        
        
        
    
     
      
           
     
  
      
           
         
  


Java
package com.geeks.test;
  
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
  
import com.geeks.beans.Framework;
import com.geeks.beans.FrameworkDao;
  
public class FrameworkTest {
  
    public static void main(String[] args) {
  
        ApplicationContext con = new ClassPathXmlApplicationContext("com/geeks/resources/applicationContext.xml");
        FrameworkDao dao = (FrameworkDao) con.getBean("framework");
        Framework frame = dao.getDetail("spring");
        System.out.println("Java Framework");
        System.out.println(frame.getId()+". "+frame.getName()+": "+frame.getDescription());
          
    }
  
}


创建一个' FrameworkDao. Java '文件,它导入'JDBC Template'类和'PreparedStatementSetter'接口,用于创建SQL以使用'PreparedStatement'查询数据库的值。

框架道。 Java文件:

Java

package com.geeks.beans;
  
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
  
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.PreparedStatementSetter;
  
public class FrameworkDao {
      
    private JdbcTemplate jdbcTemp;
  
    public JdbcTemplate getJdbcTemp() {
        return jdbcTemp;
    }
  
    public void setJdbcTemp(JdbcTemplate jdbcTemp) {
        this.jdbcTemp = jdbcTemp;
    }
      
     public Framework getDetail(final String name) {
          final String SQL = "select * from public.frameworks where name = ? ";
          List  details = jdbcTemp.query(
             SQL, new PreparedStatementSetter() {
                 
             public void setValues(PreparedStatement preparedStatement) throws SQLException {
                preparedStatement.setString(1, name);
             }
          },
          new FrameworkMapper());
          return details.get(0);
       }
  
}
  • 我们正在使用选择查询从数据库表中获取详细信息。
  • 通过使用 JDBC 模板,绕过三个参数查询数据库, SQL – 查询、 PreparedStatementSetter – 设置值和FrameworkMapper – 将数据映射到相应的属性。
  • 创建一个' FrameworkMapper. Java ' 实现 RowMapper 接口的文件,该接口用于将从数据库获取的数据映射到 bean 属性值。

框架映射器。 Java文件:

Java

package com.geeks.beans;
  
import java.sql.ResultSet;
import java.sql.SQLException;
  
import org.springframework.jdbc.core.RowMapper;
  
public class FrameworkMapper implements RowMapper{
  
    @Override
    public Framework mapRow(ResultSet rs, int map) throws SQLException {
  
        Framework framework = new Framework();
        framework.setId(rs.getInt("id"));
        framework.setName(rs.getString("name"));
        framework.setDescription(rs.getString("description"));
        return framework;
    }
  
}
  • 我们需要重写 RowMapper 接口的 'mapRow()' 方法。
  • 获取框架 bean 对象并使用从数据库中获取的值映射/设置属性值。

第 4 步:创建资源文件 - 'com.geeks.resources' 包下的 XML 配置

创建“ applicationContext.xml ”文件以配置数据源和 bean 对象。

applicationContext.xml 文件:

XML



  
    
        
        
        
        
    
     
      
           
     
  
      
           
         
  

  • 当我们使用 postgresql 时,我们需要指定 postgresql 数据库各自的“driverClassName”、“url”、“username”和“password”。
  • 参考 JDBC Template 对象配置 FrameworkDao bean 类文件。

第 5 步:创建一个测试文件以在 'com.geeks.test' 包下运行应用程序

创建一个'框架测试。 Java ' 包含运行项目的 main() 方法的文件。

框架测试。 Java文件:

Java

package com.geeks.test;
  
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
  
import com.geeks.beans.Framework;
import com.geeks.beans.FrameworkDao;
  
public class FrameworkTest {
  
    public static void main(String[] args) {
  
        ApplicationContext con = new ClassPathXmlApplicationContext("com/geeks/resources/applicationContext.xml");
        FrameworkDao dao = (FrameworkDao) con.getBean("framework");
        Framework frame = dao.getDetail("spring");
        System.out.println("Java Framework");
        System.out.println(frame.getId()+". "+frame.getName()+": "+frame.getDescription());
          
    }
  
}
  • 获取 'ApplicationContext' 对象并使用它,获取 bean 对象。
  • 调用“FrameworkDao”中的“getDetail()”方法。 Java' 类来查询数据库并获取值。
  • 最后,在控制台中打印获取的数据。

第 6 步:运行应用程序

  • 要运行测试文件,请右键单击“运行方式 -> Java应用程序”。
  • 我们将在控制台中获得以下输出。
输出

输出