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

news2025/2/25 16:21:55

目录

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 = InnoDB
  AUTO_INCREMENT = 1
  DEFAULT 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 {
    @Resource
    private JdbcTemplate jdbcTemplate;
    @Resource
    private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

    @Override
    public int addUser(User user) {
        String sql = "INSERT into `user` (`user`.user_name,`user`.`status`) VALUES(?,?);";
        return jdbcTemplate.update(sql, user.getUserName(), user.getStatus());
    }

    @Override
    public int update(User user) {
        String sql = "UPDATE `user` SET status=? WHERE user_name=?;";
        return jdbcTemplate.update(sql, user.getStatus(), user.getUserName());
    }

    @Override
    public int delete(User user) {
        String sql = "DELETE FROM `user` where user_name=?;";
        return jdbcTemplate.update(sql, user.getUserName());
    }

    @Override
    public int count(User user) {
        String sql = "SELECT COUNT(*) FROM `user` where `status`=?;";
        return jdbcTemplate.queryForObject(sql, Integer.class, user.getStatus());
    }

    @Override
    public List<User> getList(User user) {
        String sql = "SELECT * FROM `user` where `status`=?;";
        return jdbcTemplate.query(sql, new BeanPropertyRowMapper<User>(User.class), user.getStatus());
    }

    @Override
    public User getUser(User user) {
        String sql = "SELECT * FROM `user` where `user_id`=?;";
        return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class), user.getStatus());
    }

    @Override
    public 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 {
    @Resource
    private UserDao userDao;
    @Override
    public int addUser(User user){
        return userDao.addUser(user);
    }

    @Override
    public int updateUser(User user){
        return userDao.update(user);
    }

    @Override
    public int deleteUser(User user) {
        return userDao.delete(user);
    }

    @Override
    public int countUser(User user) {
        return userDao.count(user);
    }

    @Override
    public List<User> getList(User user) {
        return userDao.getList(user);
    }

    @Override
    public User getUser(User user) {
        return userDao.getUser(user);
    }

    @Override
    public void batchAddUser(List<Object[]> batchArgs) {
        userDao.batchAddUser(batchArgs);

    }
}

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

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

@Resource
    private JdbcTemplate jdbcTemplate;
    @Autowired
    UserService userService;
    @Test
    void 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.coloradmin.cn/o/842679.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

今天面了一个来字节要求月薪24K,明显感觉他背了很多面试题...

最近有朋友去字节面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…

4.DNS和负载均衡

文章目录 coreDNS概念部署croeDNS测试 kubernetes多master集群结构master节点部署 负载均衡配置部署nginx做四层反向代理安装高可用 keepalivednginx监控脚本修改k8s中组件的配置文件 coreDNS 概念 coreDNS是kubernetes的默认DNS实现。可以为集群中的service资源创建一个资源名…

ThinkPHP6企业OA办公系统

有需要请加文章底部Q哦 可远程调试 ThinkPHP6企业OA办公系统 一 介绍 勾股OA基于ThinkPHP6开发&#xff0c;前端Layui&#xff0c;数据库mysql&#xff0c;是一款实用的企业办公系统。可多角色登录&#xff0c;集成了系统设置、人事管理、消息管理、审批管理、日常办公、客户…

构建器/建造者/构建者模式(C++)

定义 将一个复杂对象的构建与其表示相分离,使得同样的构建过程(稳定)可以创建不同的表示(变化)。 应用场景 在软件系统中&#xff0c;有时候面临着“一个复杂对象”的创建工作&#xff0c;其通常由各个部分的子对象用一定的算法构成;由于需求的变化&#xff0c;这个复杂对象…

Homer:一个简单的静态主页

什么是 Homer ? Homer 是一个完全静态的 html/js 仪表板&#xff0c;基于一个简单的 yaml 配置文件。它旨在由 HTTP 服务器提供服务&#xff0c;如果您直接通过 file:// 协议打开 index.html&#xff0c;它将无法工作。 安装 在群晖上以 Docker 方式安装。 在注册表中搜索 h…

RISC-V基础之函数调用(四)非叶函数调用(包含实例)

叶函数是指不调用其他函数&#xff0c;也不改变任何非易失性寄存器的函数2。叶函数通常是一些简单的操作&#xff0c;如数学运算或逻辑判断。叶函数的特点是可以通过模拟返回来展开&#xff0c;即不需要保存或恢复寄存器的状态。 非叶函数是指调用其他函数或改变非易失性寄存器…

百度智能云“千帆大模型平台”升级:大模型最多,Prompt模板最全

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

Rust 原生支持龙架构指令集

导读近日&#xff0c;Rust 开源社区发布 1.71.0 版本&#xff0c;实现对龙架构&#xff08;LoongArch&#xff09;指令集的原生支持。 龙架构操作系统发行版和开发者可基于上游社区源代码构建或直接下载 Rust 开源社区发布的龙架构二进制版本。Rust 开发者将在龙架构平台上获得…

