Spring Boot 整合 JdbcTemplate,JdbcTemplate 与 MyBatis 的区别

news2025/6/3 21:09:39

DAY29.1 Java核心基础

Spring Boot 整合 JdbcTemplate

JdbcTemplate是一个轻量级JDBC封装的组件

JdbcTemplate 是 Spring 自带的JDBC的封装,和Mybatis类似,需要自己封装sql语句

JdbcTemplate 帮助我们来连接数据库,SQL的执行,返回值的封装

JdbcTemplate特点

  1. 常用方法丰富
    提供了常用的 SQL 操作方法,如:
    • execute:执行任意 SQL;
    • update:执行增删改操作;
    • batchUpdate:批量更新;
    • queryqueryForObject:执行查询。
  2. 参数传递灵活
    SQL 语句和参数分开传入,参数支持:
    • 可变参数;
    • 集合(如 List);
    • 数组等方式。
  3. SQL 写在代码中
    SQL 直接写在 Java 方法中,方便查看和修改,代码更直观。
  4. 集成简单,使用方便
    • 属于 Spring 框架自带组件;
    • 无需额外配置生命周期;
    • 可直接从 Spring 容器中获取使用。

与 MyBatis 的区别:

对比项JdbcTemplateMyBatis
SQL 写法直接写在 Java 代码中一般写在 XML 文件中,或用注解
配置复杂度配置简单,无需额外集成需引入第三方依赖和单独配置
灵活性灵活快速,适合小型/中型项目更规范,适合 SQL 多、结构复杂的大型项目
学习曲线简单易用,Spring 用户快速上手学习成本略高,需理解 Mapper 和配置结构
代码

1、pom.xml 引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
 
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

2、创建实体类

@Data
public class Account {
    private Integer id;
    private String name;
    private Integer age;
}

3、定义 Repository 接口,定义方法

public interface AccountRepository {
    public List<Account> list();
    public Account getById(Integer id);
    public int add(Account account);
    public int update(Account account);
    public int deleteById(Integer id);
    public int[] batchAdd();
    public int[] batchUpdate();
    public int[] batchDelete();
}

4、创建实现类,实现所有方法

@Repository
public class AccountRepositoryImpl implements AccountRepository {
 
    @Autowired
    private JdbcTemplate jdbcTemplate;
 
    @Override
    public List<Account> list() {
        return this.jdbcTemplate.query("select * from account", new BeanPropertyRowMapper<>(Account.class));
    }
 
    @Override
    public Account getById(Integer id) {
        return this.jdbcTemplate.queryForObject("select * from account where id = ?", new Integer[]{id},new BeanPropertyRowMapper<>(Account.class));
    }
 
    @Override
    public int add(Account account) {
        return this.jdbcTemplate.update("insert into account(name,age) values(?,?)",account.getName(),account.getAge());
    }
 
    @Override
    public int update(Account account) {
        return this.jdbcTemplate.update("update account set name = ?,age = ? where id = ?", account.getName(),account.getAge(),account.getId());
    }
 
    @Override
    public int deleteById(Integer id) {
        return this.jdbcTemplate.update("delete from account where id = ?", id);
    }
 
    @Override
    public int[] batchAdd() {
        List<Object[]> args = new ArrayList<Object[]>();
        args.add(new Object[]{"小明",22});
        args.add(new Object[]{"小张",33});
        args.add(new Object[]{"小李",23});
        return this.jdbcTemplate.batchUpdate("insert into account(name,age) values(?,?)",args);
    }
 
    @Override
    public int[] batchUpdate() {
        List<Object[]> args = new ArrayList<>();
        args.add(new Object[]{"大张",33,5});
        args.add(new Object[]{"大李",33,6});
        args.add(new Object[]{"大冯",33,7});
        return this.jdbcTemplate.batchUpdate("update account set name = ?,age = ? where id = ?", args);
    }
 
    @Override
    public int[] batchDelete() {
        List<Object[]> args = new ArrayList<>();
        args.add(new Object[]{5});
        args.add(new Object[]{6});
        args.add(new Object[]{7});
        return this.jdbcTemplate.batchUpdate("delete from account where id = ?", args);
    }
}

5、控制器

@RestController
public class AccountController {
 
    @Autowired
    private AccountRepository accountRepository;
 
    @GetMapping("/list")
    public List<Account> list(){
        return this.accountRepository.list();
    }
 
    @GetMapping("/getById/{id}")
    public Account getById(@PathVariable("id") Integer id){
        Account account;
        try {
            account = this.accountRepository.getById(id);
        } catch (Exception e) {
            return null;
        }
        return account;
    }
 
