• spring: 使用Spring提供的JDBC模板(使用profiles选择数据源/使用基于JDBC驱动的数据源)


    Spring提供的JDBC框架负责管理资源和异常处理,从而可以简化开发者的JDBC代码。开发者只需要编写写入和读取数据库相关的代码即可。

    正如在之前的小节中论述过的,Spring将数据库访问过程中的模板样式代码封装到各个模板类中了,对于JDBC,Spring提供了下列三个模板类:

    • JdbcTemplate——最基本的JDBC模板,这个类提供了简单的接口,通过JDBC和索引参数访问数据库;
    • NameParameterJdbcTemplate——这个JDBC模板类是的开发者可以执行绑定了指定参数名称的SQL,而不是索引参数;
    • SimpleJdbcTemplate——这个版本的JDBC模板利用了Java 5的一些特性,例如自动装箱/拆箱、接口和变参列表等,用于简化JDBC模板的使用。

    从Spring 3.1开始已经将SimpleJdbcTemplate废弃,它所拥有的Java 5那些特性被添加到原来的JdbcTemplate中了,因此你可以直接使用JdbcTemplate;当你希望在查询中使用命名参数时,则可以选择使用NamedParameterJdbcTemplate

    INSERTING DATA USING JDBCTEMPLATE

    要使用JdbcTemplate对象,需要为之传递DataSource对象。如果使用Java Config配置JdbcTemplatebean,则对应代码如下:

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
            return new JdbcTemplate(dataSource);
    }
    

      

    这里通过构造函数将DataSource对象注入,而dataSourcebean则来自DataSourceConfiguration文件中定义的javax.sql.DataSource实例。

    然后就可以在自己的repository实现中注入jdbcTemplatebean,例如,假设Spitter的repository使用jdbcTemplatebean,代码可列举如下:

    package org.test.spittr.dao;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.jdbc.core.JdbcOperations;
    import org.springframework.stereotype.Repository;
    import org.test.spittr.data.Spitter;
    
    @Repository
    public class JdbcSpitterRepository implements SpitterRepository {
        @Autowired
        private JdbcOperations jdbcOperations;
    
        .....    
    }
    

      

    这里JdbcSpitterRepository@Repository注解修饰,component-scanning扫描机制起作用时会自动创建对应的bean。按照“面向接口编程”的原则,我们定义JdbcOperations接口对应的实例,而JdbcTemplate实现了这个接口,从而使得JdbcSpitterRepository与JdbcTemplate解耦合。

    使用JdbcTemplate实现的addSpitter()方法非常简单,代码如下:

    public void addSpitter(Spitter spitter) {
        jdbcOperations.update(SQL_INSERT_SPITTER,
                spitter.getUsername(),
                spitter.getPassword(),
                spitter.getFirstName(),
                spitter.getLastName());
    }
    

      

    可以看出,这个版本的addSpitter十分简单,不强制开发者写任何管理资源和处理异常的代码,只有插入语句和对应的参数。

    当调用update()方法时,JdbcTemplate获取一个连接、创建一个statement,并执行插入语句。

    JdbcTemplate内部捕获了可能抛出的SQLException异常,然后转为更具体的数据库访问异常,并重新抛出。由于Spring的数据库访问异常都是运行时异常,开发者可以自己决定是否捕获这些异常。

    READING DATA WITH JDBCTEMPLATE

    使用JdbcTemplate工具从数据库中读取数据也非常简单,下列代码展示了改造过后的findOne()函数:调用JdbctTemplatequeryForObject函数,用于通过ID查询Spitter对象。

    public Spitter findOne(long id) {
        return jdbcOperations.queryForObject(
                SQL_SELECT_SPITTER,
                new SpitterRowMapper(),
                id);
    }
    
    private static final class SpitterRowMapper implements RowMapper<Spitter> {
        public Spitter mapRow(ResultSet resultSet, int i) throws SQLException {
            return new Spitter(
                    resultSet.getLong("id"),
                    resultSet.getString("firstName"),
                    resultSet.getString("lastName"),
                    resultSet.getString("username"),
                    resultSet.getString("password"));
        }
    }
    

      

    findOne()函数使用JdbcTemplatequeryForObject()方法从数据库中查询Spitter记录。queryForObject()方法包括三个参数:

    • SQL字符串,用于从数据库中查询数据;
    • RowMapper对象,用于从结果集ResultSet中提取数据并构造Spitter对象;
    • 变量列表,用于指定查询参数(这里是通过id查询)。

    这里需要注意SpitterRowMapper类,它实现了RowMapper接口,对于查询结果,JdbcTemplate调用mapRow()方法——一个ResultSet参数和一个row number参数。mapRow()方法的主要作用是:从结果集中取出对应属性的值,并构造一个Spitter对象。

    addSpitter()方法相同,findOne()方法也没有那些JDBC模板样式代码,只有纯粹的用于查询Spitter数据的代码。

    https://yq.aliyun.com/articles/54079

  • 相关阅读:
    内核态和用户态的区别
    【Docker官方文档】理解Docker
    dpdk中kni模块
    linux的deamon后台运行
    在C语言中如何嵌入python脚本
    Docker学习之路(三)Docker网络详解
    Docker学习之路(二)DockerFile详解
    fopencookie函数详解
    Docker学习之路(一)
    C/C++代码覆盖率工具gcov、lcov
  • 原文地址:https://www.cnblogs.com/achengmu/p/8301529.html
Copyright © 2020-2023  润新知