【Spring Boot】Java 的数据库连接模板:JDBCTemplate

Java 的数据库连接模板:JDBCTemplate

  • 1.JDBCTemplate 初识
    • 1.1 JDBC
    • 1.2 JDBCTemplate
  • 2.JDBCTemplate 实现数据的增加、删除、修改和查询
    • 2.1 配置基础依赖
    • 2.2 新建实体类
    • 2.3 操作数据
      • 2.3.1 创建数据表
      • 2.3.2 添加数据
      • 2.3.3 查询数据
      • 2.3.4 查询所有记录
      • 2.3.5 修改数据
      • 2.3.6 删除数据
  • 3.认识 ORM

1.JDBCTemplate 初识

1.1 JDBC

在学习使用 JDBCTemplate 之前,我们先来了解一下 JDBC(Java DataBase Connectivity)。它是 Java 用于连接数据库的规范,也就是用于执行数据库 SQL 语句的 Java API。从 JDBC 的名称上看,它似乎没有指定某种数据库。可以猜想它可以为多种数据库提供统一访问的接口,这更合程序设计的模式。实际上,它由一组用 Java 语言编写的类和接口组成,为大部分 关系型数据库 提供访问接口。

JDBC 需要每次进行数据库连接,然后处理 SQL 语句、传值、关闭数据库。如果都由开发员编写代码,则很容易出错,可能会出现使用完成之后,数据库连接忘记关闭的情况。这容易导致连接被占用而降低性能,为了减少这种可能的错误,减少开发人员的工作量,JDBCtemplate 就被设计出来了。

1.2 JDBCTemplate

JDBCTemplate = JDBC + Template 的组合,是对 JDBC 的封装。它更便于程序实现,替我们完成所有的 JDBC 底层工作。因此,对于数据库的操作,不再需要每次都进行连接、打开、关闭了。现在通过 JDBCTemplate 不需要进行全局修改,就可以轻松地应对开发人员常常要面对的增加删除、修改和查询操作。

🚀 JDBC 和 JDBCTemplate 就像是仓库管理员,负责从仓库(数据库)中存取物品。而后者不需要 “每次进入都开门,取完关门”,因为有电动门自动控制。

2.JDBCTemplate 实现数据的增加、删除、修改和查询

2.1 配置基础依赖

要使用 JDBCTemplate,则需要添加其 Starter 依赖。因为要操作数据库,所以也需要配置数据库(以 MySQL为例)的连接依赖,见以下代码:

<!-- JDBCTemplate 依赖 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- MySQL 数据库依赖 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>

添加完依赖后,还需要配置数据库的连接信息。这样 JDBCTemplate 才能正常连接到数据库在 application.properties 配置文件中配置数据库的地址和用户信息,见以下代码:

spring.datasource.url=jdbc:mysql://127.0.0.1/book?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=true
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

2.2 新建实体类

新建一个测试实体类 User,实现 RowMapper 类,重写 mapRow 方法,以便实体字段和数据表字段映射(对应)。映射是指把 Java 中设置的实体字段和 MySQL 数据库的字段对应起来,因为实体的 id 可以对应数据库字段的 u_id,也可以对应 idname 等。如果不重写,则程序不知道何对应。具体代码如下:

package com.example.demo.model;import lombok.Data;
import org.springframework.jdbc.core.RowMapper;import java.sql.ResultSet;
import java.sql.SQLException;@Data
public class User implements RowMapper<User> {private int id;private String username;private String password;// 必须重写mapRow方法@Overridepublic User mapRow(ResultSet resultSet, int i) throws SQLException {User user = new User();user.setId(resultSet.getInt("id"));user.setUsername(resultSet.getString("username"));user.setPassword(resultSet.getString("password"));return user;}
}

2.3 操作数据

JDBCTemplate 提供了以下操作数据的 3 个方法。

  • execute:表示 执行,用于直接执行 SQL 语句。
  • update:表示 更新,包括新增、修改、删除操作。
  • query:表示 查询

2.3.1 创建数据表

在使用 JDBCTemplate 之前,需要在控制器中注入 JDBCTemplate,然后就可以通过 execute 方法执行 SQL操作了,见以下代码:

@SpringBootTest
@RunWith(SpringRunner.class)
public class UserControllerTest {@Autowiredprivate JdbcTemplate jdbcTemplate;@Test/*** @Description: 创建表*/public void createUserTable() throws Exception {String sql = "CREATE TABLE `user` (\n" +"  `id` int(10) NOT NULL AUTO_INCREMENT,\n" +"  `username` varchar(100) DEFAULT NULL,\n" +"  `password` varchar(100) DEFAULT NULL,\n" +"  PRIMARY KEY (`id`)\n" +") ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;\n" +"\n";jdbcTemplate.execute(sql);}
}

在这里插入图片描述

2.3.2 添加数据

添加数据可以通过 update 方法来执行,见以下代码:

@Test
public void saveUserTest() throws Exception {String sql = "INSERT INTO user (USERNAME,PASSWORD) VALUES ('pipi','666666')";int rows = jdbcTemplate.update(sql);System.out.println(rows);
}

在这里插入图片描述

2.3.3 查询数据

以下代码是根据 name 查询单个记录,执行下面 sql 字符串里的 SQL 语句(SELECT * FROM user WHERE USERNAME = ?)。这里需要通过 query 方法来执行。

@Test
public void getUserByName() throws Exception {String name = "pipi";String sql = "SELECT * FROM user WHERE USERNAME = ?";List<User> list = jdbcTemplate.query(sql, new User(), new Object[]{name});for (User user : list) {System.out.println(user);}
}

运行测试,会在控制台输出如下结果:

在这里插入图片描述

2.3.4 查询所有记录

查询所有记录和查询单个记录一样,也是执行 query 方法。区别是,SQL 语句使用查询通配符 *,见以下代码:

@Test
public void list() throws Exception {String sql = "SELECT * FROM user";List<User> userList = jdbcTemplate.query(sql,new BeanPropertyRowMapper(User.class));for (User userLists : userList) {System.out.println(userLists);}
}

2.3.5 修改数据

要进行数据的修改,可以使用 update 方法来实现,见以下代码:

@Test
public void updateUserPassword() throws Exception {Integer id = 1;String passWord = "999888";String sql = "UPDATE user SET PASSWORD = ? WHERE ID = ?";int rows = jdbcTemplate.update(sql, passWord, id);System.out.println(rows);
}

在这里插入图片描述

2.3.6 删除数据

这里删除数据并不用 DELETE 方法,而是通过 update 方法来执行 SQL 语句中的 DELETE 方法。

@Test
public void deleteUserById() throws Exception {String sql = "DELETE FROM  user  WHERE ID = ?";int rows = jdbcTemplate.update(sql, 1);System.out.println(rows);
}

在这里插入图片描述

至此,已经实现了简单的 增加删除修改查询 功能。如果读者对关系型数据库的 SQL 不陌生,那么实现起来会非常简单。因为 JDBCTemplate 实现起来比 ORM 烦琐,所以大都分发人员使用的是 ORM(JPA 和 MyBatis)。但是 JDBCTemplate 依然有市场,因为学习成本低,会一些 SQL语句就能上手使用,操作虽然麻烦,但很容易学会。

3.认识 ORM

ORM(Object Relation Mapping)是 对象/关系映射。它提供了概念性的、易于理解的数据模型,将数据库中的表和内存中的对象建立映射关系。它是随着面向对象的软件开发方法的发展而产生的,面向对象的开发方法依然是当前主流的开发方法。

对象关系型数据业务实体 的两种表现形式。业务实体在内存中表现为对象,在数据库中表现为关系型数据。内存中的对象不会被永久保存,只有关系型数据库(或 NoSQL 数据库,或文件)中的对象会被永久保存。

对象/关系映射(ORM)系统一般以中间件的形式存在,因为内存中的对象之间存在关联和继承关系,而在数据库中,关系型数据无法直接表达多对多的关联和继承关系。对象、数据库通过 ORM 映射的关系如下图所示。
在这里插入图片描述
目前比较常用的 ORM 是国外非常流行的 JPA 和国内非常流行的 MyBatis。

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

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

