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的自动化配置和简化开发极大地提高了开发效率,希望大家能有所收获。如本文有不妥之处,欢迎大家评论区点赞留言转发~

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/80153.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

人类与机器的分类不同

分类能力也是智能的重要标识之一。通过分类&#xff0c;我们可以将事物或概念进行归类和组织&#xff0c;从而更好地理解和处理信息。分类在人类认知和智能发展中起到了重要的作用&#xff0c;它有助于我们对世界进行认知、记忆、推理和决策。在机器智能领域&#xff0c;分类同…

在WebStorm中通过live-server插件搭建Ajax运行环境

1.下载node.js 官网: https://nodejs.cn/download/ 2.配置Node.js的HTTPS 使用淘宝的镜像&#xff1a; npm config set registry https://registry.npm.taobao.org 也可以使用cnpm npm install -g cnpm --registryhttps://registry.npm.taobao.org 配置之后可以验证是否成…

Windows安装子系统Linux

Windows安装子系统(Linux ubuntu&#xff09; 安装条件步骤1.安装WSL命令2.设置Linux用户名和密码3.写个简单的.c程序看看4.如何互传文件 安装条件 Windows 10版本2004及更高的版本才能安装。 步骤 1.安装WSL命令 我们可以使用WSL来安装子系统 Linux ubuntu(默认是这个)。 …

Docker网络模式详解

目录 Docker网络模式 一、Host模式 二、container模式 三、none模式 四、bridge模式 五、Overlay模式 Docker网络模式 安装Docker时会自动创建3个网络&#xff0c;可以使用docker network ls命令列出这些网络。 [rootdocker ~]# docker network ls 我们在使用docker run…

进程、线程、协程

目录 进程、线程、协程的概念 进程、线程、协程的上下文切换 使用协程的注意事项 协程与线程、进程的区别 进程、线程、协程的概念 进程&#xff1a; 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程…

【雕爷学编程】Arduino动手做(195)---HT16k33 矩阵 8*8点阵屏模块5

37款传感器与模块的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&#x…

HikariDataSource类的作用和使用

HikariDataSource是一个Java数据库连接池的实现&#xff0c;它属于HikariCP连接池库。连接池是一个用于管理数据库连接的工具&#xff0c;它可以帮助优化数据库连接的创建和销毁过程&#xff0c;提高数据库操作的性能和效率。 HikariDataSource类的作用是创建和管理数据库连接…

企业服务器器中了360后缀勒索病毒怎么解决,勒索病毒解密数据恢复

随着网络威胁的增加&#xff0c;企业服务器成为黑客攻击的目标之一。近期&#xff0c;上海某知名律师事务所的数据库遭到了360后缀的勒索病毒攻击&#xff0c;导致企业服务器内的数据库被360后缀勒索病毒加密。许多重要的数据被锁定无法正常读取&#xff0c;严重影响了企业的正…

运维作业—5

一.基于 CentOS 7 构建 LVS-DR 群集 1.配置LVS 2.第一台real server&#xff08;192.168.100.139:80&#xff09; 手工在RS端绑定VIP 手工在RS端抑制ARP响应 3.第二台real server&#xff08;192.168.100.140:80&#xff09; 安装arptables并启动 使用arptables实现抑制 测试…

通向架构师的道路之weblogic与apache的整合与调优

一、BEAWeblogic的历史 BEA WebLogic是用于开发、集成、部署和管理大型分布式Web应用、 网络应用和数据库应 用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的 开发、集成、部署和管理之中。 BEA WebLogic Server拥有处理关键Web应…

webpack性能优化

文章目录 1. 性能优化-分包2. 动态导入3. 自定义分包4. Prefetch和Preload5. CDN加载配置6. CSS的提取7. terser压缩7.1 Terser在webpack中配置7.2 css压缩 8. Tree Shaking 消除未使用的代码8.1 usedExports 配置8.2 sideEffects配置8.3 CSS实现Tree Shaking 9. Scope Hoistin…

Qgis核密度分析

不建议使用Qgis进行核密度分析&#xff0c;建议使用arcgis&#xff0c;arcgis更简单。 arcgis核密度分析 Qgis核密度分析有两种&#xff1a; 法一:符号化&#xff0c;热图。 缺点&#xff1a;使用不方便&#xff0c;只适合看一下效果。 法二&#xff1a;工具栏搜索&#xff…

网络安全预警分类流程

网络安全预警指南 随着信息技术的广泛应用与快速发展&#xff0c;传统业务与信息系统的融合程度不断加深&#xff0c;网络安全对国家政治、经济、文化、公共服务活动的影响进一步增大。网络安全形势日趋复杂&#xff0c;安全威胁不断变化&#xff0c;利用网络漏洞、恶意程序从…

MySQL的索引使用的数据结构,事务知识

一、索引的数据结构&#x1f338; 索引的数据结构&#xff08;非常重要&#xff09; mysql的索引的数据结构&#xff0c;并非定式&#xff01;&#xff01;&#xff01;取决于MySQL使用哪个存储引擎 数据库这块组织数据使用的数据结构是在硬盘上的。我们平时写的代码是存在内存…

【JAVA】数组

⭐ 作者&#xff1a;小胡_不糊涂 &#x1f331; 作者主页&#xff1a;小胡_不糊涂的个人主页 &#x1f4c0; 收录专栏&#xff1a;浅谈Java &#x1f496; 持续更文&#xff0c;关注博主少走弯路&#xff0c;谢谢大家支持 &#x1f496; 数组 1. 数组的基本概念1.1 为什么要使用…

SCT82A30DHKR_5.5V-100V Vin同步降压控制器

SCT82A30是一款100V电压模式控制同步降压控制器&#xff0c;具有线路前馈。40ns受控高压侧MOSFET的最小导通时间支持高转换比&#xff0c;实现从48V输入到低压轨的直接降压转换&#xff0c;降低了系统复杂性和解决方案成本。如果需要&#xff0c;在低至6V的输入电压下降期间&am…

策略模式(Strategy)

策略模式是一种行为设计模式&#xff0c;就是定义一系列算法&#xff0c;然后将每一个算法封装起来&#xff0c;并使它们可相互替换。本模式通过定义一组可相互替换的算法&#xff0c;实现将算法独立于使用它的用户而变化。 Strategy is a behavioral design pattern that def…

解释器模式(Interpreter)

解释器模式是一种行为设计模式&#xff0c;可以解释语言的语法或表达式。给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;然后定义一个解释器&#xff0c;使用该文法来解释语言中的句子。解释器模式提供了评估语言的语法或表达式的方式。 Interpreter is a behav…

基于短信宝API零代码实现短信自动化业务

场景描述&#xff1a; 基于短信宝开放的API能力&#xff0c;实现在特定事件&#xff08;如天气预警&#xff09;或定时自动发送短信&#xff08;本文以定时群发短信为例&#xff09;。通过Aboter平台如何实现呢&#xff1f; 使用方法&#xff1a; 首先创建一个IPaaS流程&…

AssetBundleBrowser导入报错解决方案

第一次导入AssetBundleBrowser遇到报错有 Assets\Scenes\AssetBundles-Browser-master\AssetBundles-Browser-master\Tests\Editor\ABModelTests.cs(13,7): error CS0246: The type or namespace name Boo could not be found (are you missing a using directive or an assem…