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

【SpringBoot初级篇】JdbcTemplate常用方法

【SpringBoot初级篇】JdbcTemplate常用方法

  • JdbcTemplate 查询
  • JdbcTemplate 插入、更新、删除
  • execute执行任意的SQL
  • NamedParameterJdbcTemplate

函数场景说明
update(String sql, @Nullable Object… args)增,删,改
queryForObject(sql, Integer.class)查询返回某个值
queryForObject(sql, new BeanPropertyRowMapper<>(User.class), 1)查询返回的是某个对象、BeanPropertyRowMapper返回自定义对象
query(sql, new BeanPropertyRowMapper<>(User.class))查询返回的是某个集合
queryForMap(sql)查询返回的是map

JdbcTemplate 查询

1、查询记录条数

String sql = "select count(*) from tb_user";
int count = jdbcTemplate.queryForObject(sql, Integer.class);

2、按条件查询记录条数,通过?参数绑定

String sql = "select count(*) from tb_user where username = ?";
int count = jdbcTemplate.queryForObject(sql, Integer.class, "Tom");或者String sql = "select count(*) from tb_user where username = ?";
Object[] params = new Object[]{"Tom"};
int count = jdbcTemplate.queryForObject(sql, params, Integer.class);

3、查询多个字段,返回一个Map

String sql = "select user_id, username, age from tb_user where user_id = ?";
Object[] params = new Object[]{"46a8247fbffc46c3a591961351fa3277"};
Map<String, Object> resultMap = jdbcTemplate.queryForMap(sql, params);

4、查询多条数据,每条数据都以Map形式返回,整个结果是List<Map<String, Object>>

String sql = "select user_id, username, age from tb_user where age = ?";
Object[] params = new Object[]{25};
List<Map<String, Object>> resultMapList = jdbcTemplate.queryForList(sql, params);

5、查询单条数据并通过RowMapper映射成实体对象

