Spring 与 JDBC

本贴最后更新于 2704 天前,其中的信息可能已经时异事殊

 

  • 数据访问的功能放到一个或多个专注于此项任务的组件,这样的组件称为数据访问对象

  • 编写良好的数据访问对象应该以接口的方式暴露功能,Spring 遵循面向对象中的 针对接口编程,将持久层隐藏在接口之后。

  • Spring 提供了统一的异常体系,提供了多个数据访问异常,分别描述异常发生所对应的问题,可以用在所支持的所有持久化方案中。

  • Spring 将数据访问过程中固定的和可变的部分划分为模板(template)回调(callback),将过程中与特定实现的部分委托给接口,用接口的不同实现定义过程中的具体行为。

  • Spring 提供了在上下文中配置数据源 bean 的多种方式,包括通过 JDBC 驱动程序定义的数据源通过 JNDI 查找的数据源连接池的数据源

  • 位于 jee 命名空间的 <jee:jndi-lookup> 元素可以用于检索 JNDI 中的对象(包括数据源)并装配到 Spring 中,如 <jee:jndi-lookup id="dataSource" jndi-name="/jdbc/xxxDS" resource-ref="true"> 。resource-ref 属性为 true 时,jndi-name 将会自动添加"java:comp/env/"前缀。

  • JavaConfig 配置 JNDI:

      @Bean
      public JndiObjectFactoryBean dataSource() {
          JndiObjectFactoryBean jndiObjectFB = new JndiObjectFactoryBean();
          jndiObjectFB.setJndiname("jdbc/xxxDS");
          jndiObjectFB.setResourceRef(true);
          jndiObjectFB.setProxyInterface(javax.sql.DataSource.class);
          return jndiObjectFB;
      }
    
  • Spring 中可直接配置数据源连接池,虽然 Spring 中未提供数据源连接池的实现,但有多项可用方案,如c3p0BoneCP 等开源实现。

  • Spring 提供了通过 JDBC 驱动定义数据源的类,例如:

      @Bean
      public DataSource dateSource() {
          DriverManagerDataSource ds = new DriverManagerDataSource();
          ds.setDriverClassName("org.h2.Driver");
          ds.setUrl("jdbc:xxxxx");
          ds.setUsername("root");
          ds.setPassword("");
          return ds;
      }
    
  • 配合 @Profile 注解可以从多个数据源中选择需要的数据源。

  • Spring 的 JDBC 框架负责管理资源处理异常,开发者只需编写从数据库读写数据的必须代码,从而简化 JDBC 代码。需要使用命名参数时,需要使用 NamedParameterJdbcTemplate,对于多数 JDBC 任务来说 JdbcTemplate 就是最好的选择。

  • JdbcTemplate 需要 DataSource 参数,可以在需要 JDBCTemplate 的位置声明 JdbcOperations 接口,并注入 JdbcTemplate 对象

  • RowMapper 用于从 ResultSet 中提取数据并构建域对象,如

      private static final class SpitterRowMapper implements RowMapper<Spitter> {
          public Spitter mapRow(ResultSet rs, int rowNum) throws SQLException {
              long id = rs.getLong("id");
              String username = rs.getString("username");
              String password = rs.getString("password");
              String fullName = rs.getString("fullname");
              String email = rs.getString("email");
              boolean updateByEmail = rs.getBoolean("updateByEmail");
              return new Spitter(id, username, password, fullName, email, updateByEmail);
          }       
      }
    
  • 几个 JdbcTemplate 使用示例:

      public long count() {
          return jdbcTemplate.queryForLong("select count(id) from Spitter");
      }
    

    public Spitter save(Spitter spitter) {
    Long id = spitter.getId();
    if (id == null) {
    long spitterId = insertSpitterAndReturnId(spitter);
    return new Spitter(spitterId, spitter.getUsername());
    } else {
    jdbcTemplate.update("update Spitter set username=?",
    spitter.getUsername(),
    spitter.getPassword(),
    id);
    }
    return spitter;
    }

    private long insertSpitterAndReturnId(Spitter spitter) {
    SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate).withTableName("Spitter");
    jdbcInsert.setGeneratedKeyName("id");
    Map<String, Object> args = new HashMap<String, Object>();
    args.put("username", spitter.getUsername());
    args.put("password", spitter.getPassword());
    long spitterId = jdbcInsert.executeAndReturnKey(args).longValue();
    return spitterId;
    }

    public Spitter findOne(long id) {
    return jdbcTemplate.queryForObject(
    SELECT_SPITTER + " where id=?", new SpitterRowMapper(), id);
    }

    public void delete(long id) {
    jdbcTemplate.update("delete from Spittle where id=?", id);
    }

  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    940 引用 • 1458 回帖 • 160 关注
  • JDBC
    18 引用 • 24 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 7 关注
  • sts
    2 引用 • 2 回帖 • 147 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖 • 3 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 619 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3167 引用 • 8207 回帖 • 2 关注
  • Electron

    Electron 基于 Chromium 和 Node.js,让你可以使用 HTML、CSS 和 JavaScript 构建应用。它是一个由 GitHub 及众多贡献者组成的活跃社区共同维护的开源项目,兼容 Mac、Windows 和 Linux,它构建的应用可在这三个操作系统上面运行。

    15 引用 • 136 回帖 • 8 关注
  • GraphQL

    GraphQL 是一个用于 API 的查询语言,是一个使用基于类型系统来执行查询的服务端运行时(类型系统由你的数据定义)。GraphQL 并没有和任何特定数据库或者存储引擎绑定,而是依靠你现有的代码和数据支撑。

    4 引用 • 3 回帖 • 21 关注
  • Mac

    Mac 是苹果公司自 1984 年起以“Macintosh”开始开发的个人消费型计算机,如:iMac、Mac mini、Macbook Air、Macbook Pro、Macbook、Mac Pro 等计算机。

    164 引用 • 594 回帖 • 1 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 427 关注
  • 职场

    找到自己的位置,萌新烦恼少。

    126 引用 • 1699 回帖
  • Postman

    Postman 是一款简单好用的 HTTP API 调试工具。

    4 引用 • 3 回帖 • 1 关注
  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    90 引用 • 59 回帖 • 3 关注
  • 周末

    星期六到星期天晚,实行五天工作制后,指每周的最后两天。再过几年可能就是三天了。

    14 引用 • 297 回帖 • 1 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 24 关注
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    108 引用 • 54 回帖 • 1 关注
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 681 关注
  • 国际化

    i18n(其来源是英文单词 internationalization 的首末字符 i 和 n,18 为中间的字符数)是“国际化”的简称。对程序来说,国际化是指在不修改代码的情况下,能根据不同语言及地区显示相应的界面。

    7 引用 • 26 回帖 • 3 关注
  • 人工智能

    人工智能(Artificial Intelligence)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门技术科学。

    75 引用 • 145 回帖
  • 阿里云

    阿里云是阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。

    89 引用 • 345 回帖 • 2 关注
  • SEO

    发布对别人有帮助的原创内容是最好的 SEO 方式。

    35 引用 • 200 回帖 • 24 关注
  • IBM

    IBM(国际商业机器公司)或万国商业机器公司,简称 IBM(International Business Machines Corporation),总公司在纽约州阿蒙克市。1911 年托马斯·沃森创立于美国,是全球最大的信息技术和业务解决方案公司,拥有全球雇员 30 多万人,业务遍及 160 多个国家和地区。

    16 引用 • 53 回帖 • 118 关注
  • Linux

    Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 Unix 的多用户、多任务、支持多线程和多 CPU 的操作系统。它能运行主要的 Unix 工具软件、应用程序和网络协议,并支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。

    915 引用 • 931 回帖
  • 房星科技

    房星网,我们不和没有钱的程序员谈理想,我们要让程序员又有理想又有钱。我们有雄厚的房地产行业线下资源,遍布昆明全城的 100 家门店、四千地产经纪人是我们坚实的后盾。

    6 引用 • 141 回帖 • 551 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖
  • Pipe

    Pipe 是一款小而美的开源博客平台。Pipe 有着非常活跃的社区,可将文章作为帖子推送到社区,来自社区的回帖将作为博客评论进行联动(具体细节请浏览 B3log 构思 - 分布式社区网络)。

    这是一种全新的网络社区体验,让热爱记录和分享的你不再感到孤单!

    131 引用 • 1114 回帖 • 150 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 401 关注
  • Maven

    Maven 是基于项目对象模型(POM)、通过一小段描述信息来管理项目的构建、报告和文档的软件项目管理工具。

    185 引用 • 318 回帖 • 348 关注