【Vue】Parsing error: No Babel config file detected for ... vue

报错 Parsing error: No Babel config file detected for E:\Study\Vue网站\实现防篡改的水印\demo02\src\App.vue. Either disable config file checking with requireConfigFile: false, or configure Babel so that it can find the config files.             …

23年电赛D题-信号调制方式识别与参数估计装置

红叶何时落水 题目 题目分析 该题目的是制作一个信号检测以及解调装置 主要的任务有三个 1.六种信号的识别 2.信号相关参数的测量 3.信号解调 任务一 识别信号有很多思路&#xff0c;最简单的方式便是通过对信号进行FFT分析&#xff0c;分析其中的各个谐波的特征值。 …

自动化测试CSS元素定位

目录 1.1 CSS定位 1.1.1 绝对路径定位 1.1.2 相对路径定位 1.1.3 类名定位 1.1.4 属性定位 1.1.4.1 ID属性定位 1.1.4.2 其他属性定位 1.1.4.3 模糊属性定位 1.1.5 子页面元素查找 1.1.6 伪类定位 1.1 CSS伪类 1.1 CSS定位 1.1.1 绝对路径定位 目标 查找第一个文…

CS 144 Lab Seven -- putting it all together

CS 144 Lab Seven -- putting it all together 引言测试lab7.ccUDPSocketNetworkInterfaceAdapterTCPSocketLab7main方法子线程 小结 对应课程视频: 【计算机网络】 斯坦福大学CS144课程 Lab Six 对应的PDF: Checkpoint 6: putting it all together 引言 本实验无需进行任何编…

HubSpot网页设计神器,你想要的Landing Page都在这里!

在当今数字化时代&#xff0c;Landing Page&#xff08;落地页&#xff09;已成为营销策略中不可或缺的一环。它是与潜在客户首次接触的窗口&#xff0c;能够直接影响转化率和销售结果。而作为一款领先的营销自动化工具&#xff0c;HubSpot为企业提供了打造引人注目的Landing P…

uniapp微信小程序 401时重复弹出登录弹框问题

APP.vue 登陆成功后&#xff0c;保存登陆信息 if (res.code 200) {uni.setStorageSync(loginResult, res)uni.setStorageSync(token, res.token);uni.setStorageSync(login,false);uni.navigateTo({url: "/pages/learning/learning"}) }退出登录 toLogout: func…

Spring Cloud 的版本和SpringBoot的版本

Spring Cloud 的版本选择 Spring Cloud 和SpringBoot的版本存在对应关系 Spring Cloud 的版本和SpringBoot的版本&#xff0c;存在对应关系。最新的SpringCloud版本&#xff08;发布文章时为2022.0.3&#xff09;&#xff0c;需要SpringBoot&#xff08;3.0.9&#xff09; 的…

爬虫获取电影数据----以沈腾参演电影为例

数据可视化&分析实战 1.1 沈腾参演电影数据获取 文章目录 数据可视化&分析实战前言1. 网页分析2. 构建数据获取函数2.1 网页数据获取函数2.2 网页照片获取函数 3. 获取参演影视作品基本数据4. 电影详细数据获取4.1 导演、演员、描述、类型、投票人数、评分信息、电影海…

【云原生】Docker-compose中所有模块学习

compose模块 模板文件是使用 Compose 的核心&#xff0c;涉及到的指令关键字也比较多。但大家不用担心&#xff0c;这里面大部分指令跟 docker run 相关参数的含义都是类似的。 默认的模板文件名称为 docker-compose.yml&#xff0c;格式为 YAML 格式。 version: "3&quo…

STM32基础入门学习笔记:内部高级功能应用

文章目录&#xff1a; 一&#xff1a;低功耗模式 1.睡眠模式测试程序 NVIC.h NVIC.c key.h key.c main.c 2.停机模式测试程序 main.c 3.待机模式测试程序 main.c 二&#xff1a;看门狗 1.独立看门狗测试程序 iwdg.h iwdg.c main.c 2.窗口看门狗测试程序 wwdg…

Unity面板究极优化

首先对于大项目来说UI首选一定的UGUI&#xff0c;目前没有啥可选的余地。多一点都是对性能的负担&#xff0c;UGUI底层基于多线程技术&#xff0c;可以有效分担压力&#xff0c;对于一些不是那么重的面板几乎无感。 无论其他面板只是在此基础上修改的&#xff0c;但每多一层&am…

机器学习---监督学习和非监督学习

根据训练期间接受的监督数量和监督类型&#xff0c;可以将机器学习分为以下四种类型&#xff1a;监督学习、非监督学习、半监督学习和强化学习。 监督学习 在监督学习中&#xff0c;提供给算法的包含所需解决方案的训练数据&#xff0c;成为标签或标记。 简单地说&#xff0c;…