您的位置:首页 > 编程语言 > Java开发

Spring JdbcTemplate 简化 JDBC

2016-03-25 14:45 441 查看
spring的JdbcTemplate是对jdbc的简单封装,旨在简化jdbc的操作和避免一些jdbc易发的问题,典型使用方式:

因为 JdbcTemplate 类需要一个数据源 DataSource ,可以通过注入或构造方法的方式传入进去,下面是一个完整的spring注入方式实现的JdbcTemplate:

spring的配置文件 applicationContext.xml:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> 
<bean id="myDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@168.1.50.20:1522:orcl"/>
<property name="username" value="scott"/>
<property name="password" value="scott"/>
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource">
<ref bean="myDataSource"/>
</property>
</bean>

<bean id="testDAO" class="com.test.spring.TestJdbcTemplate">
<property name="jdbcT">
<ref bean="jdbcTemplate"/>
</property>
</bean>

</beans>
里面声明了一个DataSource,声明了一个JdbcTemplate并引用了数据源,testDAO是自己的业务bean,并且注入进去了一个JdbcTemplate到jdbcT属性上面,java代码:
package com.test.spring;

import com.test.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.JdbcTemplate;

import java.util.Iterator;
import java.util.List;
import java.util.Map;

public class TestJdbcTemplate {

private JdbcTemplate jdbcT;

public void setJdbcT(JdbcTemplate jdbcT) {
this.jdbcT = jdbcT;
}

private static ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");

public static Object getBean(String beanName) {
return ctx.getBean(beanName);
}

public static void main(String[] args) {
TestJdbcTemplate testDAO = (TestJdbcTemplate) getBean("testDAO");
testDAO.addUser();
testDAO.findALL();
}

public void addUser() {
String sql = "insert into student VALUES ('userid', 'username')";
jdbcT.update(sql);
}

public void findALL() {
String sql = "select * from student";
List list = jdbcT.queryForList(sql);
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Map<String, String> dataMap = (Map) iterator.next();
User user = new User();
user.setId(dataMap.get("ID"));
user.setName(dataMap.get("NAME"));
System.out.println(user);
}
}

public int delete(int bid) {
String sql = "delete from DeptInfo where bid =?";
return jdbcT.update(sql, new Object[]{bid});
}
}
package com.test;

public class User {
private String id;
private String name;

public String getName() {
return name;
}

public String getId() {
return id;
}

public void setId(String id) {
this.id = id;
}

public void setName(String name) {
this.name = name;
}

@Override
public String toString() {
return "User{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
'}';
}
}
上面就完成了,当然我么也可以不需要配置注入的方式直接使用JdbcTemplate,它其实就是一个普通的类,构造方法可以传入一个数据源,如我们可以这么写
JdbcTemplate jt= new JdbcTemplate(new MyDataSource(xxx,xxx));
然后就可以使用了,如果是spring配置文件了定义了一个的话,就可以直接使用
JdbcTemplate jt= (JdbcTemplate)ApplicationContext.getBean("jdbcTemplate")
如果spring的配置文件中只有数据源定义的话,也可以先获取注入的数据源在构造JdbcTemplate,如
JdbcTemplate jt= new JdbcTemplate((DataSource)ApplicationContext.getBean("myDataSource"));
方式有很多,其目的就是要获取到一个JdbcTemplate的实例,JdbcTemplate提供了很多方便的操作jdbc的api:如execute、query、queryForObject、queryForXXX等,
其中queryForObject可以自动将sql查询结果转换为对象,上面的java例子我们接收到的是一个Map,然后通过map.get("字段名")的方式手工地赋值到new 出来的User对象里,
而queryForObject可以自动完成这个过程,他默认情况下根据数据库字段名和类的属性的对应关系赋值,如果数据库表的字段名和类的属性不对应,也可以通过 RowMapper 接口定制映射过程。
此接口只有一个抽象方法:Object mapRow(ResultSet rs, int rowNum) throws SQLException;很好理解,实现过程就是new出来一个对象,然后从ResultSet中get出需要的字段赋值到对象里就好了
好上面例子中的Map中获取数据赋值到对象是一样的,只不过spring做了一些抽象而已,我们只需要写一个这样的映射类,所有的映射操作就不用自己写了,查询的时候指定下这个映射类就ok。

虽然JdbcTemplate简化了jdbc的操作,但不是一个orm工具,我们仍然需要自己写sql,当然这也许是他比hibernate更灵活的地方,另外JdbcTemplate只是spring自己搞出来的一套东西,不是jee的标准,它依赖spring的api,这样就不利于我们的程序移植,而hibernate实现了JPA规范,JPA规范可以让我们编写不依赖任何特定实现的程序,这样应用程序可以很容器切换到其他实现技术而不仅限与spring或hibernate,所以我们编程应该遵循规范,尽量避免使用私有的或不规范的API。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: