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应用程序”。
- 我们将在控制台中获得以下输出。