本文概述
- Spring JDBC模板
- 了解对Spring JDBC模板的需求
- Spring JDBC模板的优势
- JDBC模板类
- JdbcTemplate类的示例
Spring JdbcTemplate是一种强大的机制, 可以连接到数据库并执行SQL查询。它在内部使用JDBC API, 但消除了JDBC API的许多问题。
JDBC API的问题
JDBC API的问题如下:
- 在执行查询之前和之后, 我们需要编写大量代码, 例如创建连接, 语句, 关闭结果集, 连接等。
- 我们需要对数据库逻辑执行异常处理代码。
- 我们需要处理交易。
- 将所有这些代码从一个数据库逻辑重复到另一个数据库逻辑是一项耗时的任务。
Spring JdbcTemplate的优势
Spring JdbcTemplate消除了上述所有JDBC API问题。它提供了直接编写查询的方法, 因此节省了大量工作和时间。
Spring Jdbc方法
Spring框架提供了以下用于JDBC数据库访问的方法:
- Jdbc模板
- 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 com.srcmini;
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 com.srcmini;
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类中为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="com.srcmini.EmployeeDao">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
</beans>
Test.java
此类从applicationContext.xml文件获取Bean, 然后调用saveEmployee()方法。你也可以通过取消注释代码来调用updateEmployee()和deleteEmployee()方法。
package com.srcmini;
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);*/
}
}
下载此示例(使用MyEclipse IDE开发)
下载此示例(使用Eclipse IDE开发)
评论前必须登录!
注册