Spring JdbcTemplate 简化 JDBC

来源:互联网 发布:linux tgz 解压 编辑:程序博客网 时间:2024/06/07 04:02

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
原创粉丝点击