【Spring实战】03 JDBC常用操作

文章目录

    • 1. JdbcTemplate 类
      • 1)queryForList
      • 2)update
      • 3)query
      • 4)execute
      • 5)queryForObject
    • 2.代码及执行
      • 1)代码
      • 2)执行
    • 3. 优点
    • 4. 详细代码
    • 总结

Spring JDBC 是 Spring 框架提供的一种用于简化数据库访问的机制。它建立在 JDBC(Java 数据库连接)之上,提供了更高级别的抽象,使得数据库操作更加简单、方便,并减少了样板代码。本博客将介绍 Spring JDBC 中的一些常用操作。

1. JdbcTemplate 类

JdbcTemplate 是 Spring 框架中用于简化 JDBC 编程的类。

它提供了一种模板化的方法来执行数据库操作,从而减少了传统 JDBC 编程中的样板代码和错误处理。JdbcTemplate 类位于 org.springframework.jdbc.core 包中,是 Spring JDBC 核心类之一。

在这里插入图片描述

1)queryForList

使用下面 SQL 查询一下数据库 t_user 表里都有哪些用户

select * from t_user

查询代码如下:

String sql = "select * from t_user";
List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);

2)update

使用下面 SQL 查询一下数据库 t_user 表里都有哪些用户

insert into t_user values (5, 'ccc',44)

查询代码如下:

String sql = "insert into t_user values (5, 'ccc',44)";
return jdbcTemplate.update(sql);

3)query

使用下面 SQL 查询一下数据库 t_user 表里指定 id 的用户

select * from t_user where id = ?

查询代码如下:

String sql = "select * from t_user where id = ?";
return jdbcTemplate.query(sql, (rs, rowNum) ->new User(rs.getInt("id"),rs.getString("name"),rs.getInt("age")), id);

4)execute

使用下面 SQL 修改一下数据库 t_user 表里id是5的用户年龄

update t_user set age = '55' where id = 5

查询代码如下:

String sql = "update t_user set age = '55' where id = 5";
jdbcTemplate.execute(sql);

5)queryForObject

使用下面 SQL 查询一下数据库 t_user 表里指定 id 的用户

select * from t_user where id = ?

查询代码如下:

String sql = "select * from t_user where id = ?";
return jdbcTemplate.queryForObject(sql, (rs, rowNum) ->new User(rs.getInt("id"),rs.getString("name"),rs.getInt("age")), id);

2.代码及执行

1)代码

启动类

package com.cheney.demo;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

modle

package com.cheney.demo.modle;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {private Integer id;private String name;private Integer age;
}

dao

package com.cheney.demo.dao;import com.cheney.demo.modle.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;import java.util.ArrayList;
import java.util.List;
import java.util.Map;@Repository
public class UserDao {@Autowiredprivate JdbcTemplate jdbcTemplate;public List<User> getUserByIdViaQuery(Long id) {String sql = "select * from t_user where id = ?";return jdbcTemplate.query(sql, (rs, rowNum) ->new User(rs.getInt("id"),rs.getString("name"),rs.getInt("age")), id);}public User getUserByIdViaQueryForObject(Long id) {String sql = "select * from t_user where id = ?";return jdbcTemplate.queryForObject(sql, (rs, rowNum) ->new User(rs.getInt("id"),rs.getString("name"),rs.getInt("age")), id);}public List<User> getUserByIdViaQueryForList() {String sql = "select * from t_user";List<Map<String, Object>> rows = jdbcTemplate.queryForList(sql);List<User> users = new ArrayList<>();for (Map<String, Object> row : rows) {User user = new User();user.setId((Integer) row.get("ID"));user.setName((String) row.get("NAME"));user.setAge((Integer) row.get("AGE"));users.add(user);}return users;}public int insertUser() {String sql = "insert into t_user values (5, 'ccc',44)";return jdbcTemplate.update(sql);}public void updateUser() {String sql = "update t_user set age = '55' where id = 5";jdbcTemplate.execute(sql);}
}

controller

package com.cheney.demo.controller;import com.cheney.demo.dao.UserDao;
import com.cheney.demo.modle.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.util.List;@RestController
@RequestMapping("user")
public class UserController {@Autowiredprivate UserDao userDao;@GetMapping("queryForList")public String queryForList() {List<User> users = userDao.getUserByIdViaQueryForList();StringBuilder sb = new StringBuilder();for (User user : users) {sb.append(user).append("</br>");}return sb.toString();}@GetMapping("update")public String update() {int count = userDao.insertUser();return "插入了一个id是5的用户,并且年龄是44";}@GetMapping("query")public String query() {List<User> users = userDao.getUserByIdViaQuery(5L);if (users.isEmpty()) {return null;}return users.getFirst().toString();}@GetMapping("execute")public String execute() {userDao.updateUser();return "把id是5的用户的年龄修改为55";}@GetMapping("queryForObject")public String queryForObject() {User user = userDao.getUserByIdViaQueryForObject(5L);if (user == null) {return null;}return user.toString();}
}

配置类

package com.cheney.demo.config;import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;import javax.sql.DataSource;@Configuration
public class DataSourceConfig {@Bean@ConfigurationProperties("spring.datasource")public DataSource dataSource(){return DataSourceBuilder.create().build();}@Beanpublic JdbcTemplate jdbcTemplate(DataSource dataSource){return new JdbcTemplate(dataSource);}
}

schema.sql

CREATE TABLE IF NOT EXISTS `t_user` (`id`         INTEGER  PRIMARY KEY AUTO_INCREMENT,`name`       VARCHAR(32) NOT NULL,`age`        INTEGER  NOT NULL
);

data.sql

INSERT INTO `t_user` (`id`, `name`, `age`) VALUES (1, 'cheney', '18');
INSERT INTO `t_user` (`id`, `name`, `age`) VALUES (2, 'aaa', '11');
INSERT INTO `t_user` (`id`, `name`, `age`) VALUES (3, 'aaa', '22');
INSERT INTO `t_user` (`id`, `name`, `age`) VALUES (4, 'bbb', '33');

2)执行

a. 先启动服务

在这里插入图片描述

b. 执行 http://localhost:8080/user/queryForList

在这里插入图片描述

c. 执行 http://localhost:8080/user/update

在这里插入图片描述

d. 执行 http://localhost:8080/user/query

在这里插入图片描述

e. 执行 http://localhost:8080/user/execute

在这里插入图片描述

f. 执行 http://localhost:8080/user/queryForObject

在这里插入图片描述

3. 优点

  • 简化了数据库操作,减少了样板代码,提高了开发效率
  • 提供了更具信息性的异常处理,使开发人员更容易定位和解决问题
  • 可以通过回调接口来执行自定义的数据库操作,使得代码更加灵活和可扩展

4. 详细代码

https://github.com/cheney09/spring-practical-combat/tree/main/03/demo

在这里插入图片描述

总结

本文介绍了 Spring JDBC 如何使用 JdbcTemplate 进行基本的常用操作以及详细的案例。在实际应用中,你可以根据具体的业务需求和数据库类型进行适当的调整。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

持续集成交付CICD:Jira 远程触发 Jenkins 实现更新 GitLab 分支

目录 一、实验 1.环境 2.GitLab 查看项目 3.Jira新建模块 4. Jira 通过Webhook 触发Jenkins流水线 3.Jira 远程触发 Jenkins 实现更新 GitLab 分支 二、问题 1.Jira 配置网络钩子失败 2. Jira 远程触发Jenkins 报错 一、实验 1.环境 &#xff08;1&#xff09;主机 …

在Jetpack Compose中使用ExoPlayer实现直播流和音频均衡器

在Jetpack Compose中使用ExoPlayer实现直播流和音频均衡器 背景 ExoPlayer与Media3的能力结合&#xff0c;为Android应用程序播放多媒体内容提供了强大的解决方案。在本教程中&#xff0c;我们将介绍如何设置带有Media3的ExoPlayer来支持使用M3U8 URL进行直播流。此外&#x…

无需改动现有网络,企业高速远程访问内网Linux服务器

