【0】README
1)本文部分文字描述转自:“Spring In Action(中/英文版)”,旨在review  “spring(10)通过spring 和 JDBC征服数据库” 的相关知识;
【1】 spring 的数据访问哲学
1)intro:spring的目标之一是允许我们在开发应用程序的时候,能够遵循面向对象原则中的“针对接口编程”;
2)为了避免持久化的逻辑分散到应用的各个组件中,最好将数据访问的功能放到一个或多个专注于此项任务的组件中。这样的组件通常称为数据访问对象(data accwss object,DAO) 或 Repository;(干货——引入了 DAO 和 Repository)
3)为了避免应用与特定的数据访问策略耦合在一起,编写良好的 Repository应该以接口的方式暴露功能,下图展现了设计数据访问层的合理方式:
(t3)
【1.2】数据访问模板化
1)intro:spring将数据访问过程中固定的和可变的部分明确划分为两个不同 的类: 模板(template) 和 回调(callback);模板管理过程中固定的部分,而回调处理自定义的数据访问代码。下图展现了这两个类的职责:(干货——引入了模板和回调)
(t4)
2)针对不同的持久化平台,spring 提供了多个可选的模板。如果直接使用 JDBC,那你可以选择 JdbcTemplate。如果你希望使用对象关系映射框架,那 HibernateTemplate 或 JpaTemplate 可能会适合你。下表列出了 spring 所提供的所有数据访问模板及其用途:
(t5)
Attention)spring所支持的大多数持久化功能都依赖于 数据源。因此,在声明模板和 Repository之前,需要在spring 中配置一个 数据源用来连接数据库;
【2】配置数据源
1)intro:spring 提供了在 spring上下文中配置数据源bena 的多种方式:
way1)通过JDBC 驱动程序定义的数据源;
way2)通过JNDI 查找的数据源;
way3)连接池的数据源;
【2.1】使用JNDI 数据源
1)intro to jndi :http://blog.csdn.net/pacosonswjtu/article/details/51644550
2)利用spring,可以像使用 spring bean 那样配置 JNDI 中数据源的引用并将其装配到需要的类中;
3)使用 java配置 将 JNDI数据源装配到需要的类中:(for spec info ,please visit  tomcat中配置jndi数据源以便spring获取)
@Bean  // 使用JNDI 数据源.public DataSource dataSource() {JndiTemplate jndiTemplate = new JndiTemplate();DataSource dataSource = null;try {dataSource = (DataSource) jndiTemplate.lookup("java:comp/env/jdbc/spring");} catch (NamingException e) {e.printStackTrace();}return dataSource;}

【2.2】使用数据源连接池(strongly recommended)
1)intro:直接在spring中配置数据源,但spring并没有提供数据源连接池的实现,但可以有多项可用方案:(schema)
scheme1)Apache Commons DBCP(http://commons.apache.org/proper/commons-dbcp/configuration.html)
scheme2)c3p0(https://sourceforge.net/projects/c3p0/)
scheme3)BoneCP(http://www.jolbox.com/)
2)看个荔枝:配置DBCP BasicDataSource:
 @Beanpublic BasicDataSource getDataSource() {BasicDataSource ds = new BasicDataSource();ds.setDriverClassName("com.mysql.jdbc.Driver");ds.setUrl("jdbc:mysql://localhost:3306/t_spring");ds.setUsername("root");ds.setPassword("root");return ds;}

