使用 Spring JDBC 进行数据库操作:深入解析 JdbcTemplate

目录

1. Spring JDBC 简介

2. JdbcTemplate 介绍

3. 创建数据库和表

4. 配置 Spring JDBC

5. 创建实体类

6. 使用 JdbcTemplate 实现增、删、改、查操作

7. Spring JDBC 优点

8. 小结


1. Spring JDBC 简介

        Spring JDBC 是 Spring 框架中的一个模块,旨在简化数据库访问操作。它通过封装底层的 JDBC API,减少了繁琐的代码,提高了开发效率。传统的 JDBC 编程要求开发人员手动处理数据库连接、SQL 执行、错误处理以及资源释放等。而 Spring JDBC 通过提供 JdbcTemplate 类以及其他辅助工具,屏蔽了这些底层细节,使得数据库操作更加简单、直观且易于维护。

2. JdbcTemplate 介绍

JdbcTemplate 是 Spring 框架中用于简化 JDBC 操作的核心类,它对传统的 JDBC API 做了封装,提供了丰富的方法,方便开发人员进行数据库操作。主要的操作包括执行增、删、改、查等操作。

常用的 JdbcTemplate 方法类型
  1. execute 方法execute 方法可以用于执行任何 SQL 语句,一般用于执行 DDL(Data Definition Language)语句,比如创建表、删除表等。

    jdbcTemplate.execute("CREATE TABLE user (...);");
    
  2. update 和 batchUpdate 方法

    • update 用于执行新增、修改、删除等语句。
    • batchUpdate 用于批量执行 SQL 操作,可以显著提高效率。
    jdbcTemplate.update("INSERT INTO user (username, address) VALUES (?, ?)", "李连杰", "上海");
    
  3. query 和 queryForXXX 方法

    • query 用于查询返回多个结果的 SQL 语句。
    • queryForObjectqueryForList 等方法用于查询单个对象或列表。
    List<User> users = jdbcTemplate.query("SELECT * FROM user", new BeanPropertyRowMapper<>(User.class));
    
  4. call 方法call 方法用于执行数据库的存储过程或函数。

    jdbcTemplate.call("{CALL some_procedure(?)}", params);
    

3. 创建数据库和表

首先,我们需要在 MySQL 数据库中创建一个示例数据库,并在其中创建一个简单的用户表 user

CREATE DATABASE mybatis_demo;

USE mybatis_demo;

CREATE TABLE `user` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(32) NOT NULL COMMENT '用户名称',
  `birthday` DATETIME DEFAULT NULL COMMENT '生日',
  `sex` CHAR(1) DEFAULT NULL COMMENT '性别',
  `address` VARCHAR(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- 插入一些示例数据
INSERT INTO `user` (`id`, `username`, `birthday`, `sex`, `address`) VALUES
(1, '老王', '2018-02-27 17:47:08', '男', '北京'),
(2, '熊大', '2018-03-02 15:09:37', '女', '上海'),
(3, '熊二', '2018-03-04 11:34:34', '女', '深圳'),
(4, '光头强', '2018-03-04 12:04:06', '男', '广州');

4. 配置 Spring JDBC

接下来,我们在 Spring 配置文件中添加数据库连接池和 JdbcTemplate 配置:

applicationContext.xml 配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 配置连接池 DriverManagerDataSource -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo"/>
        <property name="username" value="root"/>
        <property name="password" value="2020"/>
    </bean>

    <!-- 配置 JdbcTemplate -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource"/>
    </bean>
</beans>

5. 创建实体类

在 Java 中,我们需要为 user 表创建一个实体类 User,该类的属性应与数据库表的列对应:

public class User {
    private Integer id;
    private String username;
    private Date birthday;
    private String sex;
    private String address;

    // getters and setters
}

6. 使用 JdbcTemplate 实现增、删、改、查操作

插入数据
@Test
public void testInsert() {
    String sql = "INSERT INTO user (username, address) VALUES (?, ?)";
    jdbcTemplate.update(sql, "李连杰", "上海");
}
更新数据
@Test
public void testUpdate() {
    String sql = "UPDATE user SET username = ?, address = ? WHERE id = ?";
    int result = jdbcTemplate.update(sql, "稳杰", "南海", 2);
    System.out.println("更新的记录数: " + result);
}
删除数据
@Test
public void testDelete() {
    String sql = "DELETE FROM user WHERE id = ?";
    int result = jdbcTemplate.update(sql, 18);
    System.out.println("删除的记录数: " + result);
}
查询数据(单表查询)
@Test
public void testQueryList() {
    String sql = "SELECT * FROM user WHERE address LIKE '%京%'";
    List<User> users = jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
    
    System.out.println("查询结果:");
    for (User user : users) {
        System.out.println(user);
    }
}
查询单个对象
@Test
public void testQueryForObject() {
    String sql = "SELECT * FROM user WHERE id = ?";
    User user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), 1);
    System.out.println(user);
}

