spring(10)通过spring 和 JDBC征服数据库

【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);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/331124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu下apt-get方式Git的安装、配置和更新

一、首先命令行下载Git sudo apt-get update sudo apt-get install git 通过此种方式安装的git可能不是官方的最新版本&#xff0c;通过 git --version 查看版本信息&#xff0c;然后与git官网比对官网下载地址 二、然后配置git的帐号信息 git config --global user.name &q…

Spring思维导图,让Spring不再难懂(cache篇)

转载自 Spring思维导图&#xff0c;让Spring不再难懂&#xff08;cache篇&#xff09; 关于缓存 缓存是实际工作中非常常用的一种提高性能的方法。而在java中&#xff0c;所谓缓存&#xff0c;就是将程序或系统经常要调用的对象存在内存中&#xff0c;再次调用时可以快速从内存…

intro to JNDI

【0】README 1&#xff09;本文转自 http://sishuok.com/forum/blogPost/list/1186.html 【1】原文如下 1&#xff09;JNDI 是什么&#xff1f; JNDI是 Java 命名与目录接口&#xff08;Java Naming and Directory Interface&#xff09;&#xff0c;在J2EE规范中是重要的规范之…

Mybatis3配置方法

一.准备 1.三个Jar包&#xff0c; 1.mybatis-3.2.1.jar 2.mysql-connector-java-5.1.12-bin.jar 3.log4j-1.2.17.jar 2.vo类对象 public class SysUser {private Long id;private String name;private String loginName;private String password;private String avatar;/** ge…

小白学数据:教你用Python实现简单监督学习算法

转载自 小白学数据&#xff1a;教你用Python实现简单监督学习算法今天&#xff0c;文摘菌想谈谈监督学习。监督学习作为运用最广泛的机器学习方法&#xff0c;一直以来都是从数据挖掘信息的重要手段。即便是在无监督学习兴起的近日&#xff0c;监督学习也依旧是入门机器学习的钥…

Spring_01_IoC初级总结

