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 进行绑定的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的公寓报修管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本公寓报修管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此公寓报修管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。公寓报修管理系统有管理员,住户,维修人员。管理员可以管理住户信息和维修人员信息,可以审核维修人员的请假信息,住户可以申请维修,可以对维修结果评价,维修人员负责住户提交的维修信息,也可以请假。公寓报修管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:公寓报修管理系统;Spring Boot框架;MySQL;自动化;VUE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值