3)BasicDataSource的连接池配置属性如下所示:
(t6)
【2.3】基于JDBC 驱动的数据源
1)intro:在spring中,通过JDBC驱动定义数据源是最简单的配置方式,spring提供了3个这样的数据源类以供选择:
type1)DriverManagerDataSource:在每个连接请求时都会返回一个新建的连接。与 DBCP 的 BasicDataSource 不同,由DriverManagerDataSource 提供的连接并没有进行池化管理;(干货——引入了池化管理)
type2)SimpleDriverDataSource:它直接使用 JDBC驱动,来解决再特定环境下的类加载问题,这样的环境包括 OSGi 容器;
type3)SingleConnectionDataSource: 在每个连接请求时都会返回同一个的连接。尽管 SingleConnectionDataSource不是严格意义上的连接池数据源,但是你可以将其视为只有一个连接的池;
【3】在spring中使用 JDBC
【3.2】使用 JDBC模板
1)spring将数据访问的样本代码抽象到 模板类中,spring为jdbc提供了3个模板类选择:分别是 JdbcTemplate, NamedParameterJdbcTemplate 和 SimpleJdbcTemplate(已经被弃用),而原书作者推荐了 JdbcTemplate;(干货——原书作者推荐了 JdbcTemplate)
2)intro to JdbcTemplate:最基本的spring jdbc模板,支持简单的JDBC数据库访问功能以及基于索引参数的查询;
【3.2.1】使用 JdbcTemplate来插入数据
1)为了使其正常工作,只需要为其设置 DataSource就可以了;
(for org.springframework.jdbc.core.JdbcOperations API  , 参见  JdbcTemplate API)
@Configuration
public class RepositoryConfig {@Beanpublic BasicDataSource getDataSource() {BasicDataSource ds = new BasicDataSource();ds.setDriverClassName("com.mysql.jdbc.Driver");ds.setUrl("jdbc:mysql://localhost:3306/t_spring");ds.setUsername("root");ds.setPassword("root");return ds;}@Beanpublic JdbcTemplate getJdbcTemplate(DataSource ds) {return new JdbcTemplate(ds);}
}
2)使用JdbcTemplate 来读取数据
@Repository
public class SpittleRepositoryImpl implements SpittleRepository {private JdbcOperations jdbc;@Autowiredpublic SpittleRepositoryImpl(JdbcOperations jdbc) {this.jdbc = jdbc;}public List<Spittle> findSpittles(long limit, int offset) {return jdbc.query("select id, name from t_two limit ? offset ?", new SpittleRowMapper(), limit, offset);}private static class SpittleRowMapper implements RowMapper<Spittle> {public Spittle mapRow(ResultSet rs, int rowNum) throws SQLException {return new Spittle(rs.getInt("id"), rs.getString("name"));}}@Overridepublic Spittle findSpittle(int id) {return jdbc.queryForObject("select id,name,address from t_two where id=?", new RowMapper<Spittle>() { // �����ڲ���@Overridepublic Spittle mapRow(ResultSet rs, int rowNum) throws SQLException {return new Spittle(rs.getInt("id"), rs.getString("name"),rs.getString("address"));}}, id);}@Overridepublic int getItemSum() {return (int) jdbc.queryForObject("select count(*) as item_sum from t_two", new RowMapper<Object>() {@Overridepublic Object mapRow(ResultSet rs, int rowNum) throws SQLException {return rs.getInt("item_sum");}});}
}
对以上代码的分析(Analysis):这个findOne()方法 使用了 JdbcTemplate.queryForObject() 方法来从数据库查询 Spitter;queryForObject() 方法有三个参数:
parameter1)String对象:包含了要从数据库中查找数据的SQL;
parameter2)RowMapper对象:用来从 ResultSet 中提取数据并构建域对象;
parameter3)可变参数列表:列出了要绑定到查询上的索引参数值;(Prepared Statement==预备语句)
Attention)值得注意的是 SpitterRowMapper对象中,它实现了 RowMapper接口。对于查询返回的每一行数据,JdbcTemplate 将会调用 RowMapper.mapRow()方法,并传入一个 ResultSet 和 包含行号的整数。在 SpitterRowMapper.mapRow()方法中,我们创建了 Spitter对象并将 ResultSet中的值填充进去;
【3.2.2】使用命名参数
1)intro:命名参数可以赋予SQL 中的每个参数一个明确的名字,在绑定值到查询语句的时候就通过该名字来引用参数。
2)看个荔枝:若某个sql 查询语句定义如下:
private static final String SQL_INSERT_SPITTER ="insert into spitter (username, password, fullname) " +"values (:username, :password, :fullname)";
对以上代码的分析(Analysis):使用命名参数查询,绑定值的顺序就不重要了,可以按照名字来绑定值;如果查询语句发生了变化导致参数的顺序与之前不一致,我们不需要修改绑定的代码;
Attention)NamedParameterJdbcTemplate 是一个特殊的 JDBC模板类,它支持使用命名参数;其声明方式通过 JdbcTemplate:(干货——NamedParameterJdbcTemplate 支持命名参数)
@Bean
public NamedParameterJdbcTemplate jdbcTemplate(DataSource dataSource) {return new NamedParameterJdbcTemplate(dataSource);
}
3)看个荔枝:我们将 NamedParameterJdbcOperations(NamedParameterJdbcTemplate所实现的接口)注入到 Repository中,用它来替代 JdbcOperations,现在的addSpitter()方法如下所示:
private static final String INSERT_SPITTER ="insert into Spitter " +" (username, password, fullname, email, updateByEmail) " +"values " +" (:username, :password, :fullname, :email, :updateByEmail)";
public void addSpitter(Spitter spitter) {Map<String, Object> paramMap = new HashMap<String, Object>();paramMap.put("username", spitter.getUsername());paramMap.put("password", spitter.getPassword());paramMap.put("fullname", spitter.getFullName());paramMap.put("email", spitter.getEmail());paramMap.put("updateByEmail", spitter.isUpdateByEmail());jdbcOperations.update(INSERT_SPITTER, paramMap);
}

