spring4.0读书笔记4---Spring持久层--JDBC

2024-02-05 05:18

本文主要是介绍spring4.0读书笔记4---Spring持久层--JDBC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


之前的数据访问我们需要:初始化数据访问框架,打开链接,处理各种会出现的异常,关闭异常。在操作中很容易损坏数据

数据访问的核心:数据源,连接池,JDBC的关系
数据源和数据核心都死抽象的概念

数据源和连接池是由容器提供的(例如:tomcat) ;连接池分配,管理,销毁连接(Connection),数据源保存你连接的数据库,创建连接(Connectioon )【使用了一种设计模式:工厂模式】
数据源和连接池可以看为是一体,是处理数据访问的核心;JDBC可以理解为,对这些的实现—
JDBC是Java提供的一系列的接口,规范,第三方(数据库)提供实现类(jar 包)(叫做驱动,驱动将高级语言翻译为对数据库的操作)
JDBC实现数据源连接池,翻译高级语言---->对数据库的操作
之后的一些数据访问的方式都是对数据访问核心的不同实现,以及在不同框架下的实现(本质都是一样的)只能说是更多的封装,解耦,来实现核心
spring 自带了一组数据访问框架,集成了多种数据访问技术,无论是原生的jdbc 还是其他的数据源,spring自动帮你清除枯燥的访问逻辑,处理访问底层的的数据访问,使代码更关注于业务逻辑

spring中的数据访问思想

为了避免持久化处理逻辑分散到多个组件中,所以最好将处理持久化的逻辑集中在一个或者两个组件中;这种组件被称为数据处理对象(data accsee object DAO )或者Repository

  1. 为了实现更好的低耦合,采用接口暴露
    服务对象本身是不会处理数据访问的,而是将数据访问委托给Repository ;服务对象是通过Repository 接口来访问Repository 的实现【服务对象并没有直接与数据访问实现绑定在一起,实现低耦合】

  2. 统一的异常体系
    在JDBC数据访问出现的所有异常都使用SQLException ,但是,不会告诉你哪里出现错误【基本等于无用】,要通过他具体的属性才能知道哪里出现了错误,但为什么还是要强制捕获,一位他是数据访问的通用异常。JDBC中没有与错误对象的异常
    在spring中 每一种数据访问出现的问题,几乎都有一个对应的异常;这些异常继承于:DataAccessException 这是一个非检查的异常,没有强制性的要求写catch 语句,将是否捕获异常的权力交给了开发人员

  3. 数据访问模块化

模块化:事件完成的过程是不变的,步骤也是不变的,变得是每一个步骤的具体实现

数据访问过程中,不变的是:需要获取数据存储的连接,并且自处理完成之后释放连接;变化的 是: 获取这个连接之后,我们要怎么样查询数据或者是更新数据
spring中将固定和变化的连部分分为两个类:

  1. 模板(template ) :处理不变的部分。准备资源,开始事务,提交/事务回滚,关闭资源和处理异常
  2. 回调:sql 语句,绑定参数,整理结果
    我们需要关注的是数据访问逻辑

概念的总结
在这里插入图片描述


先介绍spring中的JDBC

配置数据源

  1. 通过JDBC 驱动定义的数据源是不带池功能的数据源,也就是说DataSource 中只有一个连接,在性能上有极大的局限性
  2. 嵌入式数据源(Embedded database)
    也称为嵌入式数据库,是一个轻量级的数据库,是作为运行程序的一部分运行,而不是应用连接的独立数据库服务器【JDBC就是这种方式】嵌入式数据库在每次重启的时候,都会初始化数据库和填充数据

嵌入式数据库和数据库服务器的区别:

  1. 最大的不同就是运行地址空检不同。数据库服务器,独立的运行一个守护进程,但是嵌入式数据库 行程序在同一个进程
  2. 嵌入式数据库不需要数据库驱动程序,直接将数据库的库文件链接到程序中,应用程序通过API访问
    详解:https://blog.csdn.net/Stitch__/article/details/88870021
springboot 中配置H2 嵌入式数据库
3. 使用JDBC命名空间<jdbc:embedded-database    id ="dataSource" type ="H2"><jdbc:script location = xxx/schema.sql>   <jdbc:script location = xxx/test-data.sql></jdbc:embedded-database>使用<jdbc:script >  来搭建嵌入式数据库;可以不配置,也可以做多个配置
schema.sql  :包含创建数据库中表的SQL 【springboot 中也可以配置schema.sql 文件初始化数据库】
test-data.sql : 将测试数据填充到数据库中  

