Spring JdbcTemplate 简化 JDBC

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值