SpringBoot整合JDBCTemplate(day34)

1 学习目标

  1. 了解JDBCTemplate
  2. 重点掌握JDBCTemplate常用方法
  3. 重点掌握SpringBoot项目整个JDBCTemplate
  4. 重点掌握JDBCTemplate的CRUD操作

2 JDBCTemplate介绍

  • JDBCTemplate是Spring官方提供的,基于jdbc技术访问数据库的一个API对象。此对象基于模板方法模式,对JDBC操作进行了封装。我们可以基于此对象,以更简单的一个步骤操作数据库中的数据。
  • 我们只要在springboot工程中添加了spring-boot-starter-jdbc依赖,服务启动时,就会构建此对象,所以,你用的时候直接从spring容器去获取即可。

3 JDBCTemplate常用方法

  • update():执行DML语句。增、删、改语句

  • queryForMap() :查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合

    注意:这个方法查询的结果集长度只能是1

  • queryForList():查询结果将结果集封装为list集合

    注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中

  • query():查询结果,将结果封装为JavaBean对象

    query的参数:RowMapper

    一般我们使用BeanPropertyRowMapper实现类。可以完成数据到JavaBean的自动封装

    new BeanPropertyRowMapper<类型>(类型.class)

  • queryForObject:查询结果,将结果封装为对象

    一般用于聚合函数的查询

4 SpringBoot整合JDBCTemplate

4.1 创建项目

  • 在JSDSecondStage项目下创建**JDBCTemplateDemo**模块,修改版本号为2.5.4

4.2 导入依赖

①**pom.xml**

<!--mysql数据库驱动依赖-->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope>
</dependency>
<!--spring对象jdbc支持(此时会默认帮我们下载HiKariCP连接池,并且也会下载JDBCTemplate相关依赖)-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

4.3 修改配置文件

application.yml

#添加数据源的信息
spring:datasource:url: jdbc:mysql://localhost:3306/hr?useUnicode=true&characterEncoding=utf8&serverTimeZone=Asia/Shanghaiusername: rootpassword: root

4.4 入门案例

  • TestJDBCTemplate类复制到当前项目中

①**TestJDBCTemplate类中的test01方法**

@Autowired
private JdbcTemplate jdbcTemplate;/*** JDBCTemplate入门案例*/
@Test
public void test01() {//1.定义SQLString sql = "INSERT INTO jobs VALUES('TEST01','DATA01',10000,30000)";//2.调用update执行SQLint rows = jdbcTemplate.update(sql);System.out.println(rows > 0 ? "新增成功!" : "新增失败!!");
}

5 JDBCTemplate的CRUD操作

5.1 查询操作

5.1 查询jobs表中的所有记录

  • queryForList():查询结果将结果集封装为list集合

    注意:将每一条记录封装为一个Map集合,再将Map集合装载到List集合中

image-20221219144857517

①**TestJDBCTemplate类中的testQueryForList方法**

/*** 通过JDBCTemplate查询jobs表中的所有记录,并存储到List集合中*/
@Test
public void testQueryForList() {//1.定义SQLString sql = "SELECT job_id,job_title,min_salary,max_salary FROM jobs";//2.调用queryForList执行SQLList<Map<String, Object>> maps = jdbcTemplate.queryForList(sql);//3.遍历记过,输出所有记录for (Map<String, Object> map : maps) {System.out.println(map);}
}

5.2 查询jobs表中指定job_id值的记录

  • queryForMap():查询结果将结果集封装为map集合,将列名作为key,将值作为value 将这条记录封装为一个map集合

    注意:这个方法查询的结果集长度只能是1

①**TestJDBCTemplate类中的testQueryForMap方法**

