Spring速查手册(三)——Spring+JDBC

本文详细介绍了Spring如何处理数据访问异常,通过DataAccessException将JDBC的SQLException具体化,便于异常恢复。同时,文章讨论了Spring的数据访问模板,如JdbcTemplate和NamedParameterJdbcTemplate的使用,包括配置数据源的各种方式,如JNDI、连接池和直接使用JDBC驱动。通过示例展示了如何使用这两个模板进行数据的插入和读取操作。
摘要由CSDN通过智能技术生成

这里写图片描述

Spring的数据访问异常体系

JDBC提供了SQLException异常,它是一个检查异常,必须要捕获。
但该异常过于笼统,只要是数据访问发生问题都抛出这个异常。因此很难在抛出该异常后进行恢复,因此该异常就没有抛出的必要。
Spring对JDBC的异常进行了转换,并进行了扩充,使得异常更加具体化,能够根据异常来进行恢复。
此外,Spring的数据访问异常均继承自DataAccessException,它是一个非检查型异常,因此Spring的数据访问异常可抛可不抛。

数据访问模板

Spring的数据访问采用了模板方法模式,模板方法定义了数据处理过程的主要框架,某些特定的步骤采用抽象函数的方式让子类去实现。这样子类在使用时只需关注数据访问逻辑即可,避免了大量重复代码。

Spring针对不同的持久化方案,提供了多种数据访问模板:
- JdbcTemplate
- NamedParameterJdbcTemplate
- HibernateTemplate
- SqlMapClientTemplate //MyBatis的模板

配置数据源

Spring提供了三种数据源配置方案:
1. 通过JDBC驱动程序定义的数据源;
2. 通过JNDI定义的数据源;
3. 通过连接池定义的数据源。

使用JNDI数据源

JNDI是 Java 命名与目录接口(Java Naming and Directory Interface)。
JNDI配置数据源就是将数据库的连接信息配置在Tomcat等Web容器中,这样数据库的连接信息完全可以在应用程序之外进行管理,当数据源发生变化时,就不需要修改程序代码。

使用连接池的数据源

Spring并没有提供数据库连接池的实现,但可以使用第三方开源方案。
只需定义一个名为dataSource的bean即可,并配置好各项连接信息。

使用JDBC驱动数据源

只需定义一个名为dataSource的bean即可,并配置好各项连接信息。

使用JDBC模板

Spring提供两种JDBC模板:
1. JdbcTemplate:基本的Jdbc模板
2. NamedParameterJdbcTemplate:在执行查询时,可以以命名参数的形式绑定到SQl中。

使用JdbcTemplate插入/读取数据

  1. 创建JdbcTemplate的bean,并注入dataSource:

    @Bean
    public JdbcTemplate jdbcTemplate( DataSource dataSource ){
        return new JdbcTemplate( dataSource );
    }
  2. 将jdbcTemplate注入给DAO:

    @Repository
    public class XXXDAOImpl implements XXXDAO{
        private JdbcOptions jdbcOptions;
    
        @Inject
        public XXXDAOImpl( JdbcOptions jdbcOptions ){
            this.jdbcOptions = jdbcOptions;
        } 
    }
    • JdbcOptions是JdbcTemplate的接口,JdbcTemplate是JdbcOptions的实现类,这里会自动注入JdbcTemplate对象。
  3. 插入数据:

    public void add(User user){
        jdbcOptions.update(
            "insert into user (username, passwd) values(?,?)",
            user.getUsername(),
            user.getPasswd()
        );
    }
  4. 读取数据:

    public User get(long id){
        return jdbcOptions.queryForObject(
            "select username,passwd from user id=?",
            new UserMapper(), // 结果映射对象
            id // 参数
        );
    }
    class UserMapper implments RowMapper<User> {
        public User mapRow( ResultSet rs, int rowNum ){
            return new User(
                rs.getLong("id"),
                rs.getString("username"),
                rs.getPasswd("passwd")
            );
        }
    }

使用NamedParamterJdbcTemplate

JdbcTemplate中的参数是按照顺序传入的,也就是SQL中“问号”的顺序和参数的顺序要严格一致,而是用NamedParamterJdbcTemplate可以显示指定参数的顺序。

  1. 创建NamedParamterJdbcTemplate的bean对象,并注入dataSource
  2. 将NamedParamterJdbcTemplate的bean对象注入给DAO的成员变量jdbcOptions
  3. 插入信息:

    public void add(User user){
        Map<String,Object> paramMap = new HashMap<>();
        paramMap.put("username",user.getUsername());
        paramMap.put("passwd",user.getPasswd());
    
        jdbcOptions.update(
            "insert into user (username, passwd) values(:username, :passwd)",
            paramMap
        );
    }

这里写图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值