7. Spring JDBC 优点

  • 简化数据库操作JdbcTemplate 封装了 JDBC 操作,减少了开发人员手动处理数据库连接、异常捕获、资源释放等的工作。
  • 降低代码冗余:对于同类型的操作(如执行增删改查),不再需要写重复的代码,减少了开发工作量。
  • 支持事务管理:Spring JDBC 与 Spring 的事务管理无缝集成,能有效管理数据库事务。
  • 灵活性高:尽管 Spring JDBC 封装了很多常见操作,但它并没有限制开发人员的操作,开发者可以使用原生 SQL 执行任何复杂的数据库操作。

8. 小结

        通过使用 Spring JDBC 和 JdbcTemplate,我们可以大大简化数据库操作。Spring JDBC 提供了高效的资源管理、异常处理、SQL 执行等能力,使得开发人员能够更加专注于业务逻辑的实现,而不必纠结于底层的数据库操作细节。结合 Spring 的事务管理机制,可以保证数据库操作的可靠性和一致性。

        Spring JDBC 的强大功能,使其在许多中小型项目中成为数据库操作的首选方案,尤其是在不需要 ORM(如 Hibernate)框架的情况下,Spring JDBC 提供了简洁而高效的数据库访问方式。

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

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

相关文章

基于FPGA的BT656编解码

概述 BT656全称为“ITU-R BT.656-4”或简称“BT656”,是一种用于数字视频传输的接口标准。它规定了数字视频信号的编码方式、传输格式以及接口电气特性。在物理层面上,BT656接口通常包含10根线(在某些应用中可能略有不同,但标准配置为10根)。这些线分别用于传输视频数据、…

流浪 Linux: 外置 USB SSD 安装 ArchLinux

注: ArchLinux 系统为滚动更新, 变化很快, 所以本文中的安装方法可能很快就过时了, 仅供参考. 实际安装时建议去阅读官方文档. 最近, 突然 (也没有那么突然) 有了一大堆 PC: 4 个笔记本, 2 个台式主机 (M-ATX 主板), 1 个小主机 (迷你主机). 嗯, 多到用不过来. 但是, 窝又不能…

文件读写操作

写入文本文件 #include <iostream> #include <fstream>//ofstream类需要包含的头文件 using namespace std;void test01() {//1、包含头文件 fstream//2、创建流对象ofstream fout;/*3、指定打开方式&#xff1a;1.ios::out、ios::trunc 清除文件内容后打开2.ios:…

python学习——常用的内置函数汇总

文章目录 类型转换函数数学函数常用的迭代器操作函数常用的其他内置函数 类型转换函数 数学函数 常用的迭代器操作函数 实操&#xff1a; from cv2.gapi import descr_oflst [55, 42, 37, 2, 66, 23, 18, 99]# (1) 排序操作 asc_lst sorted(lst) # 升序 desc_lst sorted(l…

计算机视觉和图像处理

计算机视觉与图像处理的最新进展 随着人工智能技术的飞速发展&#xff0c;计算机视觉和图像处理作为其中的重要分支&#xff0c;正逐步成为推动科技进步和产业升级的关键力量。 一、计算机视觉的最新进展 计算机视觉&#xff0c;作为人工智能的重要分支&#xff0c;主要研究如…

解决MacOS安装软件时提示“打不开xxx软件,因为Apple无法检查其是否包含恶意软件”的问题

macOS 系统中如何开启“任何来源”以解决安装报错问题&#xff1f; 大家好&#xff01;今天我们来聊聊在使用 macOS 系统 时&#xff0c;遇到安装应用软件时出现报错的情况。这种情况常常发生在安装一些来自第三方开发者的应用时&#xff0c;因为 macOS 会默认阻止不明开发者的…

23.Word:小王-制作公司战略规划文档❗【5】

目录 NO1.2.3.4 NO5.6​ NO7.8.9​ NO10.11​ NO12​ NO13.14 NO1.2.3.4 布局→页面设置对话框→纸张&#xff1a;纸张大小&#xff1a;宽度/高度→页边距&#xff1a;上下左右→版式&#xff1a;页眉页脚→文档网格&#xff1a;勾选只指定行网格✔→ 每页&#xff1a;…

ICLR 2025收录论文:为什么动作分块对于机器人灵活性至关重要?