/*** 通过JDBCTemplate查询jobs表中job_id的值为'TEST1'的记录,并将结果封装到Map中*/
@Test
public void testQueryForMap() {//1.定义SQLString sql = "SELECT job_id,job_title,min_salary,max_salary FROM jobs WHERE job_id= ?";//2.调用queryForMap执行SQLMap<String, Object> map = jdbcTemplate.queryForMap(sql, "TEST01");//3.输出结果System.out.println(map);
}

5.3 查询jobs表中jobs_id以S开头的记录,并将结果封装到指定的对象

  • query():查询结果,将结果封装为JavaBean对象

  • query的参数:rowMapper

    一般我们使用BeanPropertyRowMapper实现类。

    可以完成数据到JavaBean的自动封装 new BeanPropertyRowMapper<类型>(类型.class)

①**TestJDBCTemplate类中的testQuery方法**

/*** 通过JDBCTemplate查询jobs表中job_id以'S'开头的所有记录,并将结果封装到Jobs中*/
@Test
public void testQuery() {//1.定义SQLString sql = "SELECT job_id,job_title,min_salary,max_salary FROM jobs WHERE job_id LIKE ?";//2.执行SQL语句,指定将结果集封装到对应的实体类中,并且传入对应的参数List<Jobs> list = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Jobs.class),"S%");//3.遍历记过,输出所有记录for (Jobs job : list) {System.out.println(job);}
}

②**Jobs**

package cn.tedu.pojo;public class Jobs {//属性和表中的字段保持一致private String jobId;private String jobTitle;private Double minSalary;private Double maxSalary;public String getJobId() {return jobId;}public void setJobId(String jobId) {this.jobId = jobId;}public String getJobTitle() {return jobTitle;}public void setJobTitle(String jobTitle) {this.jobTitle = jobTitle;}public Double getMinSalary() {return minSalary;}public void setMinSalary(Double minSalary) {this.minSalary = minSalary;}public Double getMaxSalary() {return maxSalary;}public void setMaxSalary(Double maxSalary) {this.maxSalary = maxSalary;}@Overridepublic String toString() {return "Jobs{" +"jobId='" + jobId + '\'' +", jobTitle='" + jobTitle + '\'' +", minSalary=" + minSalary +", maxSalary=" + maxSalary +'}';}
}

5.4 查询jobs表的总记录数

  • queryForObject:查询结果,将结果封装为对象

    一般用于聚合函数的查询

①**TestJDBCTemplate类中的testQueryForObject方法**

/*** 通过JDBCTemplate查询jobs表总记录数*/
@Test
public void testQueryForObject() {//1.定义SQLString sql = "SELECT COUNT(job_id) FROM jobs";//2.执行SQL语句,指定将结果集封装到对应的实体类中,并且传入对应的参数Long total = jdbcTemplate.queryForObject(sql, Long.class);//3.输出查询总记录数System.out.println(total);
}

5.2 增删改操作

  • update():执行DML语句。增、删、改语句

5.2.1 向jobs表中插入一条记录

①**TestJDBCTemplate类中的testAdd方法**

/*** 通过JDBCTemplate向jobs表中插入一条记录,其中:* job_id为 'TEST02',* job_title为 "DATA02"* min_salary为 2000* max_salary为 20000*/
@Test
public void testAdd() {//1.定义SQLString sql = "INSERT INTO jobs (job_id,job_title,min_salary,max_salary) values (?,?,?,?)";//2.将参数以数组的形式封装Object[] args = {"TEST02", "DATA02", 2000, 20000};int rows = jdbcTemplate.update(sql, args);System.out.println(rows > 0 ? "新增成功!" : "新增失败!");
}

5.2.2 修改刚才添加的记录的部分数据

①**TestJDBCTemplate类中的testUpdate方法**

/*** 通过JDBCTemplate将jobs表中job_id为'TEST02'的记录的min_salary的值改为10000,max_salary的值改为40000*/
@Test
void testUpdate() {//1.定义SQLString sql = "update jobs set min_salary = ?,max_salary = ? where job_id=? ";//2.将参数封装为数组Object[] args = {10000, 40000, "TEST02"};int rows = jdbcTemplate.update(sql, args);System.out.println(rows > 0 ? "修改成功!" : "修改失败!");
}

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

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

