Spring教程-Spring JdbcTemplate 教程
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 类的方法。
序号 | 方法 | 描述 |
---|---|---|
1) | public int update(String query) | 用于插入、更新和删除记录。 |
2) | public int update(String query,Object... args) | 使用给定的参数通过 PreparedStatement 插入、更新和删除记录。 |
3) | public void execute(String query) | 用于执行 DDL 查询。 |
4) | public T execute(String sql, PreparedStatementCallback action) | 使用 PreparedStatement 回调执行查询。 |
5) | public T query(String sql, ResultSetExtractor rse) | 用于使用 ResultSetExtractor 获取记录。 |
6) | 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 cn.javatiku;
public class Employee {
private int id;
private String name;
private float salary;
//no-arg and parameterized constructors
//getters and setters
}
EmployeeDao.java
它包含一个属性 jdbcTemplate 和三个方法 saveEmployee()、updateEmployee 和 deleteEmployee()。
package cn.javatiku;
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、用户名和密码。
在 JdbcTemplate 类中有一个名为 datasource 的属性,类型为 DriverManagerDataSource。因此,我们需要在 JdbcTemplate 类中为 datasource 属性提供 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="cn.javatiku.EmployeeDao">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
</beans>
Test.java
此类从 applicationContext.xml 文件获取 bean,并调用 saveEmployee() 方法。您也可以通过取消注释代码来调用 updateEmployee() 和 deleteEmployee() 方法。
package cn.javatiku;
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);*/
}
}