当前位置: 首页 > news >正文

Spring Boot数据访问基础知识与JDBC简单实现

目录

Spring Boot数据访问基础知识

Spring Data

 ORM

JDBC

JPA

JDBC简单实现

步骤1:新建Maven项目,添加依赖

步骤2:配置数据源—让程序可以访问到 

步骤3:配置数据源—让IDEA可以访问到

步骤4:添加数据库和表

步骤5:建立各层级框架,写入相对应代码

步骤6:测试各个接口方法

总结


Spring Boot数据访问基础知识

Spring Data

        Spring Data 项目是Spring的子项目,目的是为了简化构建基于 spring 框架应用的数据访问计数,包括非关系数据库、Map-Reduce 框架、云数据服务等等;另外也包含对关系数据库的访问支持。
        Spring Data是一个用于简化数据库访问,并支持云服务的开源框架。其主要目标是使得数据库的访问变得方便快捷,并支持map-reduce框架和云计算数据服务。此外,它还支持基于关系型数据库的数据服务,如OracleRAC等。对于拥有海量数据的项目,可以用Spring Data来简化项目的开发,就如Spring Framework对JDBCORM的支持一样,Spring Data会让数据的访问变得更加方便。

 ORM

        对象-关系映射(Object-Relational Mapping,简称ORM),面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。因此,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。
ORM框架及优缺点

JDBC

        idbc (Java DataBase Connectivitv)是iava连接数据库操作的原生接口。JDBC对Java程序员而言是APl,对实现与数据库连接的服务提供商而言是接口模型。作为API,JDB为程序开发提供标准的接口,并为各个数据库商及第三方中间件厂商实现与数据库的连接提供了标准方法。一句话概括:jdbc是所有框架操作数据库的必须要用的,由数据库厂商提供,但是为了方便java程序员调用各个数据库,各个数据库厂商都要实现idbc接口。
在我们的Spirng boot依赖中,JDBC的使用选择JDBCAPI。
Spring-data-jdbc不是普通的jdbc。它拥有了类似jpa的一些特性,比如能够根据方法名推导出sql,基本的CRUD等,也拥有了写原生sql的能力。最为关键的是,它非常的清爽,不需要依赖hibernte或者jpa。

JPA

        jpa(Java Persistence API)是java持久化规范,是orm框架的标准,主流rm框架都实现了这个标准。Sun引入新的JPAORM规范出于两个原因:其一,简化现有Java EE和Java SE应用开发工作;其二,Sun希望整合ORM技术,实现天下归一。ORM是一种思想,是插入在应用程序与JDBC API之间的一个中间层,JDBC并不能很好地支持面向对象的程序设计,ORM解决了这个问题,通过JDBC将字段高效的与对象进行映射。具体实现有hibernate、spring data jpa open jpa。
Spring DataJPA可以理解为JPA规范的再次封装抽象,底层还是使用了 Hibernate 的JPA技术实现


JDBC简单实现

        在Spring boot中,我们通过数据源拿到数据库连接,可以使用原生的JDBC语句来操作数据库。Spring本身也对原生的JDBC做了轻量级的封装,即dbcTemplate。 配置DBC的依赖后,Spring boot配置好了JdbcTemplat 放在了容器中,程序员只需自己注入即可使用。下面是一个简单的CRUD例子。

        步骤1:新建Maven项目,添加依赖

 

        步骤2:配置数据源让程序可以访问到 

注意:创建项目后,要设置好自己的本地仓库,我之前的文章有讲如何设置

等待依赖下载完成,写入以下配置信息。包括驱动、数据源地址、数据源访问用户名和密码

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/testdb?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456

         步骤3:配置数据源让IDEA可以访问到

如图所示,点击右边的  databases 或者  数据库  则弹出图片菜单

下载驱动完成后,测试链接成功。点击OK确认

         步骤4:添加数据库和表

 代码依次为data.sql 、Schema.sql 、user.sql