相关文章

无人机应用新纪元:图形工作站配置推荐与硬件解析

低空经济作为国家新兴的战略性产业&#xff0c;正逐步成为经济高质量发展的新动力。据统计&#xff0c;2023年中国低空经济规模达到5059.5亿元&#xff0c;增速为33.8%&#xff0c;预计到2026年有望突破万亿元大关。政府对低空经济的发展高度重视&#xff0c;不仅出台了相关法规…

机器学习特征构建与特征筛选

前言 上一篇文章讲述了原始特征分析和处理&#xff0c;保障后续拿到的是干净的特征变量&#xff0c;但实际这些特征对于建模不一定是有效的&#xff0c;所以需要在原始特征的基础上&#xff0c;结合业务场景做特征变量的衍生&#xff0c;提升数据的表达能力。此外&#xff0c;…

【devops】devops-git之git分支与标签使用

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…

RNN基本介绍

RNN输入和输出不是向量的时候&#xff0c;需要进行向量化。

中国书法—孙溟㠭浅析碑帖《石门颂》

中国书法——孙溟㠭浅析碑帖《石门颂》 《石门颂》是东汉时期的摩崖刻石&#xff0c;属隶属体&#xff0c;全称是《故司隶校尉犍为杨君颂》&#xff0c;建和二年《公元148年》摹刻&#xff0c;记载的内容是杨孟文主持修复褒斜栈道的事迹&#xff0c;因为刻在陕西褒城北石门崖壁…

如何建立一个Webservice WSDL的简单例子(完整例子)

一:根据对方给的wsdl 的接口地址创建Web 的逻辑端口 1:例如这个用C#写的Web 2.我们需要在SAP里建立一个Service Consumers 的服务记得后缀要加?wsdl 2:然后就会生成对应方法的出参 入参 返回的消息根据接口方法来判断 二:如何通过LPCONFIG建立逻辑端口或者通过SOAMANAGER…

系统架构设计师 - 项目管理

项目管理 项目管理&#xff08;1-3分&#xff0c;案例分析 25分&#xff09;立项管理 ★盈亏平衡分析 范围管理 ★★时间管理 ★★★★概述前导图法 PDM(单代号网络图)箭线图法 ADM(双代号网络图) 了解关键路径法总时差自由时差 甘特图 成本管理 ★挣值管理概述指数计算 软件质…

actuator字符绕过漏洞在Nginx上的配置

最近遇到了安全部门派发的actuator泄漏漏洞&#xff0c;领导希望不暴露到外网上&#xff0c;对于内网需要认证才可以访问。 要想不暴露到外网上&#xff0c;就需要在网络层面做拦截&#xff0c;比如nginx和apisix上做代理配置。 URI字符绕过的风险背景知识: URI字符绕过是一种安…

Day97 代码随想录打卡|动态规划篇--- 整数拆分

题目&#xff08;leecode T343&#xff09;&#xff1a; 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 方法&#xff1a; 本题感觉属于有些难度的动态…

【智能流体力学】数值模拟中的稳态和瞬态

在流体力学和数值模拟中, 稳态 (Steady State)意味着流体的物理量(如速度、压力、温度等)不随时间变化。换句话说,在稳态模拟中,系统已经达到了平衡,任何位置上的流场特性都不再随时间发生变化。 其他教程参考:https://doc.cfd.direct/openfoam/user-guide-v12/index…

使用Visual Studio Code配置C/C++开发环境的全面指南

目录 引言 一、准备工作 1. 安装Visual Studio Code 2. 安装C/C编译器 3. 配置环境变量&#xff08;仅Windows用户&#xff09; 二、在VS Code中安装C/C扩展 三、创建您的第一个C/C项目 1. 创建项目文件夹 2. 打开项目文件夹 3. 创建源文件 四、配置任务&#xff08;…

