Spring JdbcTemplate 是一種強(qiáng)大的機(jī)制,可以連接到數(shù)據(jù)庫(kù)并執(zhí)行SQL查詢。它內(nèi)部使用JDBC API,但消除了JDBC API的許多問(wèn)題。
JDBC API的問(wèn)題如下:
在執(zhí)行查詢之前和之后,我們需要編寫(xiě)很多代碼,例如創(chuàng)建連接,語(yǔ)句,關(guān)閉結(jié)果集,連接等。 我們需要在數(shù)據(jù)庫(kù)邏輯上執(zhí)行異常處理代碼。 我們需要處理交易。 將所有這些代碼從一個(gè)數(shù)據(jù)庫(kù)邏輯重復(fù)到另一個(gè)數(shù)據(jù)庫(kù)邏輯是一項(xiàng)耗時(shí)的工作。
Spring JdbcTemplate消除了上述JDBC API的所有問(wèn)題。它提供了直接編寫(xiě)查詢的方法,從而節(jié)省了大量的工作和時(shí)間。
Spring框架提供了以下用于JDBC數(shù)據(jù)庫(kù)訪問(wèn)的方法:
JdbcTemplate NamedParameterJdbcTemplate SimpleJdbcTemplate SimpleJdbcInsert和SimpleJdbcCall
它是Spring JDBC支持類的中心類。它負(fù)責(zé)創(chuàng)建和釋放資源,例如創(chuàng)建和關(guān)閉連接對(duì)象等。因此,如果您忘記關(guān)閉連接,不會(huì)導(dǎo)致任何問(wèn)題。
它處理異常并提供信息異常消息是通過(guò) org.springframework.dao 包中定義的異常類的幫助。
我們可以借助JdbcTemplate類執(zhí)行所有數(shù)據(jù)庫(kù)操作,例如插入,更新,從數(shù)據(jù)庫(kù)中刪除和檢索數(shù)據(jù)。
讓我們看看spring JdbcTemplate類的方法。
| 方法 | 說(shuō)明 |
| public int update(String query) | 用于插入,更新和刪除記錄。 |
| public int update(String query,Object ... args) | 用于通過(guò)使用給定參數(shù)的PreparedStatement插入,更新和刪除記錄。 |
| public void execute(String query) | 用于執(zhí)行DDL查詢。 |
| public T execute(String sql, PreparedStatementCallback action) | 通過(guò)使用PreparedStatement回調(diào)執(zhí)行查詢。 |
| public T query(String sql, ResultSetExtractor rse) | 用于使用ResultSetExtractor獲取記錄。 |
| public List query(String sql, RowMapper rse) | 用于使用RowMapper獲取記錄。 |
我們假設(shè)您已經(jīng)在Oracle10g數(shù)據(jù)庫(kù)中創(chuàng)建了下表。
create table employee( id number(10), name varchar2(100), salary number(10) );
Employee.java
此類包含3個(gè)帶有構(gòu)造函數(shù),setter和getter的屬性。
package com.nhooo;
public class Employee {
private int id;
private String name;
private float salary;
//無(wú)參數(shù)和參數(shù)化的構(gòu)造函數(shù)
//getters and setters
}
EmployeeDao.java
它包含一個(gè)屬性jdbcTemplate和三個(gè)方法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 用于包含有關(guān)數(shù)據(jù)庫(kù)的信息,例如驅(qū)動(dòng)程序類名稱,連接URL,用戶名和密碼。
DriverManagerDataSource類型的JdbcTemplate類中有一個(gè)名為 datasource 的屬性。因此,我們需要在JdbcTemplate類中為數(shù)據(jù)源屬性提供DriverManagerDataSource對(duì)象的引用。
在這里,我們?cè)贓mployeeDao類中使用了JdbcTemplate對(duì)象,因此我們通過(guò)setter方法傳遞了它,但是您也可以使用構(gòu)造函數(shù)。
<?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,并調(diào)用saveEmployee()方法。您也可以通過(guò)取消注釋代碼來(lái)調(diào)用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);*/
}
}