某企业为数据治理工具盒厂商&#xff0c;帮助客户摆脱数据问题困扰、轻松使用数据&#xff0c;使得客户可以把更多精力投入至数据应用及业务赋能&#xff0c;让数据充分发挥其作为生产要素的作用。 目前&#xff0c;该企业在北京、南京、西安、武汉等地均设有产研中心&#xff…

ffmpeg使用入门

1. ffmpeg是什么&#xff1a; FFmpeg是一款音视频编解码工具&#xff0c;也是一组音视频编解码开发套件&#xff0c;为开发者提供了丰富的音视频处理调用接口。 FFmpeg源代码编译后会生成三个可执行程序&#xff0c;分别是&#xff1a;ffmpeg、ffplay、ffprobe&#xff0c; 这…

华为vrrp+mstp+ospf+dhcp+dhcp relay配置案例

1、左边是vlan 10主桥&#xff0c;右边是vlan 20的主桥&#xff0c;并且互为备桥 2、 vlan 10 vrrp网关默认用左边&#xff0c;vlan 20的vrrp 网关默认用右边&#xff0c;对应mstp生成树 3、两边都track检测&#xff0c;不通就把vrrp减掉60&#xff0c;这样就会自动切另一边了 …

NHNL因子如何刻画行业强弱

根据华福证券-市场情绪指标专题&#xff08;五&#xff09;&#xff0c;进行了提炼和改写&#xff0c;特此致谢&#xff01; ( N H N L ) % ( c o u n t ( H H V ) − c o u n t ( L L V ) ) / N (NHNL)\% (count(HHV) - count(LLV))/N (NHNL)%(count(HHV)−count(LLV))/N 个…

机器人创新实验室任务三参考文档

一、JAVA环境配置 需要在Linux里面下载并且安装java。 sudo apt-get install openjdk-17-jre-headless 打开终端并且运行指令&#xff0c;用apt下载安装java。官方用的好像是java11&#xff0c;我安装的是java17。 如果无法定位软件安装包&#xff0c;可以试试更新一下 sudo …

【数据结构入门精讲 | 第六篇】队列知识点及考研408、企业面试练习

在上一篇文章中我们介绍了栈的知识点及相关练习&#xff0c;在这一篇文章中我们将介绍队列的知识点并通过练习来巩固。 目录 队列队列的数组实现基础概念伪代码 队列的循环数组实现基础概念伪代码 队列的链表实现基础概念伪代码 判断题选择题函数题R6-1 双端队列 编程题R7-1 列…

互联网+建筑工地源码,基于微服务+Java+Spring Cloud +Vue+UniApp开发

一、智慧工地概念 智慧工地就是互联网建筑工地&#xff0c;是将互联网的理念和技术引入建筑工地&#xff0c;然后以物联网、移动互联网技术为基础&#xff0c;充分应用BIM、大数据、人工智能、移动通讯、云计算、物联网等信息技术&#xff0c;通过人机交互、感知、决策、执行和…

SpringMVC:整合 SSM 中篇

文章目录 SpringMVC - 04整合 SSM 中篇一、优化二、总结三、说明注意&#xff1a; SpringMVC - 04 整合 SSM 中篇 一、优化 在 spring-dao.xml 中配置 dao 接口扫描&#xff0c;可以动态地实现 dao 接口注入到 Spring 容器中。 优化前&#xff1a;手动创建 SqlSessionTempl…

【量化金融】证券投资学

韭菜的自我修养 第一章&#xff1a; 基本框架和概念1.1 大盘底部形成的技术条件1.2 牛市与熊市1.3 交易系统1.3.1 树懒型交易系统1.3.2 止损止损的4个技术 第二章&#xff1a;证券家族4兄弟2.1 债券&#xff08;1&#xff09;债券&#xff0c;是伟大的创新&#xff08;2&#x…

Python 爬虫之下载视频(四)

爬取某投币视频平台的小视频 文章目录 爬取某投币视频平台的小视频前言一、基本内容二、基本思路三、代码编写1.引入库2.设置手机模式3.跳过手动点击等操作4.获取视频下载地址5.获取视频标题6.下载保存 总结 前言 这篇用来记录一下如何爬取这个平台的视频&#xff0c;比如一些…