INSERT INTO `article` VALUES ('1','2101','SpringBoot 核心注解','核心注解的主要作用','00000008976','2023-01-16 12:11:12','2023-01-16 12:19:19');INSERT INTO `article` VALUES ('2','356752','JVM 调优','HotSpot 虚拟机详解','00000000026','2023-06-16 12:15:27','2023-06-16 18:15:30');INSERT INTO `article` VALUES ('3','454','JVM核心思想','编程的各种难题','0000000008','2023-08-5 12:15:27','2023-08-5 19:15:30');
DROP DATABASE IF EXISTS `Blog`;
create  database Blog;Use Blog;DROP TABLE IF EXISTS `article`;
CREATE TABLE `article`
(`id`          int(11)                   NOT NULL AUTO_INCREMENT COMMENT '主键',`user_id`     int(11)                   NOT NULL COMMENT '作者 ID',`title`       varchar(100)              NOT NULL COMMENT '文章标题',`summary`     varchar(200) DEFAULT NULL COMMENT '文章概要',`read_count`  int(11) unsigned zerofill NOT NULL COMMENT '阅读读数',`create_time` datetime                  NOT NULL COMMENT '创建时间',`update_time` datetime                  NOT NULL COMMENT '最后修改时间',PRIMARY KEY (`id`)
) ENGINE = InnoDBAUTO_INCREMENT = 1DEFAULT CHARSET = utf8mb4;
DROP DATABASE IF EXISTS `testdb`;
create  database testdb;Use testdb;DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (`user_id` int NOT NULL AUTO_INCREMENT COMMENT '用户 ID',`user_name` varchar(255) DEFAULT NULL COMMENT '用户名',`status` varchar(255) DEFAULT NULL COMMENT '用户状态',PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

添加之后,在user点击左上角的三角形按钮创建库表 (另外两个sql语句可以自行娱乐,本文章不会用上)

         步骤5:建立各层级框架,写入相对应代码

数据库和表建好之后,我们要建立各层级的软件包,里面存放不同的代码来让项目更加美观和使用,框架和代码如下:

各文件代码如下,注释有该文件的名称,大家只要复制粘贴就好

//useDao
public interface UserDao {int addUser(User user);int update(User user);int delete(User user);int count(User user);List<User> getList(User user);User getUser(User user);void batchAddUser(List<Object[]> batchArgs);}//UserDaoimpl 
@Repository
public class UserDaoimpl implements UserDao {@Resourceprivate JdbcTemplate jdbcTemplate;@Resourceprivate NamedParameterJdbcTemplate namedParameterJdbcTemplate;@Overridepublic int addUser(User user) {String sql = "INSERT into `user` (`user`.user_name,`user`.`status`) VALUES(?,?);";return jdbcTemplate.update(sql, user.getUserName(), user.getStatus());}@Overridepublic int update(User user) {String sql = "UPDATE `user` SET status=? WHERE user_name=?;";return jdbcTemplate.update(sql, user.getStatus(), user.getUserName());}@Overridepublic int delete(User user) {String sql = "DELETE FROM `user` where user_name=?;";return jdbcTemplate.update(sql, user.getUserName());}@Overridepublic int count(User user) {String sql = "SELECT COUNT(*) FROM `user` where `status`=?;";return jdbcTemplate.queryForObject(sql, Integer.class, user.getStatus());}@Overridepublic List<User> getList(User user) {String sql = "SELECT * FROM `user` where `status`=?;";return jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class), user.getStatus());}@Overridepublic User getUser(User user) {String sql = "SELECT * FROM `user` where `user_id`=?;";return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), user.getStatus());}@Overridepublic void batchAddUser(List<Object[]> batchArgs) {String sql = "INSERT into `user` (`user`.user_name,`user`.`status`) VALUES(?,?);";jdbcTemplate.batchUpdate(sql,batchArgs);}
}//User 
@Data
@AllArgsConstructor
@ToString
@NoArgsConstructor
public class User {private Integer userId;private String userName;private String status;}//UserService 
public interface UserService {public int addUser(User user);public int updateUser(User user);public int deleteUser(User user);public int countUser(User user);public List<User> getList(User user);public User getUser(User user);public void batchAddUser(List<Object[]> batchArgs);
}//UserServiceimp 
@Service("userService")
public class UserServiceimp implements UserService {@Resourceprivate UserDao userDao;@Overridepublic int addUser(User user){return userDao.addUser(user);}@Overridepublic int updateUser(User user){return userDao.update(user);}@Overridepublic int deleteUser(User user) {return userDao.delete(user);}@Overridepublic int countUser(User user) {return userDao.count(user);}@Overridepublic List<User> getList(User user) {return userDao.getList(user);}@Overridepublic User getUser(User user) {return userDao.getUser(user);}@Overridepublic void batchAddUser(List<Object[]> batchArgs) {userDao.batchAddUser(batchArgs);}
}

步骤6:测试各个接口方法

 我们在test的测试类下建立测试方法,可以依次测试我们写好的接口。注意要一段一段语句测试,否则会出错,测试代码我已写好注释

