pringBoot教程(十) | SpringBoot集成JdbcTemplate

SpringBoot教程(十) | SpringBoot集成JdbcTemplate

1. JdbcTemplate概述

经过了前面的几篇文章,我们几乎讲解完毕了SpringBoot中前端控制器中的一些操作,体验到SpringBoot为我们使用框架所带来的便捷。前面文章中的所有案例,总共只引入了一个 web-starter, 配置也很少。从今天开始,我们来开始研究一下,SpringBoot如何完成数据的持久化操作。

一般持久化的操作都是有一些专门来做持久化的框架来完成的,比如原始一些的JDBC, 老牌劲旅JPA(hibernate), 还有现在用的比较或的mybatis和MybatisPlus, 而SpringBoot中我们也是先要选择要使用的持久层框架,然后使用SpringBoot进行集成。而集成的步骤由于SpringBoot的自动化配置功能而大大简化。

今天我们先来搞个简单点的,先来个JdbcTemplate, 这个是Spring基于Jdbc而封装的一个持久层框架,致力于轻量、便捷地操作数据库。他的操作很简单,但是不如mybatis和jpa功能全面,但是比原生jdbc强点,说实话,实战中用的也比较少。

2. 集成步骤

2.1 引入依赖

xml复制代码<!-- 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>

2.2 配置数据库连接

在SpringBoot的配置文件中,配置数据库的连接,这是所有要操作数据库都必须要进行的配置。主要包含使用的驱动类,数据库的连接地址,用户名密码等。

yml复制代码spring:datasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/springboot_learningusername: rootpassword: root

我在自己的本地数据库里创建一个名字叫springboot_learning的数据库用于测试。

然后我们创建一张user表。

sql复制代码CREATE TABLE `springboot_learning`.`t_user`  (`id` int(20) NOT NULL AUTO_INCREMENT COMMENT 'id',`name` varchar(40) NULL COMMENT '姓名',`age` int(20) NULL COMMENT '年龄',`address` varchar(100) NULL COMMENT '地址',`create_time` datetime(0) NULL COMMENT '创建时间',`update_time` datetime(0) NULL COMMENT '更新时间',PRIMARY KEY (`id`)
);

2.3开发实体和DAO

创建一个entity文件夹,然后创建一个实体类User

java复制代码@Data
public class User {private Integer id;private String name;private Integer age;private String address;private Date createTime;private Date updateTime;}

开发UserDao 包含常用的增删改查接口

UserDao接口

java复制代码/*** @interface: UserDao* @description:* @author: sh.Liu* @date: 2022-01-14 16:37*/
public interface UserDao {/*** 根据id查询* @param id* @return*/User getUserById(Integer id);/*** 查询所有用户* @return*/List<User> listUser();/*** 保存用户* @param user* @return*/int save(User user);/*** 更新用户* @param id* @param user* @return*/int update(Integer id, User user);/*** 删除用户* @param id* @return*/int delete(Integer id);}

UserDaoImpl 实现:在类中注入 JdbcTemplate 接口,这个是spring为我们提供的,用来操作数据库的核心对象。这个类上也要加上 @Repository 注解,用于标识这个类是用来处理数据库操作的。可以被Spring扫描到。

UserDaoImpl代码如下:

