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

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 );
}
  1. 将jdbcTemplate注入给DAO:
@Repository
public class XXXDAOImpl implements XXXDAO{
    private JdbcOptions jdbcOptions;

    @Inject
    public XXXDAOImpl( JdbcOptions jdbcOptions ){
        this.jdbcOptions = jdbcOptions;
    } 
}
  • JdbcOptions是JdbTemplate的接口,JdbcTemplate是JdbcOptions的实现类,这里会自动注入JdbcTemplate对象。
  1. 插入数据:
public void add(User user){
    jdbcOptions.update(
        "insert into user (username, passwd) values(?,?)",
        user.getUsername(),
        user.getPasswd()
    );
}
  1. 读取数据:
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
    );
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java学习网

69 个经典 Spring 面试题和答案

69 个经典 Spring 面试题和答案 Spring 概述 1. 什么是spring? Spring 是个java企业级应用的开源开发框架。Spring主要用...

2367
来自专栏Java架构师学习

Spring面试底层原理的那些问题,你是不是真的懂Spring?

2514
来自专栏冷冷

Spring 必知概念(二)

13、Spring框架中的单例Beans是线程安全的么? Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要...

1929
来自专栏小鄧子的技术博客专栏

【译】加载进阶

首先,从Android的资源文件中加载。你需要提供一个int类型的资源ID,而不是一个String类型的字符串指向网络URL。

863
来自专栏Java技术栈

史上最全 69 道 Spring 面试题和答案

Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标...

933
来自专栏Java架构

spring思维导图,让spring更加简单易懂

1924
来自专栏Java架构

2018年7月份,Spring经典面试题和答案

Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目标...

1203
来自专栏精讲JAVA

【续】java面试Spring必备知识点,怼死面试官,从我做起

小海有话说 这篇文章是是上一篇文章Spring必备知识点的续文,还是那句话,如果感觉有用就收藏,我没有办法满足所有人的要求,我只能尽量满足大部分...

50510
来自专栏xingoo, 一个梦想做发明家的程序员

【Spring实战】—— 15 Spring JDBC模板使用

  前一篇通过对传统的JDBC的使用操作,可以体会到使用的繁琐与复杂,套句话说,是用了20%作了真正的工作,80%作了重复的工作。 那么通过本篇,可以了解如...

1918
来自专栏精讲JAVA

Spring经典面试题和答案

Spring 是个java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring 框架目...

924

扫码关注云+社区