@Resourceprivate JdbcTemplate jdbcTemplate;@AutowiredUserService userService;@Testvoid taa(){User user=new User();user.setUserName("阿三");user.setStatus("在线");// 新增用户int i = userService.addUser(user);System.out.println("新增用户成功");// 修改用户
//        User user1 =new User();
//        user1.setUserName("乌鸦哥");
//        user1.setStatus("在线");
//        int u = userService.updateUser(user1);
//        System.out.println("修改用户成功");//批量添加
//        List<Object[]> batchArgs = new ArrayList<>();
//        Object[] a1 = {"}
//        Object[] a2 = {"b","在线"};
//        Object[] a3 = {"c","在线"};
//        Object[] a4 = {"d","在线"};
//        batchArgs.add(a1);
//        batchArgs.add(a2);
//        batchArgs.add(a3);
//        batchArgs.add(a4);
//        userService.batchAddUser(batchArgs);
//        System.out.println("批量增加完毕");//查询在线用户数量
//        User user2 = new User();
//        user2.setStatus("在线");
//        int a = userService.countUser(user2);
//        System.out.println("在线用户个数为: "+ a);//获取用户列表(user2在线)
//        List<User> userList = userService.getList(user2);
//        System.out.println("在线用户列表查询成功");//遍历在线列表
//        for (User user3 : userList){
//            System.out.println("用户ID:"+ user3.getUserId() +",用户名:"+
//                    user3.getUserName() + " ,状态:"+ user3.getStatus()
//            );
//        }}

总结

         以上就是今天的内容了,本文章主要讲了Spring Boot中的数据访问基础知识,以及如何使用JDBC进行简单的数据访问。而Spring Boot的自动化配置和简化开发极大地提高了开发效率,希望大家能有所收获。如本文有不妥之处,欢迎大家评论区点赞留言转发~

 

相关文章:

Spring Boot数据访问基础知识与JDBC简单实现

目录 Spring Boot数据访问基础知识 Spring Data ORM JDBC JPA JDBC简单实现 步骤1&#xff1a;新建Maven项目&#xff0c;添加依赖 步骤2&#xff1a;配置数据源—让程序可以访问到 步骤3&#xff1a;配置数据源—让IDEA可以访问到 步骤4&#xff1a;添加数据库和表 …...

ubuntu添加万能头文件

ubuntu的C头文件目录为/usr/include 在/usr/include下新建文件夹 bits sudo mkdir bits进入bits&#xff0c;新建stdc.h&#xff0c;并修改权限为744/777 cd bits;sudo touch stdc.h;sudo chmod 777 stdc.h将以下内容粘贴到stdc.h&#xff0c;保存退出 // C includes used …...

聊一聊关于前端语法 ?? 的那些事

当我们在编写前端代码时&#xff0c;语法是非常重要的。正确的语法可以确保我们的代码能够正常运行&#xff0c;并且易于维护和理解。在本文中&#xff0c;我们将探讨一些前端语法的问题&#xff0c;例如空值合并运算符&#xff08;??&#xff09;。 空值合并运算符是ES2020…...

宝塔Linux面板升级“获取更新包失败”怎么解决?

宝塔Linux面板执行升级命令后失败&#xff0c;提示“获取更新包失败&#xff0c;请稍后更新或联系宝塔运维”如何解决&#xff1f;新手站长分享宝塔面板升级失败的解决方法&#xff1a; 宝塔面板升级失败解决方法 1、使用root账户登录到你的云服务器上&#xff0c;宝塔Linux面…...

训练强化学习的经验回放策略:experience replay

经验回放&#xff1a;Experience Replay&#xff08;训练DQN的一种策略&#xff09; 优点&#xff1a;可以重复利用离线经验数据&#xff1b;连续的经验具有相关性&#xff0c;经验回放可以在离线经验BUFFER随机抽样&#xff0c;减少相关性&#xff1b; 超参数&#xff1a;Rep…...

uniapp学习

1 简单的表单校验 <!--uniapp:参考模板和字段生成页面 字段stuNumber 输入框 学号stuName 输入框 学生姓名teacher 输入框 辅导员submitDate 日期选择 填报日期morningTemperature 输入框&#xff08;数字校验一位小数&#xff09; 早上体温noonTemperature 输入框&…...

机器学习深度学习——数值稳定性和模型化参数(详细数学推导)

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位即将上大四&#xff0c;正专攻机器学习的保研er &#x1f30c;上期文章&#xff1a;机器学习&&深度学习——Dropout &#x1f4da;订阅专栏&#xff1a;机器学习&&深度学习 希望文章对你们有所帮助 这一部…...

layui 整合UEditor 百度编辑器

layui 整合UEditor 百度编辑器 第一步&#xff1a;下载百度编辑器并配置好路径 百度编辑器下载地址&#xff1a;http://fex.baidu.com/ueditor/ 第二步&#xff1a;引入百度编辑器 代码如下&#xff1a; <div class"layui-form-item layui-form-text"><…...

1、sparkStreaming概述

1、sparkStreaming概述 1.1 SparkStreaming是什么 它是一个可扩展&#xff0c;高吞吐具有容错性的流式计算框架 吞吐量&#xff1a;单位时间内成功传输数据的数量 之前我们接触的spark-core和spark-sql都是处理属于离线批处理任务&#xff0c;数据一般都是在固定位置上&…...

【Spring Boot】Spring Boot 集成 RocketMQ 实现简单的消息发送和消费

文章目录 前言基本概念消息和主题相关发送普通消息 发送顺序消息RocketMQTemplate的API介绍参考资料&#xff1a; 前言 本文主要有以下内容&#xff1a; 简单消息的发送顺序消息的发送RocketMQTemplate的API介绍 环境搭建&#xff1a; RocketMQ的安装教程&#xff1a;在官网…...

uniapp:图片验证码检验问题处理

图形验证码功能实现 uniapp&#xff1a;解决图形验证码问题及利用arraybuffer二进制转base64格式图片&#xff08;后端传的图片数据形式&#xff1a;x00\x10JFIF\x00\x01\x02\x00…&#xff09;_❆VE❆的博客-CSDN博客 UI稿&#xff1a; 需求&#xff1a;向后端请求验证码图片&…...

将Visio和Excel导出成没有白边的PDF文件

1、VISIO如何无白边导出pdf格式 在使用Latex时&#xff0c;要导入矢量图eps格式。但是VISIO无法输出eps格式&#xff0c;这就需要将其导出为pdf。但是导出pdf时&#xff0c;往往会有大量的白边。VISIO无白边导出pdf格式的方法如下&#xff1a; 1.文件——开发工具——显示sha…...

String类及其工具类

一、String类 1.字符串对象 String str new String("hello");String对象是final修饰的&#xff0c;不可修改的&#xff0c;修改后的字符串对象是另外一个对象&#xff0c;只是修改了引用地址。每次创建都会创建一个新的对象。 2. 字面量 String s "hello&…...

踩坑(5)整合kafka 报错 java.net.UnknownHostException: 不知道这样的主机

java.net.UnknownHostException: 不知道这样的主机。 (5c0c3c629db9)at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method) ~[na:na]at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:933) ~[na:na]at java.ba…...