    @PostMapping("/add")
    public int add(@RequestBody Account account){
        int add = this.accountRepository.add(account);
        return add;
    }
 
    @PutMapping("/update")
    public int update(@RequestBody Account account){
        int update = this.accountRepository.update(account);
        return update;
    }
 
    @DeleteMapping("/delete/{id}")
    public int delete(@PathVariable("id") Integer id){
        int i = this.accountRepository.deleteById(id);
        return i;
    }
 
    @PostMapping("/batchAdd")
    public int[] batchAdd(){
        return this.accountRepository.batchAdd();
    }
 
    @PutMapping("/batchUpdate")
    public int[] batchUpdate(){
        return this.accountRepository.batchUpdate();
    }
 
    @DeleteMapping("/batchDelete")
    public int[] batchDelete(){
        return this.accountRepository.batchDelete();
    }
}

测试我们用postman测试就行

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

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

相关文章

【笔记】开源通用人工智能代理 Suna 部署全流程准备清单(Windows 系统)

#工作记录 一、基础工具与环境 开发工具 Git 或 GitHub Desktop&#xff08;代码管理&#xff09;Docker Desktop&#xff08;需启用 WSL2&#xff0c;容器化部署&#xff09;Python 3.11&#xff08;推荐版本&#xff0c;需添加到系统环境变量&#xff09;Node.js LTS&#xf…

海康工业相机SDK二次开发(VS+QT+海康SDK+C++)

前言 工业相机在现代制造和工业自动化中扮演了至关重要的角色&#xff0c;尤其是在高精度、高速度检测中。海康威视工业相机以其性能稳定、图像质量高、兼容性强而受到广泛青睐。特别是搞机器视觉的小伙伴们跟海康打交道肯定不在少数&#xff0c;笔者在平常项目中跟海康相关人…

深度学习|pytorch基本运算-乘除法和幂运算

【1】引言 前序学习进程中&#xff0c;已经对pytorch张量数据的生成和广播做了详细探究&#xff0c;文章链接为&#xff1a; 深度学习|pytorch基本运算-CSDN博客 深度学习|pytorch基本运算-广播失效-CSDN博客 上述探索的内容还止步于张量的加减法&#xff0c;在此基础上&am…

4.2.4 Spark SQL 数据写入模式

在本节实战中&#xff0c;我们详细探讨了Spark SQL中数据写入的四种模式&#xff1a;ErrorIfExists、Append、Overwrite和Ignore。通过具体案例&#xff0c;我们演示了如何使用mode()方法结合SaveMode枚举类来控制数据写入行为。我们首先读取了一个JSON文件生成DataFrame&#…

论文笔记: Urban Region Embedding via Multi-View Contrastive Prediction

AAAI 2024 1 INTRO 之前基于多视图的region embedding工作大多遵循相同的模式 单独的单视图表示多视图融合 但这种方法存在明显的局限性&#xff1a;忽略了不同视图之间的信息一致性 一个区域的多个视图所携带的信息是高度相关的&#xff0c;因此它们的表示应该是一致的如果能…

初学者如何微调大模型?从0到1详解

本文将手把手带你从0到1&#xff0c;详细解析初学者如何微调大模型&#xff0c;让你也能驾驭这些强大的AI工具。 1. 什么是大模型微调&#xff1f; 想象一下&#xff0c;预训练大模型就像一位博览群书但缺乏专业知识的通才。它掌握了海量的通用知识&#xff0c;但可能无法完美…

西瓜书第十一章——降维与度量学习

文章目录 降维与度量学习k近邻学习原理头歌实战-numpy实现KNNsklearn实现KNN 降维——多维缩放&#xff08;Multidimensional Scaling, MDS&#xff0c;MDS&#xff09;提出背景与原理重述1.**提出背景**2.**数学建模与原理推导**3.**关键推导步骤** Principal Component Analy…

Portainer安装指南:多节点监控的docker管理面板-家庭云计算专家

背景 Portainer 是一个轻量级且功能强大的容器管理面板&#xff0c;专为 Docker 和 Kubernetes 环境设计。它通过直观的 Web 界面简化了容器的部署、管理和监控&#xff0c;即使是非技术用户也能轻松上手。Portainer 支持多节点管理&#xff0c;允许用户从一个中央控制台管理多…

vscode实用配置

前端开发安装插件&#xff1a; 1.可以更好看的显示文件图标 2.用户快速打开文件 使用步骤&#xff1a;在html文件下右键点击 open with live server 即可 刷力扣&#xff1a; 安装这个插件 还需要安装node.js即可

React 项目中封装 Excel 导入导出组件:技术分享与实践

