SpringBoot——数据访问
优质博文:IT-BLOG-CN
对于数据访问层,无论是SQL还是NoSQL,SpringBoot默认采用整合Spring Data的方式进行统一处理,添加大量自动配置,屏蔽了很多设置。引入各种xxxTemplate,xxxRepository来简化我们对数据访问层的操作。对我们来说只需要进行简单的设置即可。
一、整合基本的 JDBC 与数据源
【1】引入jdbc starter [spring-boot-starter-jdbc] 和MySQL驱动。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>
【2】在application.yml中配置数据源相关信息:
spring:datasource:username: rootpassword: 123url: jdbc:mysql://127.0.0.1:3306/jdbcdriver-class-name: com.mysql.jdbc.Driver
【3】测试:默认使用的是org.apache.tomcat.jdbc.pool.DataSource作为数据源。数据源的相关配置都在DataSourceProperties里面。自动配置原理:org.springframework.boot.autoconfigure.jdbc包中的DataSourceConfiguration,根据配置创建数据源,默认使用Tomcat连接池;可以通过spring.datasource.type指定自定义数据源类型;SpringBoot默认支持一下数据源:DataSource、HikariDataSource、BasicDataSource。用户也可以自定义数据源:如下可知是通过build创建数据源的。利用反射创建type类型的数据源,并绑定相关属性。
@ConditionalOnMissingBean({DataSource.class})
@ConditionalOnProperty(name = {"spring.datasource.type"}
)
static class Generic {Generic() {}//通过 build 创建数据源的。利用反射创建 type 类型的数据源,并绑定相关属性。@Beanpublic DataSource dataSource(DataSourceProperties properties) {return properties.initializeDataSourceBuilder().build();}
}
【4】第二个比较重要的类DataSourceAutoConfiguration自动配置类中的dataSourceInitializer继承了ApplicationListener。
public class DataSourceAutoConfiguration {private static final Log logger = LogFactory.getLog(DataSourceAutoConfiguration.class);public DataSourceAutoConfiguration() {}@Bean@ConditionalOnMissingBeanpublic DataSourceInitializer dataSourceInitializer(DataSourceProperties properties, ApplicationContext applicationContext) {return new DataSourceInitializer(properties, applicationContext);}//......
}class DataSourceInitializer implements ApplicationListener<DataSourceInitializedEvent> {
//......
}
DataSourceInitializer的两个主要作用:①、运行建表语句;②、运行操作数据的sql语句;
//运行建表语句
private void runSchemaScripts() {List<Resource> scripts = this.getScripts("spring.datasource.schema", this.properties.getSchema(), "schema");if(!scripts.isEmpty()) {String username = this.properties.getSchemaUsername();String password = this.properties.getSchemaPassword();this.runScripts(scripts, username, password);try {this.applicationContext.publishEvent(new DataSourceInitializedEvent(this.dataSource));if(!this.initialized) {this.runDataScripts();this.initialized = true;}} catch (IllegalStateException var5) {logger.warn("Could not send event to complete DataSource initialization (" + var5.getMessage() + ")");}}}
//运行操作数据的 sql语句
private void runDataScripts() {List<Resource> scripts = this.getScripts("spring.datasource.data", this.properties.getData(), "data");String username = this.properties.getDataUsername();String password = this.properties.getDataPassword();this.runScripts(scripts, username, password);
}
【5】进行数据表创建时,默认只需要将文件命名为:schema-*.sql;进行数据操作时,默认只需要将文件命令为:data-*.sql;如果自定义sql文件时,可以在application.yml中通过如下方式指定sql文件位置:传入的是一个list列表
spring:datasource:schema:- classpath: student.sql
【6】JdbcTemplateAutoConfiguration自动配置类给容器中注入了JdbcTemplate组件,帮组我们操作数据库。
@AutoConfigureAfter({DataSourceAutoConfiguration.class})
public class JdbcTemplateAutoConfiguration {@Bean@Primary@ConditionalOnMissingBean({JdbcOperations.class})public JdbcTemplate jdbcTemplate() {return new JdbcTemplate(this.dataSource);}
}
【7】高级配置:使用druid数据源,首先需要引入依赖:
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version>
</dependency>
【8】在yml配置文件中加入Druid
spring:datasource:username: rootpassword: 123url: jdbc:mysql://127.0.0.1:3306/jdbcdriver-class-name: com.mysql.jdbc.Drivertype: com.alibaba.druid.pool.DruidDataSource
二、整合 Mybatis 数据源(注解版)
【1】创建项目:选中web、mybatis、mysql和jdbc模块的starts;在pom.xml中会发现mybatis与springboot的整合依赖:这个依赖并不是以spring-boot开始的,说明并不是spring提供的依赖,而是由第三方mybatis提供的依赖包;
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.1.1</version>
</dependency>
【2】定义个接口类,用来操作目标表的增删改查:通过@Mapper表示该接口类是一个Mybatis的Mapper类,通过增删改查注解@Select @Update @Insert @Delete对数据表进行操作;
//指定这是一个操作数据库的 mapper
@Mapper
public interface DepartmentMapper {@Select("select * from department where id=#{id}")public Department getDeptById(Integer id);
}
【3】通过Controller层调用Server继而调用Mapper对数据完成操作:
@Controller
public class DepartmentController {@Autowiredprivate DepartmentMapper mapper;@GetMapping("/dept/{id}")public Department getDeptById(@PathVariable("id") Integer id){return mapper.getDeptById(id);}
}
相关文章:
SpringBoot——数据访问
优质博文:IT-BLOG-CN 对于数据访问层,无论是SQL还是NoSQL,SpringBoot默认采用整合Spring Data的方式进行统一处理,添加大量自动配置,屏蔽了很多设置。引入各种xxxTemplate,xxxRepository来简化我们对数据访…...
【C++深度剖析学习总结】28 函数对象分析
1.客户需求 编写一个函数,满足三个需求 函数可以获得斐波那契数列每项的值 每调用一次返回一个值 函数可根据需要重复使用 for(int i =0; i<10; i++) { cout << fib() << endl; } 第一个解决方案 #include<iostream> #include<string> using na…...
持续集成部署-k8s-配置与存储-配置管理:SubPath
持续集成部署-k8s-配置与存储-配置管理:SubPath 1. 简介2. 测试 挂载文件目录3. subPath 解决挂载目录时覆盖原容器内文件夹1. 简介 在Kubernetes (K8s) 中,SubPath是用于指定容器内部目录挂载的一个属性。它可以在Pod中指定某个Volume挂载到容器内部的特定目录下,以便容器…...
git容易出问题的命令
#首先进行git init初始化本地仓库 git init #再进行拉取远程仓库代码 git clone http://以上这种情况建立在第一次拉取仓库的操作 如果你已经拉取过仓库要进行关联的话,就使用这种方法 #关联远程仓库 git remote add origin https:// # 拉取代码 git pull origin/…...
Mongodb命名和文档限制
选用mongodb时,需要了解与mongodb数据大小,命名上的限制。针对这些限制,本文针对这些限制进行翻译整理。 BSON文档 mongodb中的数据记录,按照文档的形式保存。文档保存在一种类似于JSON的BSON结构中。Mongodb对BSON做了一些限制…...
pyQt主界面与子界面切换简易框架
本篇来介绍使用python中是Qt功能包,设置一个简易的多界面切换框架,实现主界面和多个子界面直接的切换显示。 1 主界面 设计的Demo主界面如下,主界面上有两个按钮图标,点击即可切换到对应的功能界面中,进入子界面后&a…...
软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】
软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】 课本里章节里所有蓝色字体的思维导图...
【左程云算法全讲11】贪心算法 并查集
系列综述: 💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于左程云算法课程进行的,每个知识点的修正和深入主要参考…...
CSS中4种关系选择器
元素(标签)之间的关系 父元素:直接包含子元素的元素 子元素:直接被父元素包含的元素 祖先元素:直接或间接包含后代元素的元素,父元素也是祖先元素 后代元素:直接或间接被祖先元素包含的元素,子元素也是后代…...
蓝牙模块(HC-05)与手机连接,蓝牙与蓝牙互联,电脑通过蓝牙控制单片机
任务一:蓝牙与手机连接 所用模块: HC-05蓝牙模块,USB TO TTL手机APP为SPP蓝牙串口 第一章:蓝牙模块配置 一:HC-05与USB TO TTL连接 EN:为使能引脚,一般不接 VCC:接USB TO TTL模…...
安装 eslint 配置指南 及 遇到的一些问题记录
前端eslint配置指南 背景 当前前端项目风格混乱,每个人有自己的开发习惯,有自己的格式化习惯,不便于项目的风格统一,不利于代码维护有的项目eslint没有用起来,没有起到规范代码的作用,导致出现一些基础代码…...
trzsz支持文件拖动到终端进行上传,类似lrzsz
考虑到 LapTop -> Host 1 -> Host 2 -> Docker -> TMUX,使用scp或sftp命令不方便;使用rz和sz命令就会方便很多,但是却又与 TMUX 不兼容(备注:Tmux是一个终端复用工具,允许用户在一个终端窗口中…...
Doris DDL和DML
1 创建用户和数据库 1)创建test用户 mysql -h hadoop1 -P 9030 -uroot -p create user test identified by test; 2)创建数据库 create database test_db; 3)用户授权...
NewStarCTF2023 Reverse方向Week3 ez_chal WP
分析 题目:ez_chal 一个XTEA加密, V6是key,v5是输入,然后v7就是密文。 看了v6,要用动调。 ELF文件用ida的远程调试。 然后在kali上输入长度为32的flag 全部转换成dd 再提取密文。 EXP #include <stdio.h>…...
程序员如何“升级打怪”?我用了这几个“歪瓜”!
不会吧?不会吧?计算机本命专业出身、以及半路出家的,混了几年了,还在新手村?对得起这几年摸的鱼? 思考一下:如何从小白一跃为大师,从此走上人生巅峰、迎娶白富美?变强只…...
模具制造厂ERP都有哪些牌子?模具制造厂ERP有什么用
模具制造通常会涉及物料领用、成品入库、工艺流转、投入水口、配方、模具、生产啤数统计等众多环节,各个环节数据的实时和准确传递,有利于企业清晰掌握订单生产进度,及时调整制造策略等。 有些模具制造工厂采用传统的管理模式,随…...
FPGA语法相关知识合集
一.相关概念 1.四种结构说明语句 2.initial 与 always 的异同点 3.task 与 function 的3个不同点 4.task的语法结构(定义及调用) 5.function的语法结构(定义及调用) 6.function 的一个必须有和一个必须没有,使用规则 7.自动(递归)函数…...
2023年Java核心技术大会(Core Java Week 2023)-核心PPT资料下载
一、峰会简介 人工智能在22年、23年的再次爆发让Python成为编程语言里最大的赢家;云原生的持续普及令Go、Rust等新生的语言有了进一步叫板传统技术体系的资本与底气。我们必须承认在近几年里,Java阵营的确受到了前所未有的挑战,出现了更多更…...
Vue3 源码解读系列(十五)——编译
编译 web 模式的编译主要做了 3 件事: 解析 template 生成 ASTAST 转换生成代码 /*** web 编译* param {string} template - 待编译的模板字符串* param {string} options - 配置对象*/ function compile(template, options {}) {return baseCompile(template, …...
gitlab安装配置及应用
安装 ##安装依赖 yum install -y curl policycoreutils-python openssh-server perl#上传包 rz gitlab-jh-16.5.2-jh.0.el7.x86_64.rpm 安装 yum install gitlab-jh-16.0.3-jh.0.el7.x86_64.rpm 初始化并启动 # 以下两种方法都可以配置访问地址,第一种需要在yum安…...
声明式3D开发:基于React与Three.js构建Web三维场景
1. 项目概述:三维世界构建的新范式 最近在探索3D内容创作和Web交互领域时,一个名为 pmndrs/triplex 的项目引起了我的浓厚兴趣。这并非一个传统的3D建模软件或游戏引擎,而是一个基于现代Web技术栈(特别是React和Three.js&#x…...
生产环境 JVM 参数实战计算指南
文章目录一、JVM内存配置四大核心铁律1. 预留系统内存,不占满物理内存2. 固定堆内存:Xms Xmx3. 新生代比例合理:约占堆内存1/34. 固定元空间大小二、通用标准化计算公式三、主流服务器一键生产配置1. 8G服务器(测试/小型服务&…...
AI智能体开发框架解析:从模块化架构到实战应用
1. 项目概述:一个面向开发者的智能体构建框架最近在GitHub上看到一个挺有意思的项目,叫hh-openclaw-agent。乍一看这个仓库名,你可能会有点懵——“hh”是啥?“openclaw”又是什么?但如果你对AI智能体(Agen…...
MCP协议应用商店:awesome-mcp-hub资源索引库实战指南
1. 项目概述:一个为MCP打造的“应用商店”如果你最近在折腾AI Agent或者智能体应用开发,大概率已经听过“模型上下文协议”这个名字了。没错,我说的就是MCP。它本质上是一套标准,让大语言模型能够安全、可控地访问外部工具和数据源…...
CentOS7服务器根目录爆满别慌!手把手教你用LVM在线扩容(附fdisk/lsblk命令详解)
CentOS7服务器根目录爆满应急处理指南:LVM动态扩容实战解析 凌晨三点,服务器监控突然发出刺耳的警报声——根目录使用率突破95%!这种场景对于运维人员来说再熟悉不过。生产环境中的服务仍在运行,但可用空间正在以肉眼可见的速度减…...
WinCC组态没问题,数据就是存不进U盘?手把手教你诊断西门子触摸屏USB接口‘假死’
WinCC组态正确却无法存储数据?深度解析西门子触摸屏USB接口故障排查 最近在工业自动化论坛上,看到不少工程师反馈一个奇怪现象:明明WinCC组态完全正确,数据记录配置也没问题,但就是无法将数据存入U盘。这种"组态正…...
ARM CP15协处理器与DMA控制架构深度解析
1. ARM CP15协处理器与DMA控制架构解析在ARMv6架构的嵌入式系统中,CP15协处理器扮演着系统控制核心角色,其寄存器组管理着内存保护、缓存操作以及DMA传输等关键功能。以ARM1136JF-S为例,c11寄存器组专门负责两级DMA控制,通过硬件加…...
企业边缘计算设备INA1607:硬件架构与应用解析
1. INA1607设备概述与核心定位IBASE INA1607是一款面向企业边缘计算场景设计的无风扇网络设备,采用Intel Atom x7405C Amston Lake低功耗处理器,专为uCPE(通用客户终端设备)和SD-WAN(软件定义广域网)应用场…...
hack-interview:结构化面试知识体系,从原理到实战的系统设计指南
1. 项目概述:一个为技术面试而生的“军火库”如果你正在准备技术面试,尤其是后端开发、系统设计或者算法相关的岗位,那么你大概率经历过这样的场景:面对网上浩如烟海的八股文、面经和零散的LeetCode题解,感觉知识体系像…...
避开这些坑:GPT-4 API多轮对话与流式输出实战中的5个常见问题
GPT-4 API高阶实战:多轮对话与流式输出的5个关键优化点 当开发者从基础API调用进阶到构建复杂对话系统时,往往会遇到一系列意料之外的挑战。这些挑战不仅影响用户体验,还可能直接导致项目延期或预算超支。本文将深入剖析五个关键优化点&#…...
