JdbcTemplate
目录
1、简介
2、开发步骤
2.1、导入坐标
2.2、创建表和类
2.3、创建JdbcTemplate对象
2.4、执行数据库操作
3、解耦
4、增删改查
⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章
⭐作者主页:@逐梦苍穹
⭐所属专栏:JavaEE、Spring
1、简介
JdbcTemplate是Spring框架提供的一个核心类,用于简化在Java应用程序中使用JDBC(Java Database Connectivity)时的操作。JDBC是Java连接数据库的标准API,但使用纯JDBC编写数据库访问代码可能会显得繁琐和冗长。
它是spring框架中提供的一个对象,是对原始繁琐的Jdbc API对象的简单封装。spring框架为我们提供了很多的操作模板类。例如:操作关系型数据的JdbcTemplate和HibernateTemplate,操作nosql数据库的RedisTemplate,操作消息队列的JmsTemplate等等。
JdbcTemplate封装了与数据库的交互细节,提供了一组简单的方法,使得数据库操作更加简洁和高效。通过JdbcTemplate,你可以执行SQL查询、更新、批处理以及存储过程调用,而无需手动处理数据库连接的打开和关闭。
JdbcTemplate的一些主要特点包括:
- 简化的异常处理:JdbcTemplate会自动捕获和转换JDBC异常为Spring的DataAccessException,简化了异常处理过程。
- 参数化查询:JdbcTemplate支持参数化查询,可以避免SQL注入等安全问题。
- 结果集映射:可以将查询结果映射到Java对象或基本数据类型。
- 批处理操作:支持批量插入和更新,提高数据库操作效率。
- 错误码处理:提供错误码的解析,便于处理数据库返回的错误信息。
使用JdbcTemplate可以有效地减少样板代码,让数据库操作更加简单和可维护。它是Spring框架中数据访问的重要组成部分,并被广泛应用于Java企业应用的开发中。
2、开发步骤
JdbcTemplate开发步骤:
① 导入spring-jdbc和spring-tx坐标
② 创建数据库表和实体
③ 创建JdbcTemplate对象
④ 执行数据库操作
2.1、导入坐标
导入spring-jdbc和spring-tx坐标
<!--导入spring的jdbc坐标-->
<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.0.5.RELEASE</version>
</dependency>
<!--导入spring的tx坐标-->
<dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.0.5.RELEASE</version>
</dependency>
2.2、创建表和类
创建数据库表和实体

package com.xzl.domain;/*** @author 逐梦苍穹* @date 2023/8/4 16:32*/
public class Account {private String name;private double money;@Overridepublic String toString() {return "Account{" +"name='" + name + '\'' +", money=" + money +'}';}public String getName() {return name;}public void setName(String name) {this.name = name;}public double getMoney() {return money;}public void setMoney(double money) {this.money = money;}
}
2.3、创建JdbcTemplate对象