文章目录 前言一、为什么需要封装 Excel 组件&#xff1f;二、技术选型三、核心实现1. 安装依赖2. 封装Excel导出3. 封装导入组件 &#xff08;UploadExcel&#xff09; 总结 前言 在 React 项目中&#xff0c;处理 Excel 文件的导入和导出是常见的业务需求。无论是导出报表数…

【2025CCF中国开源大会】RISC-V 开源生态的挑战与机遇分论坛重磅来袭!共探开源芯片未来

点击蓝字 关注我们 CCF Opensource Development Committee 开源浪潮正从软件席卷硬件领域&#xff0c;RISC-V作为全球瞩目的开源芯片架构&#xff0c;正在重塑计算生态的版图&#xff01;相较于成熟的x86与ARM&#xff0c;RISC-V生态虽处爆发初期&#xff0c;却蕴藏着无限可能。…

python完成批量复制Excel文件并根据另一个Excel文件中的名称重命名

import openpyxl import shutil import os # 原始文件路径 original_file "C:/Users/Administrator/Desktop/事业联考面试名单/郑州.xlsx" # 读取包含名称的Excel文件 # 修改为您的文件名 wb openpyxl.load_workbook( "C:/Users/Administrator/Desktop/事…

Vue-2-前端框架Vue基础入门之二

文章目录 1 计算属性1.1 计算属性简介1.2 计算属性示例 2 侦听器2.1 简单的侦听器2.2 深度监听2.3 监听对象单个属性 3 vue-cli3.1 工程化的Vue项目3.2 Vue项目的运行流程 4 vue组件4.1 Vue组件的三个部分4.1.1 template4.1.2 script4.1.3 style 4.2 组件之间的关系4.2.1 使用组…

CPT208 Human-Centric Computing 人机交互 Pt.7 交互和交互界面

文章目录 1. 界面隐喻&#xff08;Interface metaphors&#xff09;1.1 界面隐喻的应用方式1.2 界面隐喻的优缺点 2. 交互类型2.1 Instructing&#xff08;指令式交互&#xff09;2.2 Conversing&#xff08;对话式交互&#xff09;2.3 Manipulating&#xff08;操作式交互&…

[网页五子棋][匹配模块]前后端交互接口(消息推送机制)、客户端开发(匹配页面、匹配功能)

让多个用户&#xff0c;在游戏大厅中能够进行匹配&#xff0c;系统会把实力相近的两个玩家凑成一桌&#xff0c;进行对战 约定前后端交互接口 消息推送机制 匹配这样的功能&#xff0c;也是依赖消息推送机制的 玩家 1 点击开始匹配按钮&#xff0c;就会告诉服务器&#xff1…

【数据分析】Matplotlib+Pandas+Seaborn绘图

【数据分析】MatplotlibPandasSeaborn绘图 &#xff08;一&#xff09;Matplotlib绘图1.1 matplotlib绘图方式1: 状态接口1.2 matplotlib绘图方式2: 面向对象1.3 通过安斯科姆数据集, 说明可视化的重要性1.4 MatPlotlib绘图-单变量-直方图1.5 MatPlotlib绘图-双变量-散点图1.6 …

NLP学习路线图(十五):TF-IDF(词频-逆文档频率)

在自然语言处理&#xff08;NLP&#xff09;的浩瀚宇宙中&#xff0c;TF-IDF&#xff08;词频-逆文档频率&#xff09; 犹如一颗恒星&#xff0c;虽古老却依然璀璨。当ChatGPT、BERT等大模型光芒四射时&#xff0c;TF-IDF作为传统方法的代表&#xff0c;其简洁性、高效性与可解…

[Redis] Redis命令在Pycharm中的使用

初次学习&#xff0c;如有错误还请指正 目录 String命令 Hash命令 List命令 set命令 SortedSet命令 连接pycharm的过程见&#xff1a;[Redis] 在Linux中安装Redis并连接桌面客户端或Pycharm-CSDN博客 redis命令的使用见&#xff1a;[Redis] Redis命令&#xff08;1&#xf…

openpnp - 给M4x0.7mm的直油嘴加油的工具选择

文章目录 openpnp - 给M4x0.7mm的直油嘴加油的工具选择概述如果换上带卡口的M4x0.7直油嘴END openpnp - 给M4x0.7mm的直油嘴加油的工具选择 概述 X导轨用了一个HG15的滑块 滑块上的注油口的黄油嘴是M4x0.7mm的直油嘴。 外表面是6边形的柱子&#xff0c;没有可以卡住加油嘴工…

EasyExcel复杂Excel导出

效果图展示 1、引入依赖 <!-- easyExcel --> <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>4.0.2</version> </dependency>2、实体类 import com.alibaba.excel.annotatio…