rust持续学习 get_or_insert_with

通常使用一个值 if(xnull)xsome_valid_value 忽然今天看见一段代码 pub fn get_id() -> u64 { let mut res struct.data.borrow_mut(); *res.get_or_insert_with(||{let mut xx ...... some logiclet id xx.id; id}); }感觉这个名字蛮奇怪的 insert 然后翻了一下代码&a…...

卡尔曼滤波 | Matlab实现无迹kalman滤波仿真

文章目录 效果一览文章概述研究内容程序设计参考资料效果一览 文章概述 卡尔曼滤波 | Matlab实现无迹kalman滤波仿真 研究内容 无迹kalman滤波(UKF)不是采用的将非线性函数线性化的做法。无迹kalman仍然采用的是线性kalman滤波的架构,对于一步预测方程,使用无迹变换(UT)来…...

C++---list常用接口和模拟实现

list---模拟实现 list的简介list函数的使用构造函数迭代器的使用list的capacitylist element accesslist modifiers list的模拟实现构造函数&#xff0c;拷贝构造函数和迭代器begin和endinsert和eraseclear和析构函数 源码 list的简介 list是用双向带头联表实现的一个容器&…...

[openCV]基于赛道追踪的智能车巡线方案V1

import cv2 as cv import os import numpy as npimport time# 遍历文件夹函数 def getFileList(dir, Filelist, extNone):"""获取文件夹及其子文件夹中文件列表输入 dir&#xff1a;文件夹根目录输入 ext: 扩展名返回&#xff1a; 文件路径列表""&quo…...

SpringIoc-个人学习笔记

Spring的Ioc、DI、AOP思想 Ioc Ioc思想&#xff1a;Inversion of Control&#xff0c;控制反转&#xff0c;在创建Bean的权利反转给第三方 DI DI思想&#xff1a;Dependency Injection&#xff0c;依赖注入&#xff0c;强调Bean之间的关系&#xff0c;这种关系由第三方负责去设…...