随着机器人学习和人类演示数据的不断增加&#xff0c;行为克隆方法逐渐成为机器人领域的研究热点。行为克隆通过模仿人类专家的演示来学习控制策略&#xff0c;但是现有方法在处理人类演示的强时间依赖性和大风格变异性方面仍面临不少挑战。 为了解决这些问题&#xff0c;近日美…

视频脚本生成器(基于openai API和streamlit)

utils.py&#xff1a; # 所有和ai交互的代码放进utils.py里&#xff08;utils 通常是 “utilities” 的缩写&#xff0c;意为 “实用工具” 或 “实用函数”&#xff09;from langchain.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI from lan…

java每日精进1.31(SpringSecurity)

在所有的开发的系统中&#xff0c;都必须做认证(authentication)和授权(authorization)&#xff0c;以保证系统的安全性。 一、基础使用 1.依赖 <dependencies><!-- 实现对 Spring MVC 的自动化配置 --><dependency><groupId>org.springframework.bo…

【Spring】Spring启示录

目录 前言 一、示例程序 二、OCP开闭原则 三、依赖倒置原则DIP 四、控制反转IOC 总结 前言 在软件开发的世界里&#xff0c;随着项目的增长和需求的变化&#xff0c;如何保持代码的灵活性、可维护性和扩展性成为了每个开发者必须面对的问题。传统的面向过程或基于类的设计…

使用 MSYS2 qemu 尝鲜Arm64架构国产Linux系统

近期&#xff0c;我的师弟咨询我关于Arm64架构的国产CPU国产OS开发工具链问题。他们公司因为接手了一个国企的单子&#xff0c;需要在这类环境下开发程序。说实在的我也没有用过这个平台&#xff0c;但是基于常识&#xff0c;推测只要基于C和Qt&#xff0c;应该问题不大。 1. …

一、html笔记

(一)前端概述 1、定义 前端是Web应用程序的前台部分,运行在PC端、移动端等浏览器上,展现给用户浏览的网页。通过HTML、CSS、JavaScript等技术实现,是用户能够直接看到和操作的界面部分。上网就是下载html文档,浏览器是一个解释器,运行从服务器下载的html文件,解析html、…

9.2k star!PiliPala一个第三方B站客户端!

软件介绍 链接 PiliPala一个在Github上收获9.2k star的开源第三方bilibili客户端&#xff0c;支持安卓和ios端安装使用。应用界面简洁无广、除核心功能外无任何冗余功能和服务&#xff0c;让我们可以尽情的享受内容带给我们的快乐。 基础的功能如登录、点赞收藏、评论、关注、…

嵌入式C语言:大小端详解

目录 一、大小端的概念 1.1. 大端序&#xff08;Big-endian&#xff09; 1.2. 小端序&#xff08;Little-endian&#xff09; 二、大小端与硬件体系的关系 2.1. 大小端与处理器架构 2.2. 大小端与网络协议 2.3. 大小端对硬件设计的影响 三、判断系统的大小端方式 3.1.…

ZZNUOJ(C/C++)基础练习1031——1040(详解版)

1031 : 判断点在第几象限 题目描述 从键盘输入2个整数x、y值&#xff0c;表示平面上一个坐标点&#xff0c;判断该坐标点处于第几象限&#xff0c;并输出相应的结果。 输入 输入x&#xff0c;y值表示一个坐标点。坐标点不会处于x轴和y轴上&#xff0c;也不会在原点。 输出 输出…

8.[前端开发-CSS]Day08-图形-字体-字体图标-元素定位

一、额外知识补充 1 border图形 边框的形状 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport"…

Qt事件处理:理解处理器、过滤器与事件系统

1. 事件 事件 是一个描述应用程序中、发生的某些事情的对象。 在 Qt 中&#xff0c;所有事件都继承自 QEvent &#xff0c;并且每个事件都有特定的标识符&#xff0c;如&#xff1a;Qt::MouseButtonPress 代表鼠标按下事件。 每个事件对象包含该事件的所有相关信息&#xff…

大白话讲清楚embedding原理

Embedding&#xff08;嵌入&#xff09;是一种将高维数据&#xff08;如单词、句子、图像等&#xff09;映射到低维连续向量的技术&#xff0c;其核心目的是通过向量表示捕捉数据之间的语义或特征关系。以下从原理、方法和应用三个方面详细解释Embedding的工作原理。 一、Embe…

git笔记-简单入门

git笔记 git是一个分布式版本控制系统&#xff0c;它的优点有哪些呢&#xff1f;分为以下几个部分 与集中式的版本控制系统比起来&#xff0c;不用担心单点故障问题&#xff0c;只需要互相同步一下进度即可。支持离线编辑&#xff0c;每一个人都有一个完整的版本库。跨平台支持…