当前位置: 首页 > news >正文

[springboot]菜鸟学习- JdbcTemplate用法浅尝

JdbcTemplate 是 Spring Framework 提供的一个非常强大的 JDBC 工具类,它可以显著简化 JDBC 编程的代码量,并提供了许多便捷的方法来执行 SQL 查询、更新等操作。

使用 JdbcTemplate 的步骤如下:

1. 创建 JdbcTemplate 对象:可以通过构造方法或者使用依赖注入方式创建 JdbcTemplate 对象。

2. 配置数据源:为了方便使用,一般使用 Spring 的数据源配置方式来配置数据源,然后将数据源注入到 JdbcTemplate 中。

3. 编写 SQL 语句:使用 SQL 语句查询、更新或者删除数据库中的数据。

4. 执行 SQL 语句:通常使用 JdbcTemplate 中的方法来执行 SQL 语句。

具体的使用方法如下:

a. 创建 JdbcTemplate 对象:

JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);

或者在配置文件中配置:

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"/>
</bean>

b. 配置数据源:

<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"><property name="driverClassName" value="${jdbc.driverClassName}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/>
</bean>

c. 编写 SQL 语句:

String sql = "SELECT * FROM users WHERE id=?";

d. 执行 SQL 语句:

User user = jdbcTemplate.queryForObject(sql, new Object[]{id}, new BeanPropertyRowMapper<>(User.class));

其中,queryForObject()方法用于执行单行查询语句,返回值类型可以是任意类型,也可以使用 BeanPropertyRowMapper指定返回值类型。

其他常用的方法还包括 query()、update()、batchUpdate()、execute() 等,下面做一下具体说明:

query()

JdbcTemplate的query()方法用于执行SQL查询语句,并将结果映射为Java对象。它有多个重载方法,其中最简单的一个的语法如下:

public <T> List<T> query(String sql, RowMapper<T> rowMapper, Object... params)

其中,参数说明如下:

  • sql:要执行的SQL语句。
  • rowMapper:将结果映射为Java对象的RowMapper对象。
  • params:可选参数,用于替换SQL语句中的占位符。

返回值是一个泛型List,其中元素的类型由RowMapper指定。下面是一个简单的示例:

String sql = "SELECT * FROM employee WHERE id = ?";
RowMapper<Employee> rowMapper = new BeanPropertyRowMapper<>(Employee.class);
Employee employee = jdbcTemplate.queryForObject(sql, rowMapper, 1);

这段代码将查询id为1的员工记录,并将结果映射为一个Employee对象。注意,这里使用了queryForObject()方法,它可以查询单条记录,并将结果映射为一个对象。如果需要查询多条记录,则需要使用query()方法。

update()

JdbcTemplate是Spring框架中JDBC的核心类,它提供了丰富的JDBC操作方法,其中包括update()方法用于执行数据库更新操作。

update()方法带有两个参数:

  1. SQL语句:表示需要执行的更新语句。

  2. Object[] args:表示更新语句中的参数值。

例如,以下代码将插入一条用户记录到数据库中:

public void addUser(String username, String password) {String sql = "INSERT INTO user (username, password) VALUES (?, ?)";jdbcTemplate.update(sql, username, password);
}

在这个例子中,update()方法将会执行插入语句,并将参数username和password作为更新语句中的值进行替换。

除了使用占位符方式传递参数,JdbcTemplate还支持使用命名参数或者参数类型的方式进行传递参数。

batchUpdate()

JdbcTemplate的batchUpdate()方法用于批量更新或插入数据。它接收两个参数:一个SQL语句和一个二维数组,数组的每一行代表一组参数值,对应SQL语句中的占位符。

例如,假设有以下SQL语句:

INSERT INTO users (id, name, age) VALUES (?, ?, ?)

可以使用batchUpdate()方法批量插入多条用户数据,代码如下:

public void batchInsertUsers(List<User> userList) {String sql = "INSERT INTO users (id, name, age) VALUES (?, ?, ?)";List<Object[]> batchArgs = new ArrayList<>();for (User user : userList) {Object[] args = {user.getId(), user.getName(), user.getAge()};batchArgs.add(args);}jdbcTemplate.batchUpdate(sql, batchArgs);
}

在这个例子中,我们首先定义了SQL语句和一个空的 batchArgs 列表,然后遍历 userList,将每个用户的三个参数(id、name、age)打包成一个数组,再将这个数组添加到 batchArgs 列表中。最后调用 batchUpdate() 方法执行批量插入操作。

需要注意的是,我们可以使用同一个 batchUpdate() 方法批量执行多个SQL语句,只需传入多个SQL语句和对应的参数二维数组即可。但是要注意SQL语句的参数占位符数量必须与参数数组中每个一维数组的长度相等,否则会抛出异常。

execute() 

JdbcTemplate的execute()方法用于执行任意的SQL语句,它的返回值是一个布尔类型,表示执行SQL语句是否成功。

下面是execute()方法的用法示例:

jdbcTemplate.execute("CREATE TABLE users (id INT, name VARCHAR(255))");

上面的示例中,我们使用JdbcTemplate的execute()方法来执行了一个SQL语句,该语句用于创建一个名为“users”的表,表中包含id和name两个列。

除了创建表之外,execute()方法还可以用于执行其他任意的SQL语句,如插入、更新、删除等操作。

需要注意的是,execute()方法不支持参数化SQL语句,因此在使用时需要注意防止SQL注入攻击。如果需要执行参数化SQL语句,应该使用JdbcTemplate的update()方法。

除了以上方法,JdbcTemplate 还提供了一些高级用法,比如命名参数、批量操作、存储过程等,接下来做下具体的用法说明:

命名参数

JdbcTemplate 的命名参数用法可以让 SQL 语句中的参数使用具有可读性和可维护性的名称来代替使用 "?" 占位符。以下是使用 JdbcTemplate 命名参数的步骤:

a.在 SQL 语句中使用命名参数,格式为 ":参数名",例如:

String sql = "SELECT * FROM users WHERE username = :username AND age > :age";

b.在使用 JdbcTemplate 执行 SQL 语句时,使用 Map 类型的参数集合来替代 "?" 占位符,键值对中的键即为命名参数名,值为参数值,例如:

Map<String, Object> paramMap = new HashMap<>();
paramMap.put("username", "john");
paramMap.put("age", 18);
jdbcTemplate.query(sql, paramMap, rowMapper);

c.可以使用 NamedParameterJdbcTemplate 类来简化上述操作,例如:

NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jdbcTemplate);
namedParameterJdbcTemplate.query(sql, paramMap, rowMapper);

使用 JdbcTemplate 命名参数可以更直观地表达 SQL 语句的含义,并且可以避免因为参数顺序导致传参错误的情况。

批量操作

JdbcTemplate提供了批量操作的功能,可以大大提高SQL语句的执行效率。以下是JdbcTemplate批量操作的用法:

a.批量插入操作:

public void batchInsert(List<User> userList){jdbcTemplate.batchUpdate("insert into user(username,password,age) values(?,?,?)",new BatchPreparedStatementSetter() {@Overridepublic void setValues(PreparedStatement ps, int i) throws SQLException {ps.setString(1,userList.get(i).getUsername());ps.setString(2,userList.get(i).getPassword());ps.setInt(3,userList.get(i).getAge());}@Overridepublic int getBatchSize() {return userList.size();}});
}

b.批量更新操作:

public void batchUpdate(List<User> userList){jdbcTemplate.batchUpdate("update user set age=? where id=?",new BatchPreparedStatementSetter() {@Overridepublic void setValues(PreparedStatement ps, int i) throws SQLException {ps.setInt(1,userList.get(i).getAge());ps.setLong(2,userList.get(i).getId());}@Overridepublic int getBatchSize() {return userList.size();}});
}

c.批量删除操作:

public void batchDelete(List<Long> idList){jdbcTemplate.batchUpdate("delete from user where id=?",new BatchPreparedStatementSetter() {@Overridepublic void setValues(PreparedStatement ps, int i) throws SQLException {ps.setLong(1,idList.get(i));}@Overridepublic int getBatchSize() {return idList.size();}});
}

以上代码中,jdbcTemplate为Spring提供的操作数据库的工具类,BatchPreparedStatementSetter是JdbcTemplate提供的回调接口,用于设置批量操作的参数。在setValues()方法中设置参数,getBatchSize()方法返回批量操作的数据条数。使用jdbcTemplate.batchUpdate()方法执行批量操作。

需要注意的是,以上批量操作都是一次性提交到数据库中执行的,如果数据量过大,可能会导致内存溢出,因此建议将数据分成若干个批次进行操作。

存储过程

使用JdbcTemplate执行存储过程的步骤如下:

a.创建JdbcTemplate对象:

JdbcTemplate jdbcTemplate = new JdbcTemplate(datasource);
b.定义存储过程参数:
SqlParameter param1 = new SqlParameter(Types.VARCHAR);
SqlParameter param2 = new SqlParameter(Types.INTEGER);

c.定义存储过程返回值:

SqlOutParameter outParam = new SqlOutParameter("out_param_name", Types.VARCHAR);

d.定义存储过程:

SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate).withProcedureName("procedure_name").declareParameters(param1, param2, outParam);

e.执行存储过程:

Map<String, Object> inputParams = new HashMap<>();
inputParams.put("input_param1", value1);
inputParams.put("input_param2", value2);Map<String, Object> output = jdbcCall.execute(inputParams);
String outValue = (String) output.get("out_param_name");
其中,inputParams为存储过程的输入参数,output为存储过程的返回值。对于存储过程的返回值,可以通过get方法获取。

相关文章:

[springboot]菜鸟学习- JdbcTemplate用法浅尝

JdbcTemplate 是 Spring Framework 提供的一个非常强大的 JDBC 工具类&#xff0c;它可以显著简化 JDBC 编程的代码量&#xff0c;并提供了许多便捷的方法来执行 SQL 查询、更新等操作。 使用 JdbcTemplate 的步骤如下&#xff1a; 1. 创建 JdbcTemplate 对象&#xff1a;可以…...

11.无监督学习之主成分分析

11.1 降维 降维的两种应用&#xff1a;一是数据压缩&#xff1b;二是可视化数据。 11.1.1 数据压缩 将相关性强的两个特征导致冗余&#xff0c;可以直接去掉其中一个特征&#xff0c;或者将两个特征进行某种转换&#xff0c;得到一个特征。 11.1.2 可视化数据 直接看数据可…...

「HTML和CSS入门指南」figcaption 标签详解

什么是 figcaption 标签? 在 HTML 中,figcaption 标签用于为与 figure 元素相关的媒体内容提供说明性文本。通常用于包含图像、音频或视频等媒体元素的说明文本。 figcaption 标签的基本语法 以下是 figcaption 标签的基本语法: <figure><!-- 在这里放置您的媒体…...

电子企业实施数字化工厂建设之前,需要注意哪些

随着工业4.0时代的到来&#xff0c;数字化工厂建设已成为越来越多电子企业的重要议题。数字化工厂管理系统能够提高生产效率、降低成本、提高产品质量等多个方面的优势&#xff0c;对于企业的可持续发展具有重要意义。然而&#xff0c;在实施电子企业数字化工厂建设之前&#x…...

迅捷pdf实现多页插入

之前我们使用福昕阅读器实现了在每一页插入logo 这里我们用迅捷pdf再来一次&#xff0c;别问&#xff0c;问就是公司买了会员 首先声明&#xff0c;这里已经有会员了&#xff0c;所以不知道别人操作是不是需要会员&#xff0c;担心的话可以看看上一篇福昕阅读器版本 打开编辑…...

调用阿里云API实现证件照生成