java复制代码package com.lsqingfeng.springboot.dao.jdbcTemplate.impl;import com.lsqingfeng.springboot.dao.jdbcTemplate.UserDao;
import com.lsqingfeng.springboot.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;import java.util.Date;
import java.util.List;/*** @className: UserDaoImpl* @description:* @author: sh.Liu* @date: 2022-01-14 16:40*/
@Repository
public class UserDaoImpl implements UserDao {@Autowiredprivate JdbcTemplate jdbcTemplate;@Overridepublic User getUserById(Integer id) {User user  = jdbcTemplate.queryForObject("select * from t_user where id = ?", new BeanPropertyRowMapper<User>(User.class), id);return user;}@Overridepublic List<User> listUser() {List<User> users = jdbcTemplate.query("select * from t_user", new BeanPropertyRowMapper<User>(User.class));return users;}@Overridepublic int save(User user) {return jdbcTemplate.update("insert into t_user(name, age, address, create_time, update_time) values(?, ?, ?,?,?)",user.getName(),user.getAge(), user.getAddress(),new Date(),new Date());}@Overridepublic int update(Integer id, User user) {return jdbcTemplate.update("UPDATE t_user SET name = ? , age = ? ,address = ? ,update_time = ? WHERE id=?",user.getName(), user.getAge(), user.getAddress(), new Date(), id);}@Overridepublic int delete(Integer id) {return jdbcTemplate.update("DELETE from tb_user where id = ? ",id);}
}

我们包装一个Service层,目前主流的项目接口也都是Controller-Service-Dao这样的逻辑。

2.4 Service层开发

创建一个service包,加一个UserService接口。service层中一般用来处理业务逻辑,一般把有事务的代码放到这一层,一般是根据业务模块进行划分,名字可以不与实体名或者表名开发,他里边一般是对多个Dao层操作的封装。想要彻底搞懂Service层也能需要更多项目的历练。这里以演示为主,也没有特别复杂的业务,我们就直接起名UserService.里面就直接把Dao层中的方法全部拿过来。

UserService

java复制代码/*** @interface: UserService* @description:* @author: sh.Liu* @date: 2022-01-17 13:56*/
public interface UserService {/*** 根据id查询* @param id* @return*/User getUserById(Integer id);/*** 查询所有用户* @return*/List<User> listUser();/*** 保存用户* @param user* @return*/int save(User user);/*** 更新用户* @param id* @param user* @return*/int update(Integer id, User user);/*** 删除用户* @param id* @return*/int delete(Integer id);}

实现类中,直接注入Dao ,通过调用Dao实现相同功能。

java复制代码/*** @className: UserServiceImpl* @description:* @author: sh.Liu* @date: 2022-01-17 13:56*/
@Service
public class UserServiceImpl implements UserService {// 这是构造方法注入,相当于 @autowiredprivate final UserDao userDao;public UserServiceImpl(UserDao userDao) {this.userDao = userDao;}@Overridepublic User getUserById(Integer id) {return userDao.getUserById(id);}@Overridepublic List<User> listUser() {return userDao.listUser();}@Overridepublic int save(User user) {return userDao.save(user);}@Overridepublic int update(Integer id, User user) {return userDao.update(id, user);}@Overridepublic int delete(Integer id) {return userDao.delete(id);}
}

2.5 开发Controller进行测试

Dao和Service都已经准备好了,接下来我们就开发一个Controller来进行测试,看看是否可以成功的操作数据库。

java复制代码package com.lsqingfeng.springboot.controller;import com.lsqingfeng.springboot.base.Result;
import com.lsqingfeng.springboot.entity.User;
import com.lsqingfeng.springboot.exception.BizException;
import com.lsqingfeng.springboot.service.UserService;
import org.springframework.web.bind.annotation.*;/*** @className: JdbcController* @description:* @author: sh.Liu* @date: 2022-01-17 13:58*/
@RestController
@RequestMapping("jdbc")
public class JdbcController {/*** 这是构造方法注入,相当于 @autowired*/private final UserService userService;public JdbcController(UserService userService) {this.userService = userService;}@PostMapping("save")public Result save(@RequestBody User user){userService.save(user);return Result.success();}@PostMapping("update")public Result update(@RequestBody User user){if (user.getId() == null) {throw new BizException("更新操作id不能为空");}userService.update(user.getId(), user);return Result.success();}@GetMapping("get/{id}")public Result getById(@PathVariable Integer id){return Result.success(userService.getUserById(id));}@GetMapping("list")public Result list(){return Result.success(userService.listUser());}@GetMapping("delete/{id}")public Result delete(@PathVariable Integer id){userService.delete(id);return Result.success();}
}

