Spring JdbcTemplate 教程

Spring JdbcTemplate 是一种强大的机制,可以连接到数据库并执行SQL查询。它内部使用JDBC API,但消除了JDBC API的许多问题。

JDBC API的问题

JDBC API的问题如下:

在执行查询之前和之后,我们需要编写很多代码,例如创建连接,语句,关闭结果集,连接等。 我们需要在数据库逻辑上执行异常处理代码。 我们需要处理交易。 将所有这些代码从一个数据库逻辑重复到另一个数据库逻辑是一项耗时的工作。

Spring JdbcTemplate的优点

Spring JdbcTemplate消除了上述JDBC API的所有问题。它提供了直接编写查询的方法,从而节省了大量的工作和时间。

Spring Jdbc方法

Spring框架提供了以下用于JDBC数据库访问的方法:

JdbcTemplate NamedParameterJdbcTemplate SimpleJdbcTemplate SimpleJdbcInsert和SimpleJdbcCall

JdbcTemplate类

它是Spring JDBC支持类的中心类。它负责创建和释放资源,例如创建和关闭连接对象等。因此,如果您忘记关闭连接,不会导致任何问题。

它处理异常并提供信息异常消息是通过 org.springframework.dao 包中定义的异常类的帮助。

我们可以借助JdbcTemplate类执行所有数据库操作,例如插入,更新,从数据库中删除和检索数据。

让我们看看spring JdbcTemplate类的方法。

方法说明
public int update(String query)用于插入,更新和删除记录。
public int update(String query,Object ... args)用于通过使用给定参数的PreparedStatement插入,更新和删除记录。
public void execute(String query)用于执行DDL查询。
public T execute(String sql, PreparedStatementCallback action)通过使用PreparedStatement回调执行查询。
public T query(String sql, ResultSetExtractor rse)用于使用ResultSetExtractor获取记录。
public List query(String sql, RowMapper rse)用于使用RowMapper获取记录。

Spring JdbcTemplate的示例

我们假设您已经在Oracle10g数据库中创建了下表。

create table employee(
id number(10),
name varchar2(100),
salary number(10)
);

Employee.java

此类包含3个带有构造函数,setter和getter的属性。

package com.nhooo;
public class Employee {
private int id;
private String name;
private float salary;
//无参数和参数化的构造函数
//getters and setters
}

EmployeeDao.java

它包含一个属性jdbcTemplate和三个方法saveEmployee(),updateEmployee和deleteEmployee()。

package com.nhooo;
import org.springframework.jdbc.core.JdbcTemplate;
public class EmployeeDao {
    private JdbcTemplate jdbcTemplate;
    public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
      this.jdbcTemplate = jdbcTemplate;
    }
    public int saveEmployee(Employee e){
      String query="insert into employee values(  '"+e.getId()+"','"+e.getName()+"','"+e.getSalary()+"')";
      return jdbcTemplate.update(query);
    }
    public int updateEmployee(Employee e){
      String query="update employee set 
      name='"+e.getName()+"',salary='"+e.getSalary()+"' where id='"+e.getId()+"' ";
      return jdbcTemplate.update(query);
    }
    public int deleteEmployee(Employee e){
      String query="delete from employee where id='"+e.getId()+"' ";
      return jdbcTemplate.update(query);
    }
}

applicationContext.xml

DriverManagerDataSource 用于包含有关数据库的信息,例如驱动程序类名称,连接URL,用户名和密码。

DriverManagerDataSource类型的JdbcTemplate类中有一个名为 datasource 的属性。因此,我们需要在JdbcTemplate类中为数据源属性提供DriverManagerDataSource对象的引用。

在这里,我们在EmployeeDao类中使用了JdbcTemplate对象,因此我们通过setter方法传递了它,但是您也可以使用构造函数。

<?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:p="http://www.springframework.org/schema/p"
  xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="ds" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" />
<property name="username" value="system" />
<property name="password" value="oracle" />
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="ds"></property>
</bean>
<bean id="edao" class="com.nhooo.EmployeeDao">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
</beans>

Test.java

此类从applicationContext.xml文件获取Bean,并调用saveEmployee()方法。您也可以通过取消注释代码来调用updateEmployee()和deleteEmployee()方法。

package com.nhooo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
  ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
  
  EmployeeDao dao=(EmployeeDao)ctx.getBean("edao");
  int status=dao.saveEmployee(new Employee(102,"Amit",35000));
  System.out.println(status);
    
  /*int status=dao.updateEmployee(new Employee(102,"Sonoo",15000));
  System.out.println(status);
  */
    
  /*Employee e=new Employee();
  e.setId(102);
  int status=dao.deleteEmployee(e);
  System.out.println(status);*/
  
}
}