相关文章

【ai】tx2 nx:ubuntu18.04 yolov4-triton-tensorrt 成功部署server 运行

isarsoft / yolov4-triton-tensorrt运行发现插件未注册? 【ai】tx2 nx: jetson Triton Inference Server 部署YOLOv4 【ai】tx2 nx: jetson Triton Inference Server 运行YOLOv4 对main 进行了重新构建 【ai】tx2 nx :ubuntu查找NvInfer.h 路径及哪个包、查找符号【ai】tx2…

AES加密算法及AES-CMAC原理白话版系统解析

本文框架 前言1. AES加密理论1.1 不同AES算法区别1.2 加密过程介绍1.2.1 加密模式和填充方案选择1.2.2 密钥扩展1.2.3分组处理1.2.4多轮加密1.2.4.1字节替换1.2.4.2行移位1.2.4.3列混淆1.2.4.4轮密钥加1.3 加密模式1.3.1ECB模式1.3.2CBC模式1.3.3CTR模式1.3.4CFB模式1.3.5 OFB模…

redis 单节点数据如何平滑迁移到集群中

目的 如何把一个redis单节点的数据迁移到 redis集群中 方案&#xff1a; 使用命令redis-cli --cluster import 导入数据至集群 --cluster-from <arg>--cluster-from-user <arg> 数据源用户--cluster-from-pass <arg> 数据源密码--cluster-from-askpass--c…

驾校预约小程序系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学员管理&#xff0c;教练管理&#xff0c;驾校信息管理&#xff0c;驾校车辆管理&#xff0c;教练预约管理&#xff0c;考试信息管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;驾校信息&a…

基于docker安装redis服务

Redis是我们在项目中经常需要使用的缓存数据库&#xff0c;安装redis的方式也有很多&#xff0c;本文主要是给大家讲解如何基于docker进行redis服务的安装&#xff0c;主要介绍&#xff0c;如何拉取redis镜像、如何挂载redis的数据以及使用redis的配置文件和开启认证等功能&…

steam社区载入失败、加载不出来、打不开?

随着steam夏季大促的到来&#xff0c;最近steam在线用户越来越多了&#xff0c;很多玩家在自己喜欢的游戏社区里看最新的玩法、攻略和玩家的游戏心得。不过有不少玩家表示有时候会打不开游戏社区或是社区加载失败等问题。根据大家遇到的问题&#xff0c;这里总结了几种解决方法…

构建现代医疗:互联网医院系统源码与电子处方小程序开发教学

本篇文章&#xff0c;笔者将探讨互联网医院系统的源码结构和电子处方小程序的开发&#xff0c;帮助读者更好地理解和掌握这些前沿技术。 一、互联网医院系统源码结构 互联网医院系统通常由多个模块组成&#xff0c;每个模块负责不同的功能。以下是一个典型的互联网医院系统的主…

基于C语言的Jacobi迭代和Gauss-Seidel迭代的方程组求解实现

文章目录 Jacobi迭代方法介绍Gauss-Seidel迭代方法介绍具体代码实现示例题目实现效果 Jacobi迭代方法介绍 Jacobi迭代法是一种简单的迭代求解方法&#xff0c;适用于严格对角占优矩阵。其基本思想是利用当前迭代步的已知解来更新下一个迭代步的解。在C语言实现中&#xff0c;我…

Textual Learning2 -- 使用时的小问题

1、出现的问题&#xff1a; 在vscode里面直接运行函数会显示报错&#xff1a; 我尝试在vscode中含textual库的环境下运行&#xff0c;但仍然报错 2、解决方案&#xff1a; 在命令行中运行&#xff1a; 首先按winR&#xff0c;输入cmd打开命令行 或在已经安装的conda环境&a…

古人的智慧结晶——水铳:揭秘明清时期的消防神器

明代的《奇器图说》是一本记录了当时各种奇巧机械的著作&#xff0c;而水铳则是书中记载的一项令人惊叹的发明&#xff0c;它不仅展示了古人对物理原理的深刻理解&#xff0c;更是早期消防技术的一个缩影。 水铳&#xff0c;这个名字听起来似乎有些陌生&#xff0c;但在古代&am…