我们使用postMan进行测试。注意别忘了传header, 因为咱们的拦截器里要求必须传header

image.png

返回成功,查看数据库中数据:

image.png

数据保存成功。

我们再试试getById方法

image.png

其他的方法就不在演示了。

3. 总结

关于Spring所提供的JdbcTemplate的用法就是这些,Spring集成JdbcTemplate的方法也是比较简单的,整体就是先引入依赖,在配置数据库的连接,然后使用jdbcTemplate这个类就可以了,JdbcTemplate 类中就已经封装了大部分对于数据库的操作。简单是简单,但是这个框架在企业级项目中应用是比较少的,一般用于对于操作数据库的要求不高的项目,因为他就是对jdbc的简单封装,所有的sql都是写入到代码中,维护性差,看起来也比较乱。后边我们会继续介绍比较主流的DAO层框架Mybatis和JPA的用法。希望本篇文章对大家有所帮助。

另: 配套项目代码已托管中gitCode: gitcode.net/lsqingfeng/…

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

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

相关文章

如何优化测试用例设计,节约时间?

进一步优化测试用例设计&#xff0c;不仅可以减少测试用例数量和冗余&#xff0c;还可以减少执行时间&#xff0c;缩短测试周期&#xff0c;更快发现和修复问题&#xff0c;提高测试的质量。而没有优化的测试用例设计可能会导致冗余和重复的测试用例&#xff0c;增加了测试人员…

虾皮广告数据:​如何利用广告数据优化虾皮(Shopee)销售业绩

在虾皮&#xff08;Shopee&#xff09;平台上&#xff0c;广告数据对于卖家来说是至关重要的&#xff0c;它可以帮助卖家了解广告的效果并进行相应的优化。通过监控和分析这些广告数据&#xff0c;卖家可以更好地理解广告的表现&#xff0c;调整广告策略&#xff0c;提高广告的…

golang 反序列化出现json: cannot unmarshal string into Go value of type model.Phone

项目场景&#xff1a; 今天在项目公关的过程中&#xff0c;需要对interface{}类型进行转换为具体结构体 问题描述 很自然的用到了resultBytes, _ : json.Marshal(result)&#xff0c;然后对resultBytes进行反序列化转换为对应的结构体err : json.Unmarshal(resultBytes, &…

原生IP代理如何帮助跨境电商店铺做谷歌广告投放业务的?

随着全球化的发展&#xff0c;越来越多的电商店铺开始拓展跨境业务&#xff0c;而谷歌广告作为全球最大的广告平台之一&#xff0c;为跨境电商店铺带来了巨大的收益和商机。 然而&#xff0c;由于谷歌广告的地域限制和审查机制&#xff0c;店铺很难直接进行投放业务&#xff0…

Golang基础入门及Gin入门教程(2024完整版)

Golang是Google公司2009年11月正式对外公开的一门编程语言&#xff0c;它不仅拥有静态编译语言的安全和高性能&#xff0c;而 且又达到了动态语言开发速度和易维护性。有人形容Go语言&#xff1a;Go C Python , 说明Go语言既有C语言程序的运行速度&#xff0c;又能达到Python…

力扣|2023华为秋招冲刺

文章目录 第一关&#xff1a;2023 年 7 月面试题挑战第二关&#xff1a;2023 年 6 月面试题挑战第三关&#xff1a;2023 年 5 月面试题挑战 第一关&#xff1a;2023 年 7 月面试题挑战 class Solution { public:void reverseWord(vector<char>& s,int l,int r){for(i…

YOLOv8目标检测中数据集各部分的作用

自学答疑使用&#xff0c;持续更新… 在目标检测任务中&#xff0c;通常将整个数据集划分为训练集&#xff08;training set&#xff09;、验证集&#xff08;validation set&#xff09;和测试集&#xff08;test set&#xff09;。这三个数据集在训练和评估过程中具有不同的…

mysql8 源码编译 客户端连接运行 报段异常解决