2.4、执行数据库操作
package com.xzl.test;import com.alibaba.druid.pool.DruidDataSource;
import com.xzl.domain.Account;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;import javax.sql.DataSource;
import java.util.List;/*** @author 逐梦苍穹* @date 2023/8/4 16:35*/
public class jdbcTemplateTest {@Testpublic void createJdbcTemplate(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");DataSource dataSource_druid = applicationContext.getBean("dataSource_druid", DataSource.class);JdbcTemplate jdbcTemplate = new JdbcTemplate();jdbcTemplate.setDataSource(dataSource_druid);List<Account> accountList = jdbcTemplate.query("select * from jdbctemplate", new BeanPropertyRowMapper<Account>(Account.class));System.out.println(accountList);}
}
3、解耦
Spring产生JdbcTemplate对象
我们可以将JdbcTemplate的创建权交给Spring,将数据源DataSource的创建权也交给Spring,在Spring容器内部将数据源DataSource注入到JdbcTemplate模版对象中,配置如下:

这里有一个很容易犯的错误,就是name的值,有时候要出错。这里的name的值,比如name="abc",实际上Spring找的是一个setAbc方法。下面是错误写法:

原因是:

下面让Spring自动加载jdbc模板对象:

4、增删改查
全部代码如下:
package com.xzl.test;import com.xzl.domain.Account;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;import javax.sql.DataSource;
import java.util.List;/*** @author 逐梦苍穹* @date 2023/8/4 16:35*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class jdbcTemplateTest {@Autowired@Qualifier(value = "jdbcTemplate")private JdbcTemplate jdbcTemplate;@Testpublic void retrieve(){List<Account> accounts = jdbcTemplate.query("select * from jdbctemplate",new BeanPropertyRowMapper<Account>(Account.class));System.out.println("查询全部:");for (Account account : accounts) {System.out.println(account);}Account account = jdbcTemplate.queryForObject("select * from jdbctemplate where name=?", new BeanPropertyRowMapper<Account>(Account.class), "xzl");System.out.println("查询单个:"+account);Long aLong = jdbcTemplate.queryForObject("select count(*) from jdbctemplate", Long.class);System.out.println("聚合查询->总数:"+aLong);Long aLong1 = jdbcTemplate.queryForObject("select sum(money) from jdbctemplate", Long.class);System.out.println("聚合查询->总和:"+aLong1);}@Testpublic void update(){jdbcTemplate.update("update jdbctemplate set money = ? where name=?;",1000,"tom");}@Testpublic void delete(){jdbcTemplate.update("delete from jdbctemplate where name=?","tom");createJdbcTemplate();}@Testpublic void create(){int row = jdbcTemplate.update("insert into jdbctemplate values(?,?)", "tom", 5000);System.out.println(row);}@Testpublic void SpringCreateJdbcTemplate(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");JdbcTemplate jdbcTemplate = applicationContext.getBean("jdbcTemplate", JdbcTemplate.class);List<Account> accountList = jdbcTemplate.query("select * from jdbctemplate", new BeanPropertyRowMapper<Account>(Account.class));System.out.println(accountList);}@Testpublic void createJdbcTemplate(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");DataSource dataSource_druid = applicationContext.getBean("dataSource_druid", DataSource.class);JdbcTemplate jdbcTemplate = new JdbcTemplate();jdbcTemplate.setDataSource(dataSource_druid);List<Account> accountList = jdbcTemplate.query("select * from jdbctemplate", new BeanPropertyRowMapper<Account>(Account.class));System.out.println(accountList);}
}
相关文章:
JdbcTemplate
目录 1、简介 2、开发步骤 2.1、导入坐标 2.2、创建表和类 2.3、创建JdbcTemplate对象 2.4、执行数据库操作 3、解耦 4、增删改查 ⭐作者介绍:大二本科网络工程专业在读,持续学习Java,努力输出优质文章 ⭐作者主页:逐梦苍穹…...
PROFINET转TCP/IP网关profinet网线接头接法
大家好,今天要和大家分享一款自主研发的通讯网关,捷米JM-PN-TCPIP。这款网关可是集多种功能于一身,PROFINET从站功能,让它在通讯领域独领风骚。想知道这款网关如何实现PROFINET和TCP/IP网络的连接吗?一起来看看吧&…...
【FPGA IP系列】FIFO的通俗理解
FPGA厂商提供了丰富的IP核,基础性IP核都是可以直接免费调用的,比如FIFO、RAM等等。 本文主要介绍FIFO的一些基础知识,帮助大家能够理解FIFO的基础概念。 一、FIFO介绍 FIFO全称是First In First Out,即先进先出。 FIFO是一个数…...
Kylin v10基于cephadm工具离线部署ceph分布式存储
1. 环境: ceph:octopus OS:Kylin-Server-V10_U1-Release-Build02-20210824-GFB-x86_64、CentOS Linux release 7.9.2009 2. ceph和cephadm 2.1 ceph简介 Ceph可用于向云平台提供对象存储、块设备服务和文件系统。所有Ceph存储集群部署都从…...
框架的前置学习-反射
运行java代码要经历的三个阶段 反射,程序框架设计的灵魂,将类的各个组成部分封装成其他对象,这就是反射机制。 框架:半成品的软件,在框架的基础上进行开发,可以简化编码 反射的好处: 可以在…...
【使用bat脚本实现批量创建文件夹、批量复制文件至对应文件夹中】
使用bat脚本实现批量创建文件夹、批量复制文件至对应文件夹中 常用cmd命令 场景一:在指定位置批量创建文件夹 在桌面创建一个txt文件编写创建目录代码 //在桌面"五保户结算单"的文件夹下创建名称为"1张三"的文件夹 md E:\桌面\五保户结算单\…...
面向视频会议场景的 H.266/VVC 码率控制算法研究
文章目录 面向视频会议场景的 H.266/VVC 码率控制算法研究个人总结摘要为什么要码率控制码率控制的关键会议类视频码率控制研究背景视频会议系统研究现状目前基于 R-λ模型的码率控制算法的问题文章主要两大优化算法优化算法1:基于视频内容相关特征值的码率控制算法…...
【网络基础实战之路】设计网络划分的实战详解
系列文章传送门: 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 PS:本要求基于…...
MacBook触控板窗口管理 Swish for Mac
Swish for Mac是一款用于通过手势来控制mac应用窗口的软件,你可以通过这款软件在触控板上进行手势控制,你可以在使用前预设好不同手势的功能,然后就能直接通过这些手势让窗口按照你想要的方式进行变动了 Swish 支持 Haptick Feedback 震动反…...
VS开发Qt程序,无法打印QDebug调试信息,VS进行Qt开发时Qt Designer无法使用“转到槽”选项
VS开发Qt程序,无法打印QDebug调试信息,VS进行Qt开发时Qt Designer无法使用“转到槽”选项 VS开发Qt程序,无法打印QDebug调试信息VS进行Qt开发时Qt Designer无法使用“转到槽”选项 VS开发Qt程序,无法打印QDebug调试信息 解决方案…...
MySQL操作命令详解:增删改查
文章目录 一、CRUD1.1 数据库操作1.2 表操作1.2.1 五大约束1.2.2 创建表1.2.3 修改表1.2.3 删除表1.2.4 表数据的增删改查1.2.5 去重方式 二、高级查询2.1 基础查询2.2 条件查询2.3 范围查询2.4 判空查询2.5 模糊查询2.6 分页查询2.7 查询后排序2.8 聚合查询2.9 分组查询2.10 联…...
MySQL字段类型与存储空间的关系
在 MySQL 中,对于整数类型(如 INT)、字符类型(如 VARCHAR)、浮点数类型(如 DOUBLE)等,参数(括号中的数字或长度)通常用于限制数据的范围或精度,但…...
红船元宇宙 上海布袋除尘器后一家太平洋百货月底停业
上海布袋除尘器后一家太平洋百货即将停业。 7月31日,上海太平洋百货微信公号发布公告称,由于与合资方的合作期限今年届满,上海太平洋百货徐汇店将于2023年8月31日营业结束后正式谢幕,终止经营,并于即日起开展大型主题感…...
vue 图片回显标签
第一种 <el-form-item label"打款银行回单"><image-preview :src"form.bankreceiptUrl" :width"120" :height"120"/></el-form-item>// 值为 https://t11.baidu.com/it/app106&fJPEG&fm30&fmtauto&…...
《向量数据库指南》——使用SQuAD 数据集演示Faiss 功能
使用 SQuAD 数据集进行演示 现在,我们可以通过示例演示了解 Faiss 功能。本次示例中,将使用斯坦福的问答数据集(SQuAD)。SQuAD 是一个常用的自然语言处理(NLP)数据集,该数据集基于用户在百科中提出的问题,每个问题的答案都来自于对应阅读段落的一段文本,共计 500 多…...
java多线程并发面试题总结(史上最全40道)
1、多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓"知其然知其所以然","会用"只是"知其然"&am…...
IDEA强大的VisualGC插件
前言 开发阶段实时监测,自己的JVM信息,实时可视化 Hotspot JVM 垃圾回收监控工具, 支持查看本地和远程JVM进程, 支持G1 and ZGC算法。 插件安装 在线安装 IntelliJ IDEA 可通过在线安装的方式,安装插件 JDK VisualGC,安装步骤: …...
桐乡上元教育室内设计培训班-CAD学习
室内设计四大软件】 1、Auto ca??d:着重培训建筑与室内设计所用知识,增强实践性施工图纸的绘制与操作速度; 课程包括:CAD基本命令与修改器;室内平面图、地面、天花、照明等图;室内立面图绘制;室内剖面图绘制;定植尅家具的平面、立…...
h5浏览pdf文件
将hybrid整个复制到一级文件夹下 hybrid地址:https://download.csdn.net/download/qq_37194189/88157330 创建一个 pdf页面用于展示pdf文件 <template><view style"width: 100%;" ><web-view :src"pdfUrl"></web-view&…...
无涯教程-Lua - 嵌套if语句函数
在Lua编程中,您可以在另一个if or else if语句中使用一个if or else if语句。 nested if statements - 语法 嵌套if 语句的语法如下- if( boolean_expression 1) then--[ Executes when the boolean expression 1 is true --]if(boolean_expression 2)then--[ Ex…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
数据库分批入库
今天在工作中,遇到一个问题,就是分批查询的时候,由于批次过大导致出现了一些问题,一下是问题描述和解决方案: 示例: // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist
现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...
