本文主要是介绍spring4.0读书笔记4---Spring持久层--JDBC,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
之前的数据访问我们需要:初始化数据访问框架,打开链接,处理各种会出现的异常,关闭异常。在操作中很容易损坏数据
数据访问的核心:数据源,连接池,JDBC的关系
数据源和数据核心都死抽象的概念数据源和连接池是由容器提供的(例如:tomcat) ;连接池分配,管理,销毁连接(Connection),数据源保存你连接的数据库,创建连接(Connectioon )【使用了一种设计模式:工厂模式】
数据源和连接池可以看为是一体,是处理数据访问的核心;JDBC可以理解为,对这些的实现—
JDBC是Java提供的一系列的接口,规范,第三方(数据库)提供实现类(jar 包)(叫做驱动,驱动将高级语言翻译为对数据库的操作)
JDBC实现数据源连接池,翻译高级语言---->对数据库的操作
之后的一些数据访问的方式都是对数据访问核心的不同实现,以及在不同框架下的实现(本质都是一样的)只能说是更多的封装,解耦,来实现核心
spring 自带了一组数据访问框架,集成了多种数据访问技术,无论是原生的jdbc 还是其他的数据源,spring自动帮你清除枯燥的访问逻辑,处理访问底层的的数据访问,使代码更关注于业务逻辑
spring中的数据访问思想
为了避免持久化处理逻辑分散到多个组件中,所以最好将处理持久化的逻辑集中在一个或者两个组件中;这种组件被称为数据处理对象(data accsee object DAO )
或者Repository
-
为了实现更好的低耦合,采用接口暴露
服务对象本身是不会处理数据访问的,而是将数据访问委托给Repository ;服务对象是通过Repository 接口来访问Repository 的实现【服务对象并没有直接与数据访问实现绑定在一起,实现低耦合】 -
统一的异常体系
在JDBC数据访问出现的所有异常都使用SQLException ,但是,不会告诉你哪里出现错误【基本等于无用】,要通过他具体的属性才能知道哪里出现了错误,但为什么还是要强制捕获,一位他是数据访问的通用异常。JDBC中没有与错误对象的异常
在spring中 每一种数据访问出现的问题,几乎都有一个对应的异常
;这些异常继承于:DataAccessException 这是一个非检查的异常,没有强制性的要求写catch 语句,将是否捕获异常的权力交给了开发人员 -
数据访问模块化
模块化:事件完成的过程是不变的,步骤也是不变的,变得是每一个步骤的具体实现
数据访问过程中,不变的是:需要获取数据存储的连接,并且自处理完成之后释放连接;变化的 是: 获取这个连接之后,我们要怎么样查询数据或者是更新数据
spring中将固定和变化的连部分分为两个类:
- 模板(template ) :
处理不变的部分。准备资源,开始事务,提交/事务回滚,关闭资源和处理异常
- 回调:
sql 语句,绑定参数,整理结果
我们需要关注的是数据访问逻辑
概念的总结
先介绍spring中的JDBC
配置数据源
- 通过JDBC 驱动定义的数据源是不带池功能的数据源,也就是说DataSource 中只有一个连接,在性能上有极大的局限性
- 嵌入式数据源(Embedded database)
也称为嵌入式数据库,是一个轻量级的数据库,是作为运行程序的一部分运行,而不是应用连接的独立数据库服务器【JDBC就是这种方式】嵌入式数据库在每次重启的时候,都会初始化数据库和填充数据
嵌入式数据库和数据库服务器的区别:
- 最大的不同就是运行地址空检不同。数据库服务器,独立的运行一个守护进程,但是嵌入式数据库 行程序在同一个进程
- 嵌入式数据库不需要数据库驱动程序,直接将数据库的库文件链接到程序中,应用程序通过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 模板中的相关方法:
- 更新数据:
updata(sql,参数) ; jdbcoperations(sql,username,password.....)
- 查询数据:
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的对象
)
}
- 查询所有的数据:
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的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!