mysql8 源码编译 客户端连接运行 报段异常解决。解决方案&#xff1a;删除之前编译的文件。先安装libncurses-dev依赖&#xff0c;在重新编译。原因&#xff1a;第一次编译没有libncurses-dev依赖&#xff0c;编译告警&#xff0c;再次编译有缓存&#xff0c;没有引入声明头文件…

分析一个项目(微信小程序篇)三

目录 接下来分析接口方面&#xff1a; home接口&#xff1a; categories接口&#xff1a; details接口&#xff1a; login接口&#xff1a; 分析一个项目讲究的是如何进行对项目的解析分解&#xff0c;进一步了解项目的整体结构&#xff0c;熟悉项目的结构&#xff0c;能够…

Vue-10、Vue键盘事件

1、vue中常见的按键别名 回车 ---------enter <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>键盘事件</title><!--引入vue--><script type"text/javascript" src"h…

数据库——DAY4(练习-在表中查找数据-多表查询)

一、实验要求&#xff08;多表查询&#xff09; 素材&#xff1a; 1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) ); …

怎么采集今日头条的资讯或文章-简数采集器

如何使用简数采集器快速采集今日头条新闻的资讯或优质文章&#xff1f; 很遗憾&#xff0c;简数采集器暂时不支持采集今日头条上的新闻和文章&#xff0c;不建议采集。 可以换一个采集源进行采集。 简数采集器采集网页文章非常简单&#xff0c;只需输入对应的网址&#xff0…

深入 Move 生态,探秘铭文热潮背后的思考

Move 语言是 Meta&#xff08;Facebook&#xff09;在 2018 年开发的新一代智能合约编程语言。回顾过去的一年&#xff0c;Aptos 与 Sui 主网上线&#xff0c;为整个 Web3 开启了下一个十亿用户服务的新征程。Rooch、Initia、MoveMent 等多条使用 Move 语言的区块链网络涌现&am…

【CSS】首个字符占用多行,并自定义样式

效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>首字母大写</title><style&…

函数式编程 - 组合compose的使用方法

函数式编程中有一个比较重要的概念就是函数组合&#xff08;compose&#xff09;,组合多个函数&#xff0c;同时返回一个新的函数。调用时&#xff0c;组合函数按顺序从右向左执行。右边函数调用后&#xff0c;返回的结果&#xff0c;作为左边函数的参数传入&#xff0c;严格保…

开源ERP系统Odoo安装部署并结合内网穿透实现公网访问本地系统

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…

SpringSecurity入门demo(一)集成与默认认证

一、集成与默认认证&#xff1a; 1、说明&#xff1a;在引入 Spring Security 项目之后&#xff0c;没有进行任何相关的配置或编码的情况下&#xff0c;Spring Security 有一个默认的运行状态&#xff0c;要求在经过 HTTP 基本认证后才能访问对应的 URL 资源&#xff0c;其默认…

案例分享:当前高端低延迟视频类产品方案分享(内窥镜、记录仪、车载记录仪、车载环拼、车载后视镜等产品)

若该文为原创文章&#xff0c;转载请注明出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/135439369 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬结…

金融科技革命:数字化如何塑造未来经济_光点科技

当今世界&#xff0c;数字化不仅是一种趋势&#xff0c;更是深刻重塑经济和金融领域的关键力量。在这个过程中&#xff0c;金融科技&#xff08;FinTech&#xff09;崭露头角&#xff0c;成为革命性变化的代名词。以下是数字化技术在经济和金融领域的几个关键应用&#xff0c;它…

运放负反馈

学习记录所使用书籍为西安交通大学杨建国教授著《新概念模拟电路》&#xff0c;可在ADI官网下载PDF版学习。 运算放大器&#xff0c;英文为 Operational Amplifier&#xff0c;简写 OA 或 OPA&#xff0c;中文简称为运放。 理想运算放大器如图所示&#xff0c;它具有两个差分的…