Spring Boot实践三 --数据库
一,使用JdbcTemplate访问MySQL数据库
1,确认本地已正确安装mysql
- 按【win+r】快捷键打开运行;
- 输入services.msc,点击【确定】;
- 在打开的服务列表中查找mysql服务,如果没有mysql服务,说明本机没有安装mysql,按如下方式进行安装:
(1)点击mysql安装包下载链接:https://dev.mysql.com/downloads/mysql/,点击直接下载即可;
(2)解压后,在bin目录同级下创建一个文件,命名为my.ini

内容如下:
[mysqld]
# 设置3306端口
port=3306
# 设置mysql的安装目录 ---这里输入你安装的文件路径----
basedir=D:\mysql\mysql_install
# 设置mysql数据库的数据的存放目录
datadir=D:\mysql\data
# 允许最大连接数
max_connections=200
# 允许连接失败的次数。
max_connect_errors=10
# 服务端使用的字符集默认为utf8
character-set-server=utf8
# 创建新表时将使用的默认存储引擎
default-storage-engine=INNODB
# 默认使用“mysql_native_password”插件认证
#mysql_native_password
default_authentication_plugin=mysql_native_password
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[client]
# 设置mysql客户端连接服务端时默认使用的端口
port=3306
default-character-set=utf8
(3) 打开cmd进入mysql的bin文件下(D:\mysql\mysql-8.0.16-winx64),执行命令:
mysqld --initialize --console

注意:安装mysql 安装完成后Mysql会有一个随机初始密码,一定要保存!
如果exe安装时有设置密码,那就用那个密码。
(4)接下来执行以下命令:
// 执行mysql安装
mysqld --install mysql// 使用命令提示符启动MySQL服务
net start mysql//进入mysql,回车后输入上面安装时保存的初始密码
mysql -uroot -p//修改密码为1234
ALTER USER 'root'@'localhost' IDENTIFIED BY '1234';// 查看MySQL服务状态
status//quit退出mysql后用以下命令也可以查询:
mysql -u root -p -e"status;"
(5)配置环境变量:

2,配置IDEA访问MySQL数据库:
1,打开cmd,进入mysql的bin目录,执行以下命令创建数据库:
//进入mysql的bin目录
D:
cd mysql\mysql-8.0.16-winx64\bin//登录mysql,注意-p后面无空格
mysql -uroot -p1234// 创建 mydatabasecreate database mydatabase;// 查看databasesshow databases;// 切换到mydatabaseuse mydatabase;// 创建table `t_user`, 有id、username和password三项CREATE TABLE `t_user` (`id` int NOT NULL AUTO_INCREMENT COMMENT '用户id',`username` varchar(100) DEFAULT NULL,`password` varchar(100) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表';//查看tablesshow tables;// 插入一项INSERT INTO t_user VALUES(1,"admin","123456");//查看表内容SELECT * FROM t_user;

2,idea中在pom.xml中加入依赖:
<!-- 添加mysql依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.30</version><scope>runtime</scope><!-- MySQL5.x时,请使用5.x的连接器(cmd执行mysql -V确定)<groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.45</version>--></dependency><!-- 添加jdbc依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><!-- 添加junit依赖 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.20</version></dependency>
3,在src/main/resources/application.properties中配置数据源信息
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase
spring.datasource.username=root
spring.datasource.password=1234
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
//mysql5: spring.datasource.driver-class-name=com.mysql.jdbc.Driver
配置idea连接查看数据库:
(1)View-> Tool Windows -> Database进入:

如果社区版没有Database,搜索 file-settings-plugins,安装Database Navigator也是一样的。通过View-> Tool Windows -> DB Browser进入
(2)在Database视图中点击“+”号创建Mysql:

(3)选择要连接的数据库,Test Connection测试:

(4)打开可以看到对应的表项:

3,使用JdbcTemplate修改MySQL数据库:
新建实体类 如下:
User类:
package com.example.demospringboot;import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
public class User {private int id;private String username;private String password;
}
UserService类:
package com.example.demospringboot;import java.util.List;public interface UserService {/*** 新增一个用户** @param id* @param username* @param password*/public void addUser(int id, String username, String password);/*** 删除一个用户* @param id*/public void delUser(int id);/*** 根据id查询用户** @param id* @return*/List<User> getUserById(int id);/*** 查询全部用户* @return*/public List<User> getUserAll();/*** 删除所有用户*/public int delUserAll();
}
UserServiceImpl类
JDBCTemplate 提供3个操作数据的方法:
execute 直接执行 sql 语句
update 进行新增、修改、删除操作
query 查询操作
package com.example.demospringboot;import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserServiceImpl implements UserService {private JdbcTemplate jdbcTemplate;public UserServiceImpl(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}@Overridepublic void addUser(int id, String username, String password) {String sql = "INSERT INTO t_user VALUES(?,?,?)";jdbcTemplate.update(sql, id, username, password);System.out.println(id + " " + username + " " + password);}@Overridepublic void delUser(int id) {String sql = "delete from t_user where id=?";jdbcTemplate.update(sql, id);}@Overridepublic List<User> getUserById(int id) {String sql = "select ID, USERNAME, PASSWORD from t_user where id = ?";List<User> users = jdbcTemplate.query(sql, (resultSet, i) -> {User user = new User();user.setId(resultSet.getInt("ID"));user.setUsername(resultSet.getString("USERNAME"));user.setPassword(resultSet.getString("PASSWORD"));return user;}, id);return users;}@Overridepublic List<User> getUserAll() {String sql = "select * from t_user";return jdbcTemplate.query(sql, new BeanPropertyRowMapper(User.class));}@Overridepublic int delUserAll() {return jdbcTemplate.update("delete from t_user");}
}
test用例:
package com.example.demospringboot;import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.util.List;@RunWith(SpringRunner.class)
@SpringBootTest
public class DemospringbootApplicationTests {@Autowiredprivate UserService userService;@Beforepublic void setUp() {// 准备,清空user表userService.delUserAll();}@Testpublic void test() throws Exception {// 插入5个用户userService.addUser(1, "Tom", "1000");userService.addUser(2, "Mike", "1111");userService.addUser(3, "Didispace", "3000");userService.addUser(4, "Oscar", "2111");userService.addUser(5, "Linda", "1711");// 查询id为4的用户,判断名字是否为OscarList<User> userList = userService.getUserById(4);Assert.assertEquals("Oscar", userList.get(0).getUsername());// 查数据库,应该有5个用户Assert.assertEquals(5, userService.getUserAll().size());// 删除两个用户userService.delUser(2);userService.delUser(3);// 查数据库,应该有3个用户Assert.assertEquals(3, userService.getUserAll().size());}
}
执行用例成功,查看数据库符合预期:

添加控制器 UserController :
package com.example.demospringboot;import lombok.extern.log4j.Log4j2;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
@RequestMapping("/user")
@Log4j2
public class UserController {private JdbcTemplate jdbcTemplate;@Autowiredpublic void setJdbcTemplate(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}// 返回所有用户@GetMapping("/get")public List<User> getUserAll() {String sql = "SELECT id,username,password FROM t_user";return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));}/*** 添加用户*/@GetMapping("/add")public void addUser() {String sql = "INSERT INTO t_user VALUES(?,?,?)";int row = jdbcTemplate.update(sql,10, "Jacky", "123456");log.info("保存用户成功!保存个数: " + row);}
}
打开页面:
http://localhost:8080/user/add
http://localhost:8080/user/get
回显如下:
[{"id":1,"username":"Tom","password":"1000"},{"id":4,"username":"Oscar","password":"2111"},{"id":5,"username":"Linda","password":"1711"},{"id":10,"username":"Jacky","password":"123456"}]
总结
关于Spring所提供的JdbcTemplate的用法就是这些,Spring集成JdbcTemplate的方法也是比较简单的,整体就是先引入依赖,在配置数据库的连接,然后使用jdbcTemplate这个类就可以了,JdbcTemplate 类中就已经封装了大部分对于数据库的操作。
简单是简单,但是这个框架在企业级项目中应用是比较少的,一般用于对于操作数据库的要求不高的项目,因为他就是对jdbc的简单封装,所有的sql都是写入到代码中,维护性差,看起来也比较乱。后边我们会继续介绍比较主流的DAO层框架Mybatis和JPA的用法。希望本篇文章对大家有所帮助。
问题记录
1,编译运行报错如下:
Description: Parameter 0 of constructor in com.example.DemoSpringBoot.UserServiceImpl required a bean of type 'org.springframework.jdbc.core.JdbcTemplate' that could not be found
解决方案:
(1)推荐依赖spring-boot-starter-jdbc, 而不是spring-jdbc
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency>
(2)引入Druid依赖,阿里巴巴所提供的数据源
<!-- 引入Druid依赖,阿里巴巴所提供的数据源 --><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.13</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency>
appliction.properties:
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
2,当进行需要连接数据库的操作时,控制台会报下面这种红色警报:
Sat Jul 09 14:57:03 CST 2022 WARN: Establishing SSL connection without server's identity verification is not recommended. According to MySQL 5.5.45+, 5.6.26+ and 5.7.6+ requirements SSL connection must be established by default if explicit option isn't set. For compliance with existing applications not using SSL the verifyServerCertificate property is set to 'false'. You need either to explicitly disable SSL by setting useSSL=false, or set useSSL=true and provide truststore for server certificate verification.
解决方法 1 :在配置文件中的连接数据库的URL后面添加 useSSL=false
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase?useSSL=false
方案二:可能是连接数据库的驱动版本问题(5.1.46),更换成其他版本即可。
<groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.46</version>
</dependency>
调整为
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.0.8</version>
</dependency>
3,报错:Web server failed to start. Port 8080 was already in use.
cmd命令如下:

参考:https://blog.didispace.com/spring-boot-learning-21-3-1/
使用MyBatis访问MySQL
参考:https://blog.didispace.com/spring-boot-learning-21-3-5/
使用Spring Data JPA访问MySQL
在之前,我们使用JDBC或是Mybatis来操作数据,通过直接编写对应的SQL语句来实现数据访问,然而当我们有一定的开发经验之后,不难发现,在实际开发过程中,对数据库的操作大多可以归结为:“增删改查”。为了解决这些大量枯燥的数据操作语句,诞生了非常多的优秀框架,比如:JPA规范的框架一般最常用的Hibernate。
JPA(Java Persistence API)和JDBC类似,也是官方定义的一组接口,但是它相比传统的JDBC,它是为了实现ORM而生的,即Object-Relationl Mapping,它的作用是在关系型数据库和对象之间形成一个映射,这样,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道,只要像平时操作对象一样操作它就可以了。
而实现JPA规范的框架一般最常用的就是Hibernate,它是一个重量级框架,学习难度相比Mybatis也更高一些,而SpringDataJPA也是采用Hibernate框架作为底层实现,并对其加以封装。
参考:https://blog.didispace.com/spring-boot-learning-21-3-4/
相关文章:
Spring Boot实践三 --数据库
一,使用JdbcTemplate访问MySQL数据库 1,确认本地已正确安装mysql 按【winr】快捷键打开运行;输入services.msc,点击【确定】;在打开的服务列表中查找mysql服务,如果没有mysql服务,说明本机没有…...
分布式锁漫谈
简单解释一下个人理解的分布式锁以及主要的实现手段。 文章目录 什么是分布式锁常用分布式锁实现 什么是分布式锁 以java应用举例,如果是单应用的情况下,我们通常使用synchronized或者lock进行线程锁,主要为了解决多线程或者高并发场景下的共…...
mac 安装 php 与 hyperf 框架依赖的扩展并启动 gptlink 项目
m系列 mac 安装 php 与 hyperf 框架依赖的扩展并启动 gptlink 项目 gptlink 项目是一个前后端一体化的 chatgpt 开源项目 gptlink 项目地址:https://github.com/gptlink/gptlink 安装 php 8.0 版本: brew install php8.0安装完成后提示如下ÿ…...
ansible中run_once的详细介绍和使用说明
在Ansible中,run_once是一个用于控制任务在主机组中只执行一次的关键字参数。当我们在编写Ansible任务时,有时候我们希望某个任务只在主机组中的某个主机上执行一次,而不是在每个主机上都执行。 以下是run_once参数的详细说明和用法…...
短视频矩阵系统源码开发流程
一、视频矩阵系统源码开发流程分为以下几个步骤: 四、技术开发说明: 产品原型PRD需求文档产品交互流程图部署方式说明完整源代码源码编译方式说明三方框架和SDK使用情况说明和代码位置平台操作文档程序架构文档 一、抖音SEO矩阵系统源码开发流程分为以…...
vite+vue3 css scss PC移动布局自适应
1. 安装 postcss-pxtorem 和 autoprefixer npm install postcss-pxtorem autoprefixer --save2. vite.config.js引入并配置 import postCssPxToRem from postcss-pxtorem import autoprefixer from autoprefixerexport default defineConfig({base: ./,resolve: {alias},plug…...
BLE配对和绑定
参考:一篇文章带你解读蓝牙配对绑定 参考:BLE安全之SM剖析(1) 参考:BLE安全之SM剖析(2) 参考:BLE安全之SM剖析(3) 目录 前言基本概念解读Paring(配对)Bonding(绑定)STK短期秘钥、LTK长期秘钥等 …...
无涯教程-jQuery - html( val )方法函数
html(val)方法设置每个匹配元素的html内容。此属性在XML文档上不可用。 html( val ) - 语法 selector.html( val ) 这是此方法使用的所有参数的描述- val - 这是要设置的html内容。 html( val ) - 示例 以下是一个简单的示例,简单说明了此方法的用法- <…...
【单链表OJ题:删除链表中等于给定值 val 的所有节点】
1.删除链表中等于给定值 val 的所有节点 题目来源 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val val 的节点,并返回 新的头节点 。 /*** Definition for singly-linked list.* struct ListNode {* int val;* s…...
vue element ui web端引入百度地图,并获取经纬度
最近接到一个新需要,要求如下: 当我点击选择地址时,弹出百度地图, 效果如下图: 实现方法: 1、首先要在百度地图开放平台去申请一个账号和key 2、申请好之后,在项目的index.html中引入 3、…...
25.10 matlab里面的10中优化方法介绍—— 函数fmincon(matlab程序)
1.简述 关于非线性规划 非线性规划问题是指目标函数或者约束条件中包含非线性函数的规划问题。 前面我们学到的线性规划更多的是理想状况或者说只有在习题中,为了便于我们理解,引导我们进入规划模型的一种情况。相比之下,非线性规划会更加贴近…...
赛效:如何将PDF文件免费转换成Word文档
1:在网页上打开wdashi,默认进入PDF转Word页面,点击中间的上传文件图标。 2:将PDF文件添加上去之后,点击右下角的“开始转换”。 3:稍等片刻转换成功后,点击绿色的“立即下载”按钮,将…...
java 8 的Stream API
Java 8中引入了Stream API,它是一种处理集合数据的新方式,可以用来处理集合中的元素。Stream API通过提供一组函数式接口和方法,可以使集合的处理更加简洁、高效和易读。 Stream API的主要特点如下: 延迟执行:Stream …...
TypeChat,用TypeScript快速接入AI大语言模型
TypeChat是C# 和 TypeScript 之父 Anders Hejlsberg全新的开源项目。使用AI在自然语言和应用程序和API之间建立桥梁,并且使用TypeScript。 现在出现了很多大型语言模型,但是如何将这些模型最好地集成到现有的应用程序中,如何使用人工智能来接…...
Dcoker compose单机容器集群编排管理
目录 一、概述 二、compose 部署 lnmp 1.Docker Compose 环境安装 2.YAML 文件格式及编写注意事项 3.Docker Compose配置常用字段 4.Docker Compose 常用命令 5. 配置lnmp集群依赖文件 6.修改docker-compose.yml文件 7.根据yml文件创建lnmp容器 一、概述 Docker compos…...
P5635 【CSGRound1】天下第一(记忆化搜索)
用short类型二维数组防止MLE。这里用的记忆化搜索,如果f[x][y]已经有值了,直接返回这个值。判断error的方法:如果下一次又访问到它,说明出现了循环,这样是永远%不到0的,所以,第一次访问一次f[x]…...
如何维护你的电脑:提升性能和延长使用寿命
如何维护你的电脑:提升性能和延长使用寿命 😇博主简介:我是一名正在攻读研究生学位的人工智能专业学生,我可以为计算机、人工智能相关本科生和研究生提供排忧解惑的服务。如果您有任何问题或困惑,欢迎随时来交流哦&…...
Docker续集+Docker Compose
目录 Containerd与docker的关系 runCrunC与Containerd的关联 OCI协议Dockerfile多阶段构建(解决:如何让一个镜像变得更小 )多阶段构建Images瘦身实践.dockerignore Docker Compose快速开始Quick StartCompose 命令常用命令命令说明 Compose 模…...
k8s deployment(k8s经典版)|PetaExpress
Deployment是什么? Deployment是指在软件开发中将应用程序或系统部署到目标环境中的过程。它包括将代码编译、配置、打包并安装到目标服务器或设备上的步骤。k8s deployment是(k8s经典版)中用来管理发布的控制器,在开发的过程中使…...
uni-app如何生成正式的APK
第一步: 进入dcloud官网https://dcloud.io/,点击开发者后台进入登录注册页面 第二步:登录之后跳到项目列表,选择自己想要打包的项目 点击进去如果没有生成证书,点击生成证书,如果显示证书已生成就不用管了…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
Admin.Net中的消息通信SignalR解释
定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...
ESP32读取DHT11温湿度数据
芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...
Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)
引言:为什么 Eureka 依然是存量系统的核心? 尽管 Nacos 等新注册中心崛起,但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制,是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
