[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() {
                @Override
                public 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());
                }

                @Override
                public int getBatchSize() {
                    return userList.size();
                }
            });
}
 

b.批量更新操作:

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

                @Override
                public int getBatchSize() {
                    return userList.size();
                }
            });
}
 

c.批量删除操作:

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

                @Override
                public 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方法获取。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么中国大公司不开发 Linux 桌面应用?

我们Linux平台C端的业务&#xff0c;也就是给大家提供的Linux的个人版本。目前真的是靠爱发电了&#xff0c;逃&#xff09; 更爱的是&#xff0c;我们不只是提供了X64平台&#xff0c;更是提供了Arm&#xff0c;MIPS64平台的二进制包。 估计国内在Linux平台首发新功能的桌面应…

asp.net高校食谱管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net高校食谱管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言 开发 asp.net高校食谱管理系统VS开发s…

Pytest自动化测试框架生成allure的报告

一、前言 最近通过群友了解到了allure这个报告&#xff0c;开始还不以为然&#xff0c;但还是逃不过真香定律。 经过试用之后&#xff0c;发现这个报告真的很好&#xff0c;很适合自动化测试结果的展示。下面说说我的探索历程吧。 选用的项目为Selenium自动化测试Pytest框架实…

为什么要使用微软的 Application Framework?

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天来看一下我们为什么要使用微软的 Application Framework&#xff1f; 虽然Application Framework 并不是新观念&#xff0c;它们却在最近数年才成为 PC 平台上软件开发的主流工具。面向对象语言是具体实…

【活动访谈】发力数字基座 推动物联创新—航天科技控股集团AIRIOT4.0平台发布会活动专访

近日&#xff0c;由航天科技控股集团股份有限公司主办的“数字基座 智慧物联—AIRIOT4.0平台发布会”在北京圆满落幕。航天三院科技委总工程师王连宝应邀出席本次会议并接受媒体采访&#xff0c;共同参与访谈的还有AIRIOT产品研发创始人、航天科技控股集团股份有限公司智慧物联…

SpringCloud第三篇:GateWay服务网关

一、为什么需要服务网关&#xff1a; 1、什么是服务网关 传统的单体架构中只需要开放一个服务给客户端调用&#xff0c;但是微服务架构中是将一个系统拆分成多个微服务&#xff0c;如果没有网关&#xff0c;客户端只能在本地记录每个微服务的调用地址&#xff0c;当需要调用的…

【连续介质力学】变形梯度

变形梯度 简介 本节讨论两个不同质点P和Q的之间的相对运动变化 拉伸比和相对伸长 d X ⃗ d\vec X dX : 在参考构形连接质点P和Q的向量&#xff0c;线单元 M ^ \hat M M^: d X ⃗ d\vec X dX 方向的单位向量 d x ⃗ d\vec x dx : 在当前构形连接质点P’和Q‘的向量&#xff…

简要介绍 | 计算机视觉中的开放词汇:挑战与未来

注1&#xff1a;本文系“简要介绍”系列之一&#xff0c;仅从概念上对计算机视觉中的开放词汇(open vocabulary)进行非常简要的介绍&#xff0c;不适合用于深入和详细的了解。 注2&#xff1a;"简要介绍"系列的所有创作均使用了AIGC工具辅助 计算机视觉中的开放词汇&…

深入理解Java虚拟机jvm-对象的内存布局

对象的内存布局 对象头&#xff08;Header&#xff09;实例数据&#xff08;Instance Data&#xff09;对齐填充&#xff08;Padding&#xff09; 在HotSpot虚拟机里&#xff0c;对象在堆内存中的存储布局可以划分为三个部分&#xff1a;对象头&#xff08;Header&#xff09;、…

jenkins用户权限管理

环境准备: 登录jenkins: http://192.168.9.190:8091/ admin asdwhl@0 一、用户权限插件安装 1、Dashboard > Manage Jenkins > Manage Plugins > Available(可选插件) 依次安装: Role-based Authorization Strategy Authorize Project

【Git】git push origin master时发生的各类错误汇总