目录 1. 作者介绍2. 算法介绍2.1 阿里云介绍2.2 证件照生成背景2.3 图像分割算法 3.调用阿里云API进行证件照生成实例3.1 准备工作3.2 实验代码3.3 实验结果与分析 参考&#xff08;可供参考的链接和引用文献&#xff09; 1. 作者介绍 王逸腾&#xff0c;男&#xff0c;西安工…...

PHP 转换 excel中读取的时间

首先&#xff0c;我们需要知道PHPExcel的时间和日期格式是以Excel内部的“1900年1月1日”为基础&#xff0c;以天为单位来计算的。即Excel日期与PHP时间戳之间存在一个时间偏移量。通过查阅PHPExcel的官方文档&#xff0c;我们可以得到以下的计算公式&#xff1a; // 读取exce…...

Cmake工具的简单使用

引言 本篇文章讲述如何简单的使用cmake工具构建一个项目&#xff0c;帮助入门的c新手学会如何使用cmake. 我们在Clion新创建一个项目时&#xff0c;会发现&#xff0c;除了main.cpp文件之外&#xff0c;还存在一个build-debug目录和一个CMakelists.txt文件&#xff0c;如图: …...

html选择器

基本选择器 基本选择器 : 标签选择器 , 类选择器 , ID选择器 标签选择器 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEed…...

Leetcode 剑指 Offer II 030. 插入、删除和随机访问都是 O(1) 的容器

题目难度: 中等 原题链接 今天继续更新 Leetcode 的剑指 Offer&#xff08;专项突击版&#xff09;系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~ 题目描述 设计一个支持在平均 时间复杂度 O(1) 下&#xff0c;执行以下操作…...

django实现读取数据导出生成excel表格

目录 一、简单示例&#xff1a; 1.创建文件对象&#xff1a; 2.添加工作表&#xff1a; 3.写入数据&#xff1a; 二、实践出真理 需要先安装xlwt模块 pip install -i https://pypi.douban.com/simple xlwt一、简单示例&#xff1a; import xlwt# 创建一个Excel文件对象 …...

DevOps系列文章之 Docker-compose

一&#xff0c;Docker-compose全集 1&#xff0c;Docker-compose简介 Docker-Compose项目是Docker官方的开源项目&#xff0c;负责实现对Docker容器集群的快速编排。 Docker-Compose将所管理的容器分为三层&#xff0c;分别是工程&#xff08;project&#xff09;&#xff0c…...

Vue Router入门:轻松构建单页应用程序

Vue.js是一种流行的前端JavaScript框架,可以让开发人员轻松构建动态用户界面。Vue.js的一个关键特性是其路由系统,它使得开发人员可以轻松创建具有多个视图和页面的单页应用程序(SPA)。在本文中,我们将探讨如何使用Vue Router在Vue.js中构建SPA。我们将介绍如何安装和配置…...

ITSM 如何帮助制造业企业

ITSM在现代制造业中的作用 在过去的几年中&#xff0c;制造业已经看到了快速的数字化&#xff0c;以智能制造技术改进生产技术。在工业4.0和工业5.0的推动下&#xff0c;制造商正在摆脱陈旧 以及利用物联网、人工智能、机器学习和大数据等先进技术的互联智能制造系统&#xff…...

leecode

leecode20&#xff0c;有效的括号&#xff0c;栈 class Solution:def isValid(self, s: str) -> bool:def check(ch1,ch2):if ch1 [ and ch2 ]:return Trueelif ch1 ( and ch2 ):return Trueelif ch1 { and ch2 }:return Trueelse:return Falsestack []for i in ran…...

2023-06-09 LeetCode每日一题(修改图中的边权)<未来补全>

2023-06-09每日一题 一、题目编号 2699. 修改图中的边权二、题目链接 点击跳转到题目位置 三、题目描述 给你一个 n 个节点的 无向带权连通 图&#xff0c;节点编号为 0 到 n - 1 &#xff0c;再给你一个整数数组 edges &#xff0c;其中 edges[i] [ai, bi, wi] 表示节点…...

Linux 应用程序信号量使用实战