spring(10)通过spring 和 JDBC征服数据库相关推荐

  1. chapter10_通过Spring和JDBC征服数据库_2_配置数据源

    在声明模板和Repository之前, 我们需要先在Spring中配置一个数据源用于数据库连接 Spring提供了多种配置数据源bean的方式 (1) JDBC驱动程序定义的数据源 (2) JNDI查 ...

  2. Spring JDBC-使用Spring JDBC访问数据库

    概述 使用Spring JDBC 基本的数据操作 更改数据 返回数据库表的自增主键值 批量更改数据 查询数据 使用RowCallbackHandler处理结果集 使用RowMapperT处理结果集 R ...

  3. Spring实战6-利用Spring和JDBC访问数据库

    主要内容 定义Spring的数据访问支持 配置数据库资源 使用Spring提供的JDBC模板 写在前面:经过上一篇文章的学习,我们掌握了如何写web应用的控制器层,不过由于只定义了SpitterRep ...

  4. Java程序员从笨鸟到菜鸟之(七十八)细谈Spring(七)spring之JDBC访问数据库及配置详解

    利用spring访问数据库是我们ssh程序中必不可少的步骤,在没有hibernate之前,我们一般都用jdbc访问数据库,所以用jdbc访问数据库必不可少的要进行一些配置,spring中为我们提供了访 ...

  5. Spring JDBC 访问数据库

    Spring JDBC是Spring所提供的持久层技术,它以一种更直接.更简单的方式使用JDBC API.在Spring JDBC里,用户仅需要做那些必不可杀的事儿,而将资源获取.Statement创 ...

  6. spring cloud config将配置存储在数据库中

    点击上方"方志朋",选择"置顶或者星标" 你的关注意义重大! Spring Cloud Config Server最常见是将配置文件放在本地或者远程Git仓库, ...

  7. Spring Boot中使用Flyway来管理数据库版本

    久违了的Spring Boot系列,今天抽空更新一篇.之前写过很多篇关于数据访问的文章了,比如下面这些: 使用JdbcTemplate 使用Spring-data-jpa简化数据访问层(推荐) 多数据 ...

  8. Spring-学习笔记10【Spring事务控制】

    Java后端 学习路线 笔记汇总表[黑马程序员] Spring-学习笔记01[Spring框架简介][day01] Spring-学习笔记02[程序间耦合] Spring-学习笔记03[Spring的 ...

  9. spring boot ---- jpa连接和操作mysql数据库

    环境: centos6.8,jdk1.8.0_172,maven3.5.4,vim,spring boot 1.5.13,mysql-5.7.23 1.引入jpa起步依赖和mysql驱动jar包 1 ...

最新文章

  1. 论文标题,这么写才算好!
  2. 多协议底层攻击工具Yesinia
  3. VC++6.0和VC++2010的区别
  4. web页面屏蔽鼠标右键
  5. Cordova创建你的第一个App
  6. php+正则匹配qq,正则表达式对qq号进行验证的实例
  7. Spring Boot application.yml文件语法
  8. 平扫加重建什么意思_在这款“奸商模拟器”里,帮助战场老兵重建家园吧!
  9. UI设计素材|app表单模板,临摹学习,有效提高设计水平!
  10. FTPClient删除linux文件夹,使用ftp读取文件夹中的多个文件,并删除
  11. 数据福利|各种分辨率DEM数据下载
  12. 企业如何从CMMI3升级为CMMI5,有哪些优势?
  13. 常用z变换及其收敛域
  14. 税控盘是服务器系统,税控盘系统设置服务器地址
  15. The Rust Programming Language - 第7章 使用包、crate和模块管理不断增长的项目 - 7.1 包和crate
  16. vue原生js打印插件
  17. Docker 定制容器镜像的2种方法
  18. ffmpeg实现视频和音频分离,并且将声音切片
  19. Java课程实验报告 实验四 Java网络编程及安全
  20. 优达的Python入门课

热门文章

  1. Deltix Round, Spring 2021 E. Crypto Lights 组合数学 + 推公式
  2. 【NOIP模拟】彩色树【树形dp】【树链剖分性质】【复杂度分析】
  3. 2021牛客第一场H.Hash Function—FFT求差值的卷
  4. [TJOI2012] 旅游(树的直径)
  5. 学习KMP (概念 + 模板 + 例题: 子串查找)
  6. 洛谷P4322 最佳团伙(树上dp)
  7. ARC115D-Odd Degree【dp,欧拉回路】
  8. P4001-[ICPC-Beijing 2006]狼抓兔子【对偶图】
  9. ssl2294-打包【dp练习】
  10. 【模拟】交换(jzoj 1518)