1.IoC简介 (转载) (原文&#xff1a;http://jinnianshilongnian.iteye.com/blog/1413846) via:jinnianshilongnian 1.1、IoC是什么 Ioc—Inversion of Control&#xff0c;即“控制反转”&#xff0c;不是什么技术&#xff0c;而是一种设计思想。在Java开发中&#xff0c;Io…

深度学习工具caffe详细安装指南

转载自 深度学习工具caffe详细安装指南前言&#xff1a; 在一台系统环境较好的linux机器上可以很容易的安装caffe&#xff0c;但是如果系统本身很旧&#xff0c;又没有GPU的话&#xff0c;安装就太麻烦了&#xff0c;所有都得从头做起&#xff0c;本文档旨在尽可能覆盖安装所要…

Spring_02_AOP初级总结

1.AOP简介 是对OOP编程方式的一种补充。翻译过来为“面向切面编程”。 可以理解为一个拦截器框架&#xff0c;但是这个拦截器会非常武断&#xff0c;如果它拦截一个类&#xff0c;那么它就会拦截这个类中的所有方法。如对一个目标列的代理&#xff0c;增强了目标类的所有方法…

spring(11)使用对象-关系映射持久化数据

【0】README1&#xff09;本文部分文字描述转自&#xff1a;“Spring In Action&#xff08;中/英文版&#xff09;”&#xff0c;旨在review “spring(11)使用对象-关系映射持久化数据” 的相关知识&#xff1b;【2】spring 与 java 持久化API1&#xff09;intro&#xff1a;…

漫画:什么是数据仓库

转载自 玻璃猫 算法与数据结构一个故事 在很久很久以前&#xff0c;世界上生活着许多种族&#xff0c;有人类&#xff0c;有矮人&#xff0c;有精灵......他们有着不同的信仰&#xff0c;不同的文化&#xff0c;彼此相安无事。可是&#xff0c;有一个猥琐男却偏偏想要统治整个世…

SpringMVC_初级总结

1.SpringMVC的工作原理 浏览器发出一个http请求给服务器&#xff0c;如果匹配DispatcherServlet的请求映射路径&#xff08;在web.xml中指定&#xff09;&#xff0c;服务器将请求转交给DispatcherServlet.DipatcherServlet接收到这个请求之后&#xff0c;根据请求的路径&#…

tomcat中配置jndi数据源以便spring获取

【0】README0&#xff09;intro to jndi&#xff0c; plase visit intro to jndi&#xff1b;1&#xff09;本文译自 Configuring Spring MVC JdbcTemplate with JNDI Data Source in Tomcat&#xff1b;2&#xff09;本文旨在分析如何通过springmvc 获取 JNDI 数据源 以连接到…

Machine Learning:十大机器学习算法

转载自 Machine Learning&#xff1a;十大机器学习算法摘要: - 机器学习算法分类&#xff1a;监督学习、无监督学习、强化学习 - 基本的机器学习算法&#xff1a;线性回归、支持向量机(SVM)、最近邻居(KNN)、逻辑回归、决策树、k平均、随机森林、朴素贝叶斯、降维、梯度增强 机…

Java的值传递解析

值传递与引用传递 最近学基础的时候&#xff0c;老师讲了值传递和引用传递&#xff0c;这个问题一直不太明白&#xff0c;上网查了很多资料&#xff0c;按照自己的理解整理了一遍&#xff0c;发现之前不太明白的地方基本上想明白了&#xff0c;如有不正确的地方&#xff0c;欢…

spring(13)缓存数据

【0】README1&#xff09;本文部分文字描述转自&#xff1a;“Spring In Action&#xff08;中/英文版&#xff09;”&#xff0c;旨在review “spring(13)缓存数据” 的相关知识&#xff1b;2&#xff09;缓存&#xff1a;缓存可以存储经常会用到的信息&#xff0c;这样每次需…

漫画:什么是分布式事务

转载自 漫画&#xff1a;什么是分布式事务&#xff1f;————— 第二天 —————————————————假如没有分布式事务 在一系列微服务系统当中&#xff0c;假如不存在分布式事务&#xff0c;会发生什么呢&#xff1f;让我们以互联网中常用的交易业务为例子&#…

Spring4.2.6+SpringMVC4.2.6+MyBatis3.4.0 整合

【0】README0&#xff09;本文旨在 review Spring4.2.6SpringMVC4.2.6MyBatis3.4.0 整合过程&#xff1b;1&#xff09;项目整合所涉及的源代码&#xff0c;please visit https://github.com/pacosonTang/MyBatis/tree/master/spring4mvc_mybatis32&#xff09;由于晚辈我还不…

ibatis(0)ibatis 与 mybatis 简述

【0】README:1&#xff09;本文旨在给出 ibatis 与 mybatis 简述&#xff0c;简述内容转自 如下链接&#xff1b;【1】main contents1&#xff09;apache offical declarationhttp://ibatis.apache.org/.apache ibatis is retired at the apache software foundation (2010/06/…

Java面试大纲

转载自 金三银四跳槽季&#xff0c;Java面试大纲跳槽时时刻刻都在发生&#xff0c;但是我建议大家跳槽之前&#xff0c;先想清楚为什么要跳槽。切不可跟风&#xff0c;看到同事一个个都走了&#xff0c;自己也盲目的面试起来&#xff08;期间也没有准备充分&#xff09;&#x…

ibatis(1)ibatis的理念

【0】README1&#xff09;本文部分内容转自 “ibatis in action”&#xff0c;旨在 review “ibatis的理念” 的相关知识&#xff1b;【1】结合所有优秀思想的混合型解决方案在现实世界中&#xff0c;混合型解决方案随处可见。将两个看上去相悖的思想在中间处巧妙结合&#xff…