背景 在项目实施过程中&#xff0c;有个机制需要做两个线程之间的同步。 具体需求如下&#xff1a; 首先&#xff0c;线程1需要把资源读取到缓存 其次&#xff0c;线程2才可以操作这块缓存 上述两个动作顺序交替重复。 思路 使用信号量解决思路&#xff0c;申请两个信号…...

【Java多线程进阶】synchronized工作原理

前言 本期讲解 synchronized 工作的原理以及常见的锁优化机制&#xff0c;相信大家在看完这篇博文后对 synchronized 工作流程有一定的理解。话不多说&#xff0c;让我们快速进入学习吧~ 目录 1. 锁的工作流程 2. 偏向锁 3. 轻量级锁和重量级锁 3.1 轻量级锁 3.2 重量级锁…...

C语言经典题目(三)

C站的小伙伴们&#xff0c;大家好呀&#xff01;&#x1f60a;&#x1f60a;✨✨这一篇是C语言之经典题目篇&#xff0c;除程序设计&#xff0c;还有一些不错的程序分析&#xff0c;快来和我一起进入C语言的世界吧&#xff01;✨✨✨ &#x1f495;C语言其他刷题篇在这里哦&…...

九、(补充文章四)Arcgis实现深度学习训练样本数据的批量制作——只靠原图+shp如何批量制作样本图片

之前写了一些个深度学习系列文 其中先是单张样本的制作方法 最后通过构造模型批量处理 大大提高了生成样本的速度 四、Arcgis实现深度学习河流训练样本数据的制作(使用软件批量获取样本图片)——对已经获取到的完整面状样本数据进行处理 但是这个方法不仅仅需要shp和原图 还需要…...

MKS SERVO4257D 闭环步进电机_系列8 CAN通讯示例

第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口&#xff0c;支持MODBUS-RTU通讯协议&#xff0c;内置高效FOC矢量算法&#xff0c;采用高精度编码器&#xff0c;通过位置反馈&a…...

UnityVR--组件9--视频组件VideoPlayer

目录 前言 参数解释 RenderMode渲染方式 VideoPlayer类中的API 前言 在之前的VR场景中已经使用过VideoPlayer播放视频&#xff08;Unity.UI的交互&#xff08;6&#xff09;-播放视频&#xff09;&#xff0c;不过在VR中设置是有些不同的&#xff0c;这里更详细地说明一下V…...

Java 深拷贝和浅拷贝

Java 中的深拷贝和浅拷贝是针对对象复制而言的。 浅拷贝&#xff08;Shallow Copy&#xff09; 当对象进行浅拷贝时&#xff0c;只会复制对象本身和其中的基本数据类型属性&#xff0c;而不会复制引用对象的实际内容。具体而言&#xff0c;浅拷贝只会创建一个新的对象&#x…...

[ruby on rails] docker

docker安装 ubuntu14.04后自带docker安装包&#xff0c;可以直接安装 sudo apt-get updatesudo apt-get install -y docker.io# 安装后启动sudo service docker start查看docker信息 docker infodocker命令 sudo service docker start sudo service docker stop sudo servic…...

网络协议——STP协议是什么?是如何实现的?

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 一、STP协议是什么 二、为什么需要STP协议 三、STP的实现过程 ​编辑 1、选举跟桥 2、给非跟桥交换机选举跟端口 3、给每个网段选…...

【C++】智能指针 学习总结 |std::shared_ptr |std::unique_ptr | std::weak_ptr

文章目录 前言一、智能指针介绍二、普通指针和智能指针的比较案例三、std::shared_ptr四、std::unique_ptr五、std::weak_ptr六、std::shared_ptr |std::unique_ptr | std::weak_ptr三大智能指针的区别 前言 参考答案&#xff1a;chatgpt 一、智能指针介绍 智能指针是C的一种…...

iptables防火墙