Leetcode3276. 选择矩阵中单元格的最大得分

Every day a Leetcode 题目来源&#xff1a;3276. 选择矩阵中单元格的最大得分 解法1&#xff1a;回溯 每一行最多选1个数字&#xff0c;如果要选&#xff0c;就要保证前面没有选择过该数字&#xff0c;然后将得分累加&#xff0c;传入下一次递归&#xff0c;如果不选&#…

LeetCode题练习与总结:翻转二叉树--226

一、题目描述 给你一棵二叉树的根节点 root &#xff0c;翻转这棵二叉树&#xff0c;并返回其根节点。 示例 1&#xff1a; 输入&#xff1a;root [4,2,7,1,3,6,9] 输出&#xff1a;[4,7,2,9,6,3,1]示例 2&#xff1a; 输入&#xff1a;root [2,1,3] 输出&#xff1a;[2,3,1…

QT学习——知识篇

一、qt的ui界面是什么 Qt的UI界面通常指的是使用Qt框架开发的用户界面。Qt是一个跨平台的C图形用户界面库&#xff0c;它提供了丰富的控件和布局&#xff0c;以及用于处理事件和用户交互的机制。在Qt中&#xff0c;UI界面通常是通过Qt Designer工具设计的&#xff0c;然后转换成…

<<编码>> 第 11 章 逻辑门电路(Gates)--猫咪选择电路 示例电路

使用门电路的猫咪选择电路 info::操作说明 鼠标单击开关切换开合状态 primary::在线交互操作链接 https://cc.xiaogd.net/?startCircuitLinkhttps://book.xiaogd.net/code-hlchs-examples/assets/circuit/code-hlchs-ch11-16-cat-circuit-with-gate.txt 集成的猫咪选择电路 in…

基于51单片机的台灯控制(Proteus仿真)

基于51单片机的台灯控制系统以AT89C51为主控&#xff0c;使用LCD1602作为系统主控&#xff0c;借助ADC0832进行ADC转换&#xff0c;获取光敏传感器的值&#xff0c;灯光颜色共有三种&#xff0c;分别是红绿蓝&#xff0c;系统有两种控制方式&#xff0c;一种是蓝牙控制&#xf…

[Unity Demo]从零开始制作空洞骑士Hollow Knight第二集:通过InControl插件实现绑定玩家输入以及制作小骑士移动空闲动画

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、通过InControl插件实现绑定玩家输入二、制作小骑士移动和空闲动画 1.制作动画2.玩家移动和翻转图像3.状态机思想实现动画切换总结 前言 好久没来CSDN看看&…

HBase在大数据实时处理中的角色

HBase是一个分布式的、面向列的开源NoSQL数据库&#xff0c;它建立在Hadoop的HDFS之上&#xff0c;被设计用于处理大规模数据集。HBase非常适合于需要随机实时读写访问的应用程序&#xff0c;例如大数据分析、数据仓库和实时数据处理等场景。本文将探讨HBase是如何进行大数据实…

虚幻引擎 | (类恐鬼症)玩家和NPC语音聊天(中)

虚幻引擎 | &#xff08;类恐鬼症&#xff09;玩家和NPC语音聊天-CSDN博客 上篇偏重实现步骤&#xff0c;中篇偏重校准和降低延迟&#xff0c;下篇优化上下文和口音 TTS通用参数 ——————————————————————————————————————————— 以…

传统Malmquist-Luenberger指数与全局Malmquist-Luenberger指数的区别

1.全局技术前沿的构建 1.1传统ML指数 技术前沿的时间依赖性 传统的Malmquist-Luenberger&#xff08;ML&#xff09;指数在每个时期&#xff08;例如年份&#xff09;单独构建各自的技术前沿。这意味着每个时期的生产可能性集合和技术效率都是基于该时期的数据。 不可比性问…