jdbc 命名空间除了搭建嵌入式数据库之外<jdbc:embedded-datasource> 元素还暴露了一个数据源,这里id 被设置为 datasource 【连系到向容器中添加组件时就会产生或者自定义一个id 作为组件在容器中的名字】这就是暴露的数据源;所以如果在程序中需要使用javax.sql.DataSource 就可以直接注入datasource bean

使用java 配置嵌入式数据库:
@Bean
public DataSource dataSource()){return new EmbeddedDataBaseBuilder().setType(EmbeddedDatabaseBuilderType.H2).setScript("classpath:schema.sql").setScript("classpath:test-data.sql").build();}使用Profile 选择数据源:在不同的环境下数据源可能不一样
1. Java 代码配置:在每一个@Bean 上加上注解:@Profile("环境名称")会在运行时选择数据源,取决于哪一个profile被激活
2. 使用XML文件配置Profile选择:<beans profile = "环境名称"><jdbc : embedded-datasource></jdbc : embedded-datasource></beans>

在Spring中使用JDBC

jdbc 是建立在SQL上的。jdbc 允许你使用数据库的所有特征,这是其他框架不鼓励甚至是禁止的。
使用JDBC所提供的直接操作数据库的API


你在一段代码中要完成的事:获取连接,创建语句,绑定参数,清理资源,处理异常,并且SQLException 这个异常不会给你任何解决这个异常的信息;也就是说你写了差不多20行的代码可能只是为了插入一条数据;每一次对数据库的操作,其实有80% 的代码都是样板代码,并且要求一次正确【关闭资源的代码错误,资源也无法关闭】
使用JDBC模板
spring自带的jdbc 框架承担了资源管理和异常处理的工作,所以只需要编写从数据库中读写数据的代码.spring 将样板代码抽取到了模板类中
jdbcTemplate
让jdbcTemplate 正常工作,只需要为他设置DataSource

@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource){return new JdbcTemplate(dataSource);   dataSource 可以是javax.sql.DataSource 的任何实现
}使用:将jdbcTemplate 装配到Repository 中,并使用他来访问数据库
在实现访问的类上@Regpository 表示这个类会在扫描组件的时候自动创建;例如用户相关的数据操作
类的构造函数:
@Ingect
public jdbcSpitterRepository(JdbcOperation jdbcOperation){  @Inject 会自动获取一个JdbcOperation 对象this.jdbcOperation=jdbcOperation;
}
JdbcOperation 是一个接口,定义了jdbcTemplate 所实现的操作。
通过JdbcOperation,达到 jdbcSpitterRepository与 JdbcTemplate 的低耦合或者直接声明为Bean
@Bean
...
return new xxxx(jdbcTemplate);

jdbcTemplate 模板中的相关方法:

  1. 更新数据:updata(sql,参数) ; jdbcoperations(sql,username,password.....)
  2. 查询数据:queryForObject(sql,Object,参数);从ResultSet 中获取数据封装到指定的对象中
    sql:查询语句
    Object :查询到的数据封装在那个对象中
    查询的参数
查询:
public Spitter findOne(long id){return jdbcOperation(sql,new SpitterRowMapper(),id)
}
pucliv static finall class SpitterRowMapper(){ 
之所以能将数据源封装到一个对象中,是因为在这里的设置,其实还是一个检索封装public Spitter mapRow(ResultSet set ,int rowNum){return new Spitter(set.getLong("id"),set.getstring("username").......当创建SpitterRowMapping 的时候,就从ResultSet中获取数据封装成Spitter的对象
)
}
  1. 查询所有的数据:
    List<Map<String,Object>> list = jdbcTemplate.queryForList("select * from department")

名命参数模板NumberParameterJdbcTemplate
在sql 语句需要参数的时候,传入的参数和语句中所需的参数的顺序必须要保持一致,为了更方便不用考虑参数顺序的问题,可以使用NumberParameterJdbcTemplate模板声明和常规的JdbcTemplate 的方法一致

@Bean
public NumberParameterJdbcTemplate jdbcTemplate(DataSource dataSource){return new JdbcTemplate(dataSource);   }
使用:
sql 语句:以插入语句为例
String sql = "INSERT INTO SPITTER"+"(id,username,gender,hobby)"+"(:ID,USERNAME,HOBBY)";
Map<String,Object> paraMap=new HashMap<String,Objcet>();参数绑定:
paraMap.put("ID",spitter.getid());
paraMap.put("USERNAME",spitter.getusername());
paraMap.put("HOBBY",spitter.gethobby());语句执行:
jdbcOperator.updata(sql,paraMap);名命参数是通过Map 进行绑定的

这篇关于spring4.0读书笔记4---Spring持久层--JDBC的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/679838

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定