【SpringBoot Web框架实战教程】05 Spring Boot 使用 JdbcTemplate 操作数据库
不积跬步,无以至千里;不积小流,无以成江海。大家好,我是闲鹤,微信:xxh_1459,十多年开发、架构经验,先后在华为、迅雷服役过,也在高校从事教学3年;目前已创业了7年多,主要从事物联网/车联网相关领域和业务。喜欢交友、骑行、写毛笔字、弹吉他、折腾硬件和写代码。
导读
这是一系列关于 SpringBoot Web框架实战 的教程,从项目的创建,到一个完整的 web 框架(包括异常处理、拦截器、context 上下文等);从0开始,到一个可以直接运用在生产环境中的web框架,所有源码均开源。
正文
这篇我们再深入学习 Spring Boot 如何来操作数据库。
本篇,我们使用 JdbcTemplate 方式来作为 Spring Boot 连接 数据库(MySQL)的工具。
创建数据库表
-
创建库:
create database app_test; -
创建 user 表:
create table `jdz_user` (`uid` int unsigned not null auto_increment,`name` varchar(64) not null default '',`age` tinyint not null default 0,`addr` varchar(128) not null default '',primary key (`uid`),unique (`name`) )engine = innodb default charset = utf8;
添加依赖
<!--导入JDBC的场景启动器-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency><!--导入数据库驱动-->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId>
</dependency>
增加配置文件
新建文件: app/src/main/resources/application.properties
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/app_test?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC&characterEncoding=utf8
spring.datasource.username=root
spring.datasource.password=# 空闲时,最少的连接池数量
spring.datasource.hikari.minimum-idle=5
注: 1. spring.datasource.url 中,characterEncoding 是规定编码方式,最好加上,否则可能出现中文乱码情况 2. spring.datasource.hikari.minimum-idle 为 HikariPool 数据库连接池最小的与mysql连接数
代码编写
创建实体类
创建与数据表对应的实体类:
package com.jdz.entity;public class User {private Integer uid;private String name;private Integer age;private String addr;
}
创建 DAO
1. 创建 IUserDAO 接口
package com.jdz.dao;import com.jdz.entity.User;import java.util.List;public interface IUserDAO {public boolean doCreate(User user);public User findByUid(Integer uid);public List<User> findAll();
}
2. 创建具体的 DAO 实现
创建 DAO 具体的实现类,并在这层进行数据库操作
package com.jdz.dao.impl;import com.jdz.dao.IUserDAO;
import com.jdz.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;@Repository
public class UserDAOImpl implements IUserDAO {@Autowiredprivate JdbcTemplate jdbcTemplate;@Overridepublic boolean doCreate(User user) {return jdbcTemplate.update("insert into `jdz_user`(`name`, `age`, `addr`) values (?, ?, ?)", user.getName(), user.getAge(), user.getAddr()) > 0;}@Overridepublic boolean doDel(Integer uid) {return jdbcTemplate.update("DELETE from `jdz_user` where uid=?", uid) > 0;}@Overridepublic User findByUid(Integer uid) {try {return jdbcTemplate.queryForObject("select * from `jdz_user` where uid=?", new RowMapper<User>() {@Overridepublic User mapRow(ResultSet rs, int rowNum) throws SQLException {User user = new User();user.setUid(rs.getInt(1));user.setName(rs.getString(2));user.setAge(rs.getInt(3));user.setAddr(rs.getString(4));return user;}}, uid);} catch (EmptyResultDataAccessException e) {return null;}}@Overridepublic List<User> findAll() {return jdbcTemplate.query("SELECT * FROM `jdz_user`", new BeanPropertyRowMapper<User>(User.class));}
}
有几点要注意 1. jdbcTemplate 使用 @Autowired 注解
@Autowired
private JdbcTemplate jdbcTemplate;
-
UserDAOImpl类使用@Repository注解@Repository public class UserDAOImpl implements IUserDAO {} -
在使用
jdbcTemplate.queryForObject,当查询结果为空时,会报异常,所以使用try{}catch(){}进行异常捕获(当然也可以用其他方式替代)
3. 创建 Service
package com.jdz.service;import com.jdz.dao.impl.UserDAOImpl;
import com.jdz.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserService {@Autowiredprivate UserDAOImpl userDAO;public boolean createUser(User user) {return userDAO.doCreate(user);}public boolean delUser(Integer uid) {return userDAO.doDel(uid);}public User getUser(Integer uid) {return userDAO.findByUid(uid);}public List<User> getAll() {return userDAO.findAll();}
}
有几点要注意 1. userDAO 使用 @Autowired 注解 2. UserService 类使用 @Service 注解
4. 创建 controller
package com.jdz.controllers;import com.jdz.entity.User;
import com.jdz.service.UserService;
import com.jdz.util.ErrType;
import com.jdz.util.RtData;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
public class UserController extends BaseController {@Autowiredprivate UserService userService;@RequestMapping("/user/add")public RtData<User> addUser(User user) {if(user.getName() == null || user.getAge() == null || user.getAddr() == null) {return rtJson(ErrType.ERR_PARAMS);}userService.createUser(user);return rtJson(user);}@RequestMapping("/user/info")public RtData<User> info(Integer uid) {return rtJson(userService.getUser(uid));}@RequestMapping("/user/del")public RtData<Boolean> delUser(Integer uid) {return rtJson(userService.delUser(uid));}@RequestMapping("/user/list")public RtData<List<User>> userList() {return rtJson(userService.getAll());}
}
有几点要注意 1. userService 使用 @Autowired 注解 2. 关于 JdbcTemplate 的理解
启动服务后,浏览器访问相应的路由,即可操作数据库中的数据。
这里比较难理解的是,@Autowired 注解,以及相应的字段的初始化过程。(在 spring 启动时,通过 @Autowired ,由 spring 进行初始化)
系列文章
【SpringBoot Web框架实战教程】01 使用 pom 方式创建 SpringBoot 第一个项目
【SpringBoot Web框架实战教程】02 SpringBoot 返回 JSON
【SpringBoot Web框架实战教程】03 SpingBoot 获取 http 请求参数
【SpringBoot Web框架实战教程】04 SpringBoot 规范统一输出 json
近期文章
# 车联网
【自动化运维】不要相信人,把所有的东西都交给机器去处理
从华为无线网络框架说Dispatch服务
百万级物联网框架设计
高并发服务器之泄峰
# 硬件
stm32驱动直流电机实现启动/加速/减速/倒车/停车等功能
stm32 定时器输出比较(OC)与PWM的理解和应用
stm32 定时器中断
STM32 外部中断的理解
相关文章:
【SpringBoot Web框架实战教程】05 Spring Boot 使用 JdbcTemplate 操作数据库
不积跬步,无以至千里;不积小流,无以成江海。大家好,我是闲鹤,微信:xxh_1459,十多年开发、架构经验,先后在华为、迅雷服役过,也在高校从事教学3年;目前已创业了…...
Spark基于DPU的Native引擎算子卸载方案
1.背景介绍 Apache Spark(以下简称Spark)是一个开源的分布式计算框架,由UC Berkeley AMP Lab开发,可用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习&a…...
Mini2440 start.s 修改支持串口输出,方便调试 (四)
经常会遇到点板子的时候,板子没有任何反应!怎么知道板子有没有在正常启动,在uboot阶段 start.s 中加入串口打印信息是很有必要的! 输出串口信息 ***UART:mini-2440-uBoot*** ***UART:mini-2440-uBoot*** ***UART:mini-2440-uBoo…...
【教程】几种不同的RBF神经网络
本站原创文章,转载请说明来自《老饼讲解-机器学习》www.bbbdata.com 目录 一、经典RBF神经网络1.1.经典径向基神经网络是什么1.2.经典径向基神经网络-代码与示例 二、广义回归神经网络GRNN2.1.广义回归神经网络是什么2.2.广义回归神经网络是什么-代码与示例 三、概率…...
【Liunx-后端开发软件安装】Liunx安装FDFS并整合nginx
【Liunx-后端开发软件安装】Liunx安装nacos 文章中涉及的相关fdfs相关软件安装包请点击下载: https://download.csdn.net/download/weixin_49051190/89471122 一、简介 FastDFS是一个开源的轻量级分布式文件系统,它对文件进行管理,功能包括…...
【Java笔记】Flyway数据库管理工具的基本原理
文章目录 1. 工作流程2. 版本号校验算法3. 锁机制3.1 为什么数据库管理工具需要锁3.2 flyway的锁机制 Reference 最近实习做的几个项目都用到了Flyway来做数据库的版本管理,顺便了解了下基本原理,做个记录。 详细的使用就不写了,网上教程很多…...
国际数字影像产业园创业培训,全面提升创业能力!
国际数字影像产业园作为数字影像产业的创新高地,致力于提供全面的创业支持服务。其中,创业培训作为重要的组成部分,旨在通过系统的课程设置和专业的讲师团队,为创业者提供从基础到进阶的全方位指导,帮助他们在数字影像…...
pyqt5 制作视频剪辑软件,切割视频
该软件用于切割视频,手动选取视频片段的起始帧和结束帧并保存为json文件。gui界面如下:包含快进、快退、暂停等功能, 代码如下: # codingUTF-8 """ theme: pyqt5实现动作起始帧和结束帧的定位,将定位到…...
VUE----通过nvm管理node版本
使用 NVM(Node Version Manager)来管理和切换 Node.js 版本是一个很好的选择。以下是在 苹果电脑macos系统 上使用 NVM 安装和切换 Node.js 版本的步骤: 1. 安装 NVM 如果你还没有安装 NVM,可以按照以下步骤进行安装:…...
R语言进行字符的替换和删减gsub,substr函数
目录 R语言读文件“-“变成“.“ 提取列字符前几个 提取列字符末尾几个 进行字母替换 paste0函数使用 长宽数据转换 R语言读文件“-“变成“.“ R语言读文件“-“变成“.“_r语言 列名中的-变成了点-CSDN博客 怎样将"."还原为"-" rm(list = ls()…...
2024年6月27日,欧盟REACH法规新增第31批1项SVHC高关注物质
ECHA公布第31批1项SVHC,物质已增至241项 2024年6月27日,ECHA公布第31批1项SVHC,总数达241项。新增物质未包括磷酸三苯酯,仍在评议中。REACH法规要求SVHC含量超0.1%需告知下游,出口超1吨须通报ECHA。SCIP通报要求SVHC含…...
高通410-linux棒子设置网络驱动
1.首先打开设备管理器 2.看到其他设备下的RNDIS,右键更新驱动程序 3.点击浏览我的电脑… 最后一个...
PostgreSQL的系统视图pg_stat_archiver
PostgreSQL的系统视图pg_stat_archiver 在 PostgreSQL 数据库中,pg_stat_archiver 视图提供了关于归档进程(archiver process)的统计信息。归档进程负责将 WAL(Write-Ahead Logging)日志文件复制到归档存储࿰…...
【D3.js in Action 3 精译】第一部分 D3.js 基础知识
第一部分 D3.js 基础知识 欢迎来到 D3.js 的世界!可能您已经迫不及待想要构建令人惊叹的数据可视化项目了。我们保证,这一目标很快就能达成!但首先,我们必须确保您已经掌握了 D3.js 的基础知识。这一部分提到的概念将会在您后续的…...
面试经验分享 | 渗透测试工程师(实习岗)
所面试的公司:某安全厂商 所在城市:南京 面试职位:渗透测试工程师实习岗位 面试过程: 腾讯会议(视频) 面试过程:整体流程就是自我介绍加上一些问题问题balabalabala。。。由于面的岗位是渗透…...
STM32 IWDG(独立看门狗)
1 IWDG简介 STM32有两个看门狗:一个是独立看门狗(IWDG),另外一个是窗口看门狗。独立看门狗也称宠物狗,窗口看门狗也称警犬。本文主要分析独立看门狗的功能和它的应用。 独立看门狗用通俗一点的话来解释就是一个12位的…...
ios swift5 获取wifi列表
参考博客: iOS之Wifi开发探究 - 稀土掘金 iOS 无法获取 WiFi 列表?一定是因为你不知道这个框架 - 稀土掘金 iOS获取Wifi列表详解 - 简书...
回溯法c++学习 解决八皇后问题
使用回溯法解决八皇后问题 八皇后问题是一个以国际象棋为背景的问题:如何能够在88 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。这…...
5. Spring IoCDI ★ ✔
5. Spring IoC&DI 1. IoC & DI ⼊⻔1.1 Spring 是什么?★ (Spring 是包含了众多⼯具⽅法的 IoC 容器)1.1.1 什么是容器?1.1.2 什么是 IoC?★ (IoC: Inversion of Control (控制反转))总…...
数据库自动备份到gitee上,实现数据自动化备份
本人有个不太好的习惯,每次项目的数据库都是在线上创建,Navicat 连接线上数据库进行处理,最近有一个项目需要二次升级,发现老项目部署的服务器到期了,完蛋,数据库咩了!!!…...
告别繁琐安装:用快马平台在线IDE实现零配置编程初体验
最近在尝试学习编程时,发现很多新手都会卡在开发环境配置这一步。传统的IDE安装过程不仅耗时,还可能遇到各种环境变量配置问题。作为一个过来人,我想分享一个更简单的解决方案——直接在浏览器里就能完成编程初体验。 为什么需要在线IDE 刚开…...
Blaze分块计算优化技巧:5个方法提升大数据处理性能
Blaze分块计算优化技巧:5个方法提升大数据处理性能 【免费下载链接】blaze NumPy and Pandas interface to Big Data 项目地址: https://gitcode.com/gh_mirrors/bl/blaze Blaze是一个强大的大数据处理工具,它通过分块计算技术为NumPy和Pandas提供…...
RDP Wrapper终极指南:解锁Windows多用户远程桌面完整功能
RDP Wrapper终极指南:解锁Windows多用户远程桌面完整功能 【免费下载链接】rdpwrap RDP Wrapper Library 项目地址: https://gitcode.com/gh_mirrors/rd/rdpwrap RDP Wrapper Library是一个革命性的开源工具,它能够让Windows家庭版用户也能享受到…...
终极AI图像增强神器Upscayl:让每一张照片重获新生
终极AI图像增强神器Upscayl:让每一张照片重获新生 【免费下载链接】upscayl 🆙 Upscayl - Free and Open Source AI Image Upscaler for Linux, MacOS and Windows built with Linux-First philosophy. 项目地址: https://gitcode.com/GitHub_Trending…...
革新3D资源获取:Sketchfab模型下载技术破解与实践指南
革新3D资源获取:Sketchfab模型下载技术破解与实践指南 【免费下载链接】sketchfab sketchfab download userscipt for Tampermonkey by firefox only 项目地址: https://gitcode.com/gh_mirrors/sk/sketchfab 在数字创意产业蓬勃发展的今天,3D模型…...
requests - 简单好用的HTTP请求库
一、什么是requests? requests 是一个用于发送HTTP请求的 Python 库。 它可以帮助你: 轻松发送GET、POST、PUT、DELETE等请求处理Cookie、会话等复杂性自动解压缩内容处理国际化域名和URL 二、应用场景 requests 广泛应用于以下实际场景:…...
提升arduino开发效率:用快马平台一键生成常用工具模块代码
作为一名经常折腾Arduino的开发者,我发现在项目开发中,总有些重复性的代码需要反复编写。最近尝试用InsCode(快马)平台来生成这些常用工具模块,效率提升非常明显。今天就把我的实践心得分享给大家。 I2C设备扫描功能 在连接多个I2C设备时&…...
Cogito-V1-Preview-Llama-3B模型微调(Fine-tuning)数据准备入门教程
Cogito-V1-Preview-Llama-3B模型微调数据准备入门教程 你是不是也对那些能写代码、能聊天的AI模型感到好奇,甚至想自己动手,教一个模型学会你的专属技能?比如,让它帮你写特定风格的文案,或者理解你公司内部的业务文档…...
深度解析LSPosed框架:从Hook原理到模块开发的完整实战指南
深度解析LSPosed框架:从Hook原理到模块开发的完整实战指南 【免费下载链接】LSPosed_mod My changes to LSPosed 项目地址: https://gitcode.com/GitHub_Trending/ls/LSPosed_mod LSPosed框架作为Android系统Hook技术的现代实现,为开发者提供了强…...
mybatis实战进阶:基于快马生成缓存、分页与批量处理等生产级配置
mybatis实战进阶:基于快马生成缓存、分页与批量处理等生产级配置 最近在做一个用户管理系统时,遇到了不少mybatis的性能问题。单表查询还好,一旦涉及关联查询和批量操作,性能瓶颈就特别明显。经过一番摸索,总结出几个…...