【一文搞懂泛型】

3.3泛型 3.3.1泛型出现的背景 泛型出现的背景有两点&#xff1a; 第一点是在集合容器中&#xff0c;如果没有指定对应类型的话&#xff0c;那么底层的元素就是object&#xff0c;要对容器中的元素进行存取的时候&#xff0c;取出来的同时需要进行类型转换&#xff0c;如果有…...

概念解析 | 利用MIMO雷达技术实现高性能目标检测的关键技术解析

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:MIMO雷达目标检测技术 参考资料:何子述, 程子扬, 李军, 等. 集中式 MIMO 雷达研究综述[J]. 雷达学报, 2022, 11(5): 805-829. 利用MIMO雷达技术实现高性能目标检测的关键技术解…...

Grafana制作图表-自定义Flink监控图表

简要 有时候我们在官网的Grafana下载的图表是这样的&#xff0c;如下图 #算子的处理时间&#xff0c;就是处理数据的延迟数据抓取&#xff0c;这个的说明看下下面的文章 metrics.latency.interval: 60 metrics.reporter.promgateway.class: org.apache.flink.metrics.prometh…...

【TypeScript】初识TypeScript和变量类型介绍

TypeScript 1&#xff0c;TypeScript是什么?2&#xff0c;类型的缺失带来的影响3&#xff0c;Ts搭建环境-本博主有专门的文章专说明这个4&#xff0c;使用tsc对ts文件进行编译5&#xff0c;TS运行初体验简化Ts运行步骤解决方案1解决方案2&#xff08;常见&#xff09; 开始学习…...

阿里云瑶池 PolarDB 开源官网焕新升级上线

导读近日&#xff0c;阿里云开源云原生数据库 PolarDB 官方网站全新升级上线。作为 PolarDB 开源项目与开发者、生态伙伴、用户沟通的平台&#xff0c;将以开放、共享、促进交流为宗旨&#xff0c;打造开放多元的环境&#xff0c;以实现共享共赢的目标。 立即体验全新官网&…...

泡水书为什么不能再出售

近日&#xff0c;京津冀持续强降雨&#xff0c;多家出版机构位于涿州等地的图书库房受到影响。 中图网11日发文称&#xff0c;其位于涿州的仓储中心被洪水淹了&#xff0c;一库房有400多万册的书籍。 网友纷纷在文章下暖心留言&#xff1a;注意人身安全&#xff0c;泡水的书也…...

Mac 执行 .sh命令报错 command not found

使用终端执行.sh命令&#xff0c;可输入&#xff1a; ./FileName.sh如果提示 Permission denied 权限不足&#xff0c;可增加sudo&#xff0c;命令如下&#xff1a; sudo ./FileName.sh如果提示 command not found 可以这样: chmod ux *.sh sudo ./FileName.sh...

postgresql 使用之 存储架构 触摸真实数据的存储结构以及组织形式,存入数据库的数据原来在这里

存储架构 ​专栏内容&#xff1a; postgresql内核源码分析 手写数据库toadb 并发编程 个人主页&#xff1a;我的主页 座右铭&#xff1a;天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物. 概述 postgresql 数据库服务运行时&#xff0c;数据在磁…...

Node.Js安装与配置教程

目录 1.下载官网 2.选择安装路径 3.添加环境变量 4.验证是否安装成功 5.修改模块下载位置 (1)查看npm默认存放位置 6.在node.js安装目录下&#xff0c;创建两个文件夹 7.修改默认文件夹 8.测试默认位置是否更改成功 9.安装报错解决办法 10.路径未更改成功解决办法 …...

Element-Plus DatePicker获取时间戳

文章目录 0、先上答案1、渔&#xff1f;1-1 Element-Plus 官网1-2 溯源 Day.js 0、先上答案 <!-- 秒 --><el-date-pickerv-model"timeStamp"type"datetime"value-format"X"/><!-- 毫秒 --><el-date-pickerv-model"tim…...

【算法第十五天7.29】513.找树左下角的值 112. 路径总和 106.从中序与后序遍历序列构造二叉树

链接力扣513-找树左下角的值 思路 class Solution {public int findBottomLeftValue(TreeNode root) {Queue<TreeNode> queue new LinkedList<>();queue.offer(root);int res 0;while(!queue.isEmpty()){int size queue.size();for(int i 0; i < size; i)…...