文章目录 一.linux防火墙基础1.linux 包过滤防火墙概述1.1netfilter1.2 iptables 2.包过滤的工作层次2.1 通信的五元素和四元素 3.iptables 的表、链结构3.1 规则链3.2 默认包括5种规则链3.3 规则表3.4 默认包括4个规则表 二.数据包过滤的匹配流程1.规则表之间的顺序2.规则链之…...

properties、yaml作为配置文件的特点

说明&#xff1a;在软件开发中&#xff0c;经常需要把一些配置写在文件中&#xff0c;如数据库配置、MyBatis配置等。这样&#xff0c;后续如果数据库参数有改动&#xff0c;就可以避免直接对代码做修改&#xff0c;只要修改配置文件中关于数据库的配置。关于配置文件的选择&am…...

JavaSE-03 【流程控制语句】

文章目录 JavaSE-03 【流程控制语句】第一章 流程控制1.1 流程概述1.2 顺序结构 第二章 判断语句2.1 判断语句---if2.2 判断语句---if...else2.3 判断语句---if...else if ... else 第三章 选择语句3.1 选择语句--switch3.2 case的穿透性 第四章 循环语句4.1 循环概述4.2 循环语…...

笔记本电脑的BIOS是怎么保护安全的?

随着攻防技术的不断演进&#xff0c;像BIOS攻击、高级网络代码攻击等手段层出不穷&#xff0c;“受害者”也不仅限于企业级服务器、存储&#xff0c;很多魔爪也开始伸向了拥有商业机密数据的PC。 BIOS是Basic Input/Output System&#xff08;基本输入/输出系统&#xff09;的…...

做网站的协议书和计划书/seo网站关键词优化

【题目描述】 乔治有一些同样长的小木棍&#xff0c;他把这些木棍随意砍成几段&#xff0c;直到每段的长都不超过50。 现在&#xff0c;他想把小木棍拼接成原来的样子&#xff0c;但是却忘记了自己开始时有多少根木棍和它们的长度。 给出每段小木棍的长度&#xff0c;编程帮他找…...

wordpress响应式中文/在线检测网站安全

有术无道止于术&#xff0c;有道无术术尚可求 Shutout to 马士兵、李卫民向所有开发者致敬第一章 Hello World 第一代编程语言&#xff1a;打孔机&#xff0c;老师都没有见过第二代编程语言&#xff1a;汇编&#xff0c;比较难第三代编程语言&#xff1a;面向过程语言三代半&am…...

泉州网站建设泉州/山东关键词优化联系电话

本周主要复习了高数&#xff0c;感觉掌握了忘的比较快&#xff0c;所以在前几天主要是看了知识点&#xff0c;以及书上的例题&#xff0c;后几天就找了一些题做&#xff0c;物理在下周五考&#xff0c;中间的时间间隔较长&#xff0c;所以准备考完高数再复习。 而且上周的模拟考…...

wordpress定时发布失败/谷歌浏览器网页版入口手机版

背景&#xff1a;本人是一名开发人员&#xff0c;本地小程序上的需要地图导航到手机上&#xff0c;所以找到一个mac&#xff08;m1&#xff09;安装安卓模拟器的方案&#xff0c;这里记录分享一下。 废话不多说直接上步骤&#xff0c;很详细跟着步骤走就能完成&#xff01;&am…...

企业如何做网站建站/指数函数和对数函数

Linux——匿名管道的详解1.进程间通信的概念2.匿名管道2.1匿名管道的本质2.2匿名管道的创建方法及其数据拷贝过程2.3管道中数据的生命周期2.4管道的存储数据的容量2.5将管道写端和读端分别设置为非阻塞属性1.进程间通信的概念 什么是进程间通信&#xff1f; 进程间通信就是在不…...

我想学做网站/重庆排名优化整站优化

通过对全球2944位首席信息官的年度调查&#xff0c;全球领先的信息技术研究和顾问公司Gartner发现人们现已深处数字商业时代&#xff0c;许多企业正根据数字化能力重构业务与运营模式。本文探讨了2016年中国首席信息官议程的三项主要调查结果&#xff0c;此次调查包含来自中国8…...