电脑文件kernel32.dll缺失要怎么处理?怎么才能一键修复kernel32.dll文件

关键系统文件kernel32.dll的缺失&#xff0c;这种情况不仅会导致系统运行不稳定&#xff0c;甚至可能完全无法启动某些应用程序。kernel32.dll 是一个至关重要的动态链接库文件&#xff0c;它与Windows操作系统的多个基本操作相关联&#xff0c;包括内存管理、进程和线程的控制…

dledger原理源码分析系列(二)-心跳

简介 dledger是openmessaging的一个组件&#xff0c; raft算法实现&#xff0c;用于分布式日志&#xff0c;本系列分析dledger如何实现raft概念&#xff0c;以及dledger在rocketmq的应用 本系列使用dledger v0.40 本文分析dledger的心跳 关键词 Raft Openmessaging 心跳/…

技术赋能教育:校园3D电子地图与AR导航解决方案

随着高考的落幕&#xff0c;又一批新鲜血液即将注入大学校园。面对陌生的环境&#xff0c;如何快速适应、准确找到目标地点&#xff0c;成为新生们的一大难题。同时&#xff0c;对于学校而言&#xff0c;如何向报考人员直观展示校园环境&#xff0c;提供沉浸式参观体验&#xf…

Mybatis-Plus学习|快速入门CRUD、主键生成策略(雪花算法、主键自增等)、自动填充、乐观锁、分页插件、逻辑删除

MyBatisPlus概述 为什么要学习它呢?MyBatisPlus可以节省我们大量工作时间&#xff0c;所有的CRUD代码它都可以自动化完成! JPA、tk-mapper、MyBatisPlus 偷懒的! MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具&#xff0c;在 MyBatis 的基础上只做增强不做改变&#xff…

Day 48 消息队列集群RabbitMQ

消息队列集群-RabbitMQ 一、消息中间件 中间件 tomcat java web中间件 web容器 mysql php php mysql uwsgi python mysql mycat 数据库中间件 rabbitMQ 消息中间件 1、简介 MQ 全称为&#xff08;Message Queue消息队列&#xff09;。是一种应用程序对应用程序的通信方…

【全球首个开源AI数字人】DUIX数字人-打造你的AI伴侣!

目录 1. 引言1.1 数字人技术的发展背景1.2 DUIX数字人项目的开源意义1.3 DUIX数字人技术的独特价值1.4 本文目的与结构 2. DUIX数字人概述2.1 定义与核心概念2.2 硅基智能与DUIX的关系2.3 技术架构2.4 开源优势2.5 应用场景2.6 安全与合规性 3. DUIX数字人技术特点3.1 开源性与…

【Java Gui精美界面】IDEA安装及配置SwingX

SwingX 是一个基于 Swing 的 Java GUI 库&#xff0c;旨在为 Swing 提供额外的功能和丰富的组件 特点描述基于 Swing继承了 Swing 的所有特性和功能。丰富组件SwingX 提供了一组高级 UI 组件&#xff0c;例如 TreeTable仍在发展中不活跃的发展ing。。。支持搜索高亮如 TreeTab…

【分布式系列】分布式锁的设计与实现

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

steam社区加载异常、加载失败、无法加载、黑屏的解决方法

随着steam夏季特卖的临近&#xff0c;最近几天开启史低折扣的大作已经越来越少了&#xff0c;不过也并不是没有。最经典的知名大作文明6之前已经打到1折的骨折价了&#xff0c;没想到也能背刺&#xff0c;现在是新史低价0.5折11元&#xff0c;很多玩家入手后纷纷前往社区看新手…

ZABBIX-7.0LTS在线部署部署教程

ZABBIX-7.0LTS在线部署部署教程 环境&#xff1a; 操作系统&#xff1a; ubuntu 22.04zabbix-server版本&#xff1a; 7.0LTS系统配置[需结合监控的业务量提供配置]&#xff1a; 建议2C(CPU)8G(运行) 100GB(存储)架构&#xff1a;LNMP 第一步&#xff1a; 系统初始化 1.配置…