String sql = "select user_id, username, mobile, create_time from tb_user where user_id = ?";
Object[] params = new Object[]{"0ff5771760c1483abaefa7a3e530ea6d"};
User user = jdbcTemplate.queryForObject(sql, params,new RowMapper<User>() {@Overridepublic User mapRow(ResultSet rs, int rowNum) throws SQLException {// 在这里做字段到实体的映射User u = new User();u.setUserId(rs.getString("user_id"));u.setUsername(rs.getString("username"));u.setMobile(rs.getString("mobile"));u.setCreateTime(rs.getTimestamp("create_time"));return u;}});

6、查询对象集合

String sql = "select user_id, username, mobile, create_time from tb_user where username = ?";
Object[] params = new Object[]{"相同的用户名"};
List<User> users = jdbcTemplate.query(sql, params,new RowMapper<User>() {@Overridepublic User mapRow(ResultSet rs, int rowNum) throws SQLException {User u = new User();u.setUserId(rs.getString("user_id"));u.setUsername(rs.getString("username"));u.setMobile(rs.getString("mobile"));u.setCreateTime(rs.getTimestamp("create_time"));return u;}});

7、将字段到实体映射抽出来单独维护

通常在应用中,字段到实体的映射只需要编写一份来维护,因此前边的两例中的User映射可以单独抽出来成为一个UserRowMapper类:

public class UserRowMapper implements RowMapper<User> {@Overridepublic User mapRow(ResultSet rs, int rowNum) throws SQLException {User u = new User();u.setUserId(rs.getString("user_id"));u.setUsername(rs.getString("username"));u.setMobile(rs.getString("mobile"));u.setCreateTime(rs.getTimestamp("create_time"));return u;}
}

然后在使用的时候创建就行了:

String sql = "select user_id, username, mobile, create_time from tb_user where username = ?";
List<User> users = jdbcTemplate.query(sql, new Object[]{"相同的用户名"}, new UserRowMapper());

8、插入数据并返回生成的uuid主键

String sql = "insert into tb_user (username, mobile, create_time, age) values(?, ?, ?, ?)";// KeyHolder保存返回的数据,可以指定返回的列
KeyHolder keyHolder = new GeneratedKeyHolder();jdbcTemplate.update(new PreparedStatementCreator() {@Overridepublic PreparedStatement createPreparedStatement(Connection con) throws SQLException {// 指定返回的属性列名为user_idPreparedStatement ps = con.prepareStatement(sql, new String[]{"user_id"});// 插入的数据ps.setString(1, "新用户");ps.setString(2,"12345678");ps.setTimestamp(3, new Timestamp(System.currentTimeMillis()));ps.setInt(4, 28);return ps;}
}, keyHolder);// 输出生成的uuid
System.out.println(keyHolder.getKeys().get("user_id"));

JdbcTemplate 插入、更新、删除

JdbcTemplate中,数据的插入、更新、删除操作都是通过update(...)来完成的。

1、插入单条数据

String sql = "insert into tb_user(user_id, username, mobile, create_time) values (?, ?, ?, ?)";
Object[] params = new Object[]{uuid(), "新用户", "134578546", new Date()};
int successCount = jdbcTemplate.update(sql, params);

2、批量插入

String sql = "insert into tb_user(user_id, username, mobile, create_time) values (?, ?, ?, ?)";
List<Object[]> params = new ArrayList<>();
params.add(new Object[]{uuid(), "新用户1", "134578546", new Date()});
params.add(new Object[]{uuid(), "新用户2", "134578546", new Date()});
int[] successCounts = jdbcTemplate.batchUpdate(sql, params);

3、更新单条数据

String sql = "update tb_user set username = ? where user_id = ?";
Object[] params = new Object[]{"更新用户名", "a7e7c5b4750945249d3da9c543f3fe43"};
int successCount = jdbcTemplate.update(sql, params);

4、批量更新

String sql = "update tb_user set username = ? where user_id = ?";
List<Object[]> params = new ArrayList<>();
params.add(new Object[]{"更新用户名1", "0ff5771760c1483abaefa7a3e530ea6d"});
params.add(new Object[]{"更新用户名2", "4e88b38660324334be61f0c9b2edd7f6"});
int[] successCounts = jdbcTemplate.batchUpdate(sql, params);

5、删除单条数据

String sql = "delete from tb_user where user_id = ?";
Object[] params = new Object[]{"a7e7c5b4750945249d3da9c543f3fe43"};
int successCount = jdbcTemplate.update(sql, params);

6、批量操作

public void removeByIds(String[] rids, Integer year) {String deleteSQL = "delete from nt_budget_income_plan where  ADMDIV_CODE = ? and year = ? and ID = ?";// 设置预编译参数jdbcTemplate.batchUpdate(deleteSQL, new BatchPreparedStatementSetter() {@Overridepublic void setValues(PreparedStatement ps, int i) throws SQLException {String rid = rids[i];ps.setString(1, SessionUtil.getSession().getAdmdivCode());ps.setInt(2, year);ps.setLong(3, Long.parseLong(rid));}@Overridepublic int getBatchSize() {return rids.length;}});
}

execute执行任意的SQL

可以通过execute(..)执行任何SQL,一般用来执行DDL语句

String sql = "create table new_table (id varchar(32), name varchar(100))";
jdbcTemplate.execute(sql);

NamedParameterJdbcTemplate

在使用JdbcTemplate的时候,如果要使用参数,那么需要通过在SQL中使用?做占位符。

NamedParameterJdbcTemplate提供了一个更加直观的方式来定义SQL中的占位符,即通过:变量名的形式。

可以通过Map或者BeanPropertySqlParameterSource传递参数值:

Map直接设置参数值;

String sql = "select count(*) from tb_user where username = :username and age = :age";
Map<String, Object> params = new HashMap<>(2);
params.put("username", "Michael");
params.put("age", 25);
Integer count = namedParameterJdbcTemplate.queryForObject(sql, params, Integer.class);

其他方法同JdbcTemplate类似

相关文章:

【SpringBoot初级篇】JdbcTemplate常用方法

【SpringBoot初级篇】JdbcTemplate常用方法JdbcTemplate 查询JdbcTemplate 插入、更新、删除execute执行任意的SQLNamedParameterJdbcTemplate函数场景说明update(String sql, Nullable Object… args)增&#xff0c;删&#xff0c;改queryForObject(sql, Integer.class)查询返…...

React(三):脚手架、组件化、生命周期、父子组件通信、插槽、Context

React&#xff08;三&#xff09;一、脚手架安装和创建1.安装脚手架2.创建脚手架3.看看脚手架目录4.运行脚手架二、脚手架下从0开始写代码三、组件化1.类组件2.函数组件四、React的生命周期1.认识生命周期2.图解生命周期&#xff08;1&#xff09;Constructor&#xff08;2&…...

[教程]使用 Git 克隆指定分支

Git 是我们开发过程中经常使用到的版本管理工具,在平常情况下我们从远程克隆的时候会将整个库克隆下来&#xff0c;这会包括整个版本库的历史提交记录和远程库里的所有分支。但在一些情况下&#xff0c;比如我们并不需要查看历史提交记录而只是希望能够获取到最新的代码&#x…...

Redis实现服务注册与服务发现源码阅读(Go语言)

Redis实现服务注册与服务发现源码阅读 背景 近期在看开源项目CloudWeGo中看到目前GoLang微服务框架Hertz中支持通过Redis实现服务注册与服务发现功能。便想着阅读下源码 源码阅读 gut clone了hertz-contrib后看到在一级目录下有目前各种主流的服务注册与发现的实现方案。为…...

论文复现-3

模型构建中的运算 数据集是CONLL03 这个数据集共有4种实体类型&#xff0c;所以&#xff0c;在做实体描述的embedding时&#xff0c;得到的语义表示的Tensor大小为 &#xff1a; 4*max_len, 具体指的是&#xff1a; type_input_ids: torch.LongTensor None, type_attention_m…...

667知识点 | 经过三年实战检验的667知识清单

文章目录 前言第一章 信息与信息资源第二章 信息社会第三章 信息交流第四章 信息技术第五章 信息组织第六章 信息管理活动第七章 信息资源人文管理第八章 信息资源经济管理第九章 信息资源系统管理第十章 信息资源管理专门化前言 参考书目:《信息管理导论(第三版)》党跃武推…...

后端快速上手前端三剑客 HtmlCSSJavaScript

文章目录前言HTML1.基础标签2.多媒体标签&#xff1a;3.表格&列表&布局4.表单CSS1.简介2.导入方式3.选择器JavaScript1.简介2.引入方式3.基本语法4.对象(1) 基本对象(2) BOM对象(3) DOM对象5.事件前言 结构&#xff1a;HTML 表现&#xff1a;CSS 行为&#xff1a;Java…...

Cdiscount、Allegro如何利用测评补单自养号提升店铺权重和流量

Allegro成立于 1999 年是在波兰最受欢迎的电商平台&#xff0c;75%的波兰人都知道该网站&#xff0c;Allegro的品牌认知度在波兰高达98%。Allegro平台卖家的数量目前还是比较少的约为13万&#xff0c;最重要的就是中国卖家占比少&#xff0c;所以竞争也比较低&#xff0c;像是美…...

第16天-性能压测:压力测试,性能监控,优化QPS,Nginx动静分离

1.性能监控 1.1.JVM架构 运行时数据区&#xff1a; 方法区&#xff1a;最重要的内存区域&#xff0c;多线程共享&#xff0c;保存了类的信息&#xff08;名称、成员、接口、父类&#xff09;&#xff0c;反射机制是重要的组成部分&#xff0c;动态进行类操作的实现&#xff1b;…...

【python 基础篇 十一】python的函数-------函数的偏函数 高阶函数 返回函数 匿名函数 闭包

目录1.偏函数2.高阶函数3.返回函数4.匿名函数5.闭包1.偏函数 概念 ​ 当我们写一个参数比较多的函数时&#xff0c;如果有些参数&#xff0c;大部分场景下都是某一个固定值&#xff0c;那么为了简化使用&#xff0c;就可以创建一个新函数&#xff0c;指定我们要使用的函数的某个…...

妇女节到了,祝福所有女神 Happy Women‘s Day!

在每年&#xff13;月&#xff18;日人们庆祝妇女节 &#xff37;omens Day is cllebrated on March 8 every year.国际妇女节(IWD)&#xff0c;中国内地称“三八”国际劳动妇女节或国际劳动妇女节。是在每年的3月8日为庆祝妇女在经济、政治和社会等领域作出的重要贡献和取得的…...

etcd集群通过 Leader 写入数据,为什么K8s HA集群中讲每个 kube-apiserver 只和本机的 ETCD 通信

写在前面 对这个我不太明白&#xff0c;所有在 stackOverflow 的请教了大佬这里分享给小伙伴理解不足小伙伴帮忙指正 对每个人而言&#xff0c;真正的职责只有一个&#xff1a;找到自我。然后在心中坚守其一生&#xff0c;全心全意&#xff0c;永不停息。所有其它的路都是不完整…...

HTML 表单

HTML 表单和输入 HTML 表单用于收集不同类型的用户输入。 在线实例 创建文本字段 (Text field) 本例演示如何在 HTML 页面创建文本域。用户可以在文本域中写入文本。 创建密码字段 本例演示如何创建 HTML 的密码域。 &#xff08;在本页底端可以找到更多实例。&#xff09; …...

HTML、CSS学习笔记5(移动端基础知识、Flex布局)

一、移动端基础知识 1.PC端和移动端区别 移动端&#xff1a;手机版网页&#xff0c;手机屏幕小&#xff0c;网页宽度多数为100%&#xff0c;没有版心 PC端&#xff1a;电脑版网页&#xff0c;屏幕大&#xff0c;网页固定版心 PC端和移动端不是同一个网页 2.如何在电脑里面…...

【Java学习笔记】2.Java 开发环境配置

Java 开发环境配置 在本章节中我们将为大家介绍如何搭建Java开发环境。 window系统安装java 下载JDK 首先我们需要下载 java 开发工具包 JDK&#xff0c;下载地址&#xff1a;https://www.oracle.com/java/technologies/downloads/&#xff0c;在下载页面中根据自己的系统选…...

MyBatis——进阶操作(2)

标签 if标签 当提交的表单中有些为非必填项&#xff0c;用户并没有上传这些属性的值&#xff0c;那么程序可以上传NUll&#xff0c;也可以用if标签判断用户有没有上传这个值 <if test"参数!null">操作 </if>其中test中填写一条语句&#xff0c;如果得…...

循环结构

循环结构循环结构一、课前问答二、while循环三、do-while循环四、for循环五、流程控制5.1 break5.2 continue循环结构 一、课前问答 1、switch支持的数据类型。 2、switch中break的作用。 3、多重if如果多个条件都成立&#xff0c;执行方式。 二、while循环 语法&#xff1a; …...

漫谈数据库表设计及索引设计

一.数据库表设计 在数据库表设计上有个很重要的设计准则&#xff0c;称为范式设计。 什么是范式设计&#xff1f; 范式来自英文Normal Form&#xff0c;简称NF。MySQL是关系型数据库&#xff0c;但是要想设计—个好的关系&#xff0c;必须使关系满足一定的约束条件&#xff0c…...

【JavaWeb】CSS基础知识:引入方式 + 选择器

CSS引入 CSS的引入有三种&#xff0c;三种的优缺点各不相同。 行内样式表 <!-- 行内样式表 --><!-- 相当于标签的一个属性 --><!-- 只对当前标签生效 --><!-- 优先级较高&#xff0c;会覆盖其他样式 --><p style"color: blue;">这是…...

02-前端-javaScript

文章目录JavaScript1&#xff0c;JavaScript简介2&#xff0c;JavaScript引入方式2.1 内部脚本2.2 外部脚本3&#xff0c;JavaScript基础语法3.1 书写语法3.2 输出语句3.3 变量3.3.1 全局变量var3.3.2 局部变量let3.3.3 常量const3.4 数据类型3.5 运算符3.5.1 \和区别 ▲3.5.2 …...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时&#xff0c;发现没有set类的方法&#xff0c;只有get&#xff0c;那么要改变tree值&#xff0c;只能遍历treeData&#xff0c;递归修改treeData的checked&#xff0c;发现无法更改&#xff0c;原因在于check模式下&#xff0c;子元素的勾选状态跟父节…...

CMake控制VS2022项目文件分组

我们可以通过 CMake 控制源文件的组织结构,使它们在 VS 解决方案资源管理器中以“组”(Filter)的形式进行分类展示。 🎯 目标 通过 CMake 脚本将 .cpp、.h 等源文件分组显示在 Visual Studio 2022 的解决方案资源管理器中。 ✅ 支持的方法汇总(共4种) 方法描述是否推荐…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...

Git常用命令完全指南:从入门到精通

Git常用命令完全指南&#xff1a;从入门到精通 一、基础配置命令 1. 用户信息配置 # 设置全局用户名 git config --global user.name "你的名字"# 设置全局邮箱 git config --global user.email "你的邮箱example.com"# 查看所有配置 git config --list…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...