文章目录 一、常见的git命令二、错误一三、错误二四、错误三五、问题解决 一、常见的git命令 使用 git 命令时&#xff0c;您可以执行一系列操作来管理代码仓库。下面是一些常用的 git 命令及其功能&#xff1a; git init: 在当前目录初始化一个新的 git 仓库。git clone <…

stm32超声波测距代码

操作思路&#xff1a; 初始化时将trig和echo端口都置低&#xff0c;首先向给trig 发送至少10 us的高电平脉冲&#xff08;模块自动向外发送8个40K的方波&#xff09;&#xff0c;然后等待&#xff0c;捕捉 echo 端输出上升沿&#xff0c;捕捉到上升沿的同时&#xff0c;打开定时…

Spark大数据处理学习笔记(3.2.2)掌握RDD算子

衔接上文&#xff1a;http://t.csdn.cn/Z0Cfj 文章目录 三、掌握行动算子3.1 归约算子 - reduce()3.2 采集算子 - collect()3.3 首元素算子 - first()3.4 计数算子 - count()3.5 按键计数算子 - countByKey()3.6 前截取算子 - take(n)3.7 排序前截取算子 - takeOrdered(n)[(ord…

vim实用功能汇总

文章目录 1. 读代码1.1 vim中文件跳转1.2 语法高亮模式1.3 Visual 模式 2. 配置vim成为python的IDE 1. 读代码 1.1 vim中文件跳转 vim中文件跳转 这个其实不是靠什么插件完成的&#xff0c;而是vim编辑器自带的功能把光标放在要跳转的文件上&#xff0c;按下gf&#xff0c;即…

加速应用迭代与更新:Weex与小程序容器的快速开发之道

Weex是一个跨平台的移动应用开发框架&#xff0c;由阿里巴巴旗下的阿里巴巴前端团队开发。它允许开发者使用单一的代码库来构建同时适用于iOS和Android平台的移动应用。Weex使用基于Vue.js的声明式语法来描述应用程序的界面&#xff0c;并通过JavaScript运行时引擎在移动设备上…

2023年中职组“网络安全”赛项南昌市竞赛任务书

2023年中职组“网络安全”赛项 南昌市竞赛任务书 网络空间安全赛项规程 一、赛项名称 赛项名称&#xff1a;网络空间安全 赛项组别&#xff1a;中职组 二、竞赛目的 通过竞赛&#xff0c;检验参赛选手对网络、服务器系统等网络空间中各个信息系统的安全防护能力&#xff0…

Python学了基本语法 下一步该干什么 ?

刚入门Python,学习了基本语法后&#xff0c;你可以开始编写简单的程序了。接下来&#xff0c;你可以学习Python的标准库和第三方库&#xff0c;掌握更多的编程技巧和知识&#xff0c;提高自己的编程能力。同时&#xff0c;也可以通过实践项目来巩固所学知识&#xff0c;提高自己…

接口测试和功能测试的区别

目录 前言&#xff1a; 一、测试目的不同 二、测试内容不同 三、测试重点不同 四、总结 前言&#xff1a; 接口测试和功能测试是软件测试中的两种不同类型。接口测试侧重于测试不同模块之间的接口&#xff0c;而功能测试则注重测试完整的业务功能。 一、测试目的不同 接…

【实战】minigpt4的体验和微调

MiniGPT-4 https://github.com/vision-cair/minigpt-4 1 环境配置 1.1 安装环境 git lfs install //如果报错 &#xff1a;git: lfs is not a git command. See git --help. //尝试使用&#xff1a; sudo apt-get install git-lfs git lfs install1.2 准备Vicuna权重 &…

专访泛境科技:如何借助3DCAT实时云渲染打造元宇宙解决方案

随着5G、VR/AR等技术的发展&#xff0c;元宇宙&#xff08;Metaverse&#xff09;这一概念越来越受到关注。元宇宙是一个由虚拟世界构成的网络空间&#xff0c;其中人们可以通过数字化的身份和形象进行各种社交、娱乐、创作和商业活动。元宇宙的核心是虚拟场景&#xff0c;它是…
最新文章