Spring JDBC模板

Spring JDBC模板(JdbcTemplate)是Spring框架提供的一个简化JDBC操作的工具类。它封装了JDBC的常见操作,如查询、更新、插入和删除等,简化了数据库访问代码,减少了样板代码。下面是一个详细的示例,展示如何使用Spring JDBC模板进行数据库操作。

核心概念

  1. JdbcTemplate:Spring提供的一个工具类,用于简化JDBC操作。
  2. DataSource:数据源,用于获取数据库连接。
  3. RowMapper:用于将结果集的每一行映射到一个Java对象。

示例代码

1. 配置数据源和JdbcTemplate

首先,我们需要配置数据源和JdbcTemplate。可以使用Spring的Java配置类来完成。

package com.example.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;import javax.sql.DataSource;@Configuration
public class AppConfig {@Beanpublic DataSource dataSource() {DriverManagerDataSource dataSource = new DriverManagerDataSource();dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");dataSource.setUrl("jdbc:mysql://localhost:3306/mydb");dataSource.setUsername("username");dataSource.setPassword("password");return dataSource;}@Beanpublic JdbcTemplate jdbcTemplate(DataSource dataSource) {return new JdbcTemplate(dataSource);}
}
2. 定义实体类

定义一个实体类,用于映射数据库表中的数据。

package com.example.model;public class User {private int id;private String name;private String email;// Getters and setterspublic int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}
}
3. 定义DAO类

定义一个DAO类,使用JdbcTemplate进行数据库操作。

package com.example.dao;import com.example.model.User;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;@Repository
public class UserDao {private final JdbcTemplate jdbcTemplate;public UserDao(JdbcTemplate jdbcTemplate) {this.jdbcTemplate = jdbcTemplate;}// 插入用户public void addUser(User user) {String sql = "INSERT INTO users (name, email) VALUES (?, ?)";jdbcTemplate.update(sql, user.getName(), user.getEmail());}// 查询所有用户public List<User> getAllUsers() {String sql = "SELECT * FROM users";return jdbcTemplate.query(sql, new UserRowMapper());}// 根据ID查询用户public User getUserById(int id) {String sql = "SELECT * FROM users WHERE id = ?";return jdbcTemplate.queryForObject(sql, new UserRowMapper(), id);}// 更新用户public void updateUser(User user) {String sql = "UPDATE users SET name = ?, email = ? WHERE id = ?";jdbcTemplate.update(sql, user.getName(), user.getEmail(), user.getId());}// 删除用户public void deleteUser(int id) {String sql = "DELETE FROM users WHERE id = ?";jdbcTemplate.update(sql, id);}// RowMapper实现类private static class UserRowMapper implements RowMapper<User> {@Overridepublic User mapRow(ResultSet rs, int rowNum) throws SQLException {User user = new User();user.setId(rs.getInt("id"));user.setName(rs.getString("name"));user.setEmail(rs.getString("email"));return user;}}
}
4. 测试类

定义一个测试类,演示如何使用UserDao进行数据库操作。

package com.example;import com.example.config.AppConfig;
import com.example.dao.UserDao;
import com.example.model.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;import java.util.List;public class Main {public static void main(String[] args) {ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);UserDao userDao = context.getBean(UserDao.class);// 添加用户User user = new User();user.setName("John Doe");user.setEmail("john.doe@example.com");userDao.addUser(user);// 查询所有用户List<User> users = userDao.getAllUsers();for (User u : users) {System.out.println("User ID: " + u.getId() + ", Name: " + u.getName() + ", Email: " + u.getEmail());}// 根据ID查询用户User userById = userDao.getUserById(1);System.out.println("User ID: " + userById.getId() + ", Name: " + userById.getName() + ", Email: " + userById.getEmail());// 更新用户userById.setName("Jane Doe");userById.setEmail("jane.doe@example.com");userDao.updateUser(userById);// 删除用户userDao.deleteUser(1);}
}

详细解释

  1. 配置数据源和JdbcTemplate

    • AppConfig 类使用 @Configuration 注解定义为一个配置类。
    • dataSource 方法配置了数据源,使用 DriverManagerDataSource 连接到MySQL数据库。
    • jdbcTemplate 方法创建了一个 JdbcTemplate 实例,并注入了数据源。
  2. 定义实体类

    • User 类是一个简单的Java类,包含 idname 和 email 属性,以及相应的getter和setter方法。
  3. 定义DAO类

    • UserDao 类使用 JdbcTemplate 进行数据库操作。
    • addUser 方法插入一个新用户。
    • getAllUsers 方法查询所有用户。
    • getUserById 方法根据ID查询用户。
    • updateUser 方法更新用户信息。
    • deleteUser 方法删除用户。
    • UserRowMapper 是一个内部类,实现了 RowMapper 接口,用于将结果集的每一行映射到 User 对象。
  4. 测试类

    • Main 类通过 AnnotationConfigApplicationContext 加载 AppConfig 配置,并获取 UserDao 的实例。
    • 演示了如何使用 UserDao 进行添加、查询、更新和删除用户的操作。

通过这种方式,Spring JDBC模板简化了JDBC操作,使代码更加简洁和易于维护。

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

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

相关文章

JS常用数组方法 reduce filter find forEach

文章目录 reduce应用&#xff1a;数据扁平化 filterfind从数组 [1,2,3,4,5,6] 中找出值为 2 的元素 forEach用于遍历&#xff0c;forEach 方法没有返回值&#xff0c;它总是返回 undefined。 reduce 数组变量名.reduce((sum,value) > { // 向sum变量上累加值 // 一定要retur…

精选报告| 2024年,5份必读的“虚仿教育”行业报告合集

以3D/XR应用为主的虚拟仿真实验教学课程&#xff0c;在教育信息化建设过程中已成为必选的技术方案。通过构建虚拟教育环境&#xff0c;允许学习者在数字空间中进行互动学习&#xff0c;这种方法在基础教育、职业培训、远程教育等关键教育领域已经展现出前所未有的变革潜力&…

【提效工具开发】Python功能模块执行和 SQL 执行 需求整理

需求梳理 背景 当前我们在IDE或MySQL查询工具中只能进行个人使用&#xff0c;缺乏共享功能&#xff0c;且在查询及数据统计上有一定的不便。为了改善这种情况&#xff0c;计划搭建一个Web平台&#xff0c;通过后台交互来提升效率。此平台需要兼容Python工具和SQL工具的管理、执…

Ethernet 系列(8)-- 基础学习::ARP

目录 1. ARP的目的&#xff1a; 1.1 什么是ARP 1.2 什么时候用ARP 2. ARP如何工作&#xff1a; 2.1 主机-主机的直接通信 2.2 主机-路由-主机的间接通信 3. ARP header&#xff1a; 1. ARP的目的&#xff1a; 1.1 什么是ARP: ARP-地址解析协议&#xff0c;是第3层地址&#xff…

uniapp组件实现省市区三级联动选择

1.导入插件 先将uni-data-picker组件导入我们的HBuilder项目中&#xff0c;在DCloud插件市场搜索uni-data-picker 点击下载插件并导入到我们的项目中 2.组件调用 curLocation &#xff1a;获取到的当前位置&#xff08;省市区&#xff09; <uni-data-picker v-slot:defa…

28系统监控(CPU、内存、磁盘等)

每天五分钟学Linux | 第二十八课&#xff1a;系统监控&#xff08;CPU、内存、磁盘等&#xff09; 大家好&#xff01;欢迎再次来到我们的“每天五分钟学Linux”系列教程。在前面的课程中&#xff0c;我们学习了如何查看系统日志。今天&#xff0c;我们将探讨如何监控Linux系统…

electron 中 contextBridge 作用

1. 安全地实现渲染进程和主进程之间的通信 在 Electron 应用中&#xff0c;主进程和渲染进程是相互隔离的&#xff0c;这是为了安全和稳定性考虑。 然而&#xff0c;在很多情况下&#xff0c;渲染进程需要访问主进程中的某些功能&#xff0c;例如系统级别的操作或者一些应用级…

软件分享丨火绒应用商店

【资源分享】 资源名&#xff1a;火绒应用商店 官方网址&#xff1a;点击跳转 火绒应用商店是由火绒安全推出的一款独立软件。它提供了海量的应用程序&#xff0c;涵盖办公、社交、游戏、视频、工具等多种领域和类别&#xff0c;方便用户轻松找到所需的应用并进行一键下载安装…

Spring Cloud Alibaba Spring Cloud Spring Boot JDK 版本依赖关系

Spring Cloud Alibaba & Spring Cloud & Spring Boot & JDK 版本依赖关系 Spring Cloud Alibaba & Spring Cloud & Spring Boot Spring Cloud & Spring Boot Spring Boot & JDK JDK 8的新项目推荐版本 Spring Cloud Alibaba 2021.0.5.0* &…

S32G-VNP-RDB2开发环境搭建

下载官方镜像 刷机 cat /proc/partition or df -lh //查看sdcard卡再/dev目录挂在点 export DEVSD/dev/sdb sudo dd iffsl-image-auto-s32g274ardb2.sdcard of${DEVSD} bs1M && sync以上将SD-card插入就可以将开发板启动&#xff0c;串口接UART1&#xff0c;进入Lin…

信息化运维方案,实施方案,开发方案,信息中心安全运维资料(软件资料word)

1 编制目的 2 系统运行维护 2.1 系统运维内容 2.2 日常运行维护方案 2.2.1 日常巡检 2.2.2 状态监控 2.2.3 系统优化 2.2.4 软件系统问题处理及升级 2.2.5 系统数据库管理维护 2.2.6 灾难恢复 2.3 应急运行维护方案 2.3.1 启动应急流程 2.3.2 成立应急小组 2.3.3 应急处理过程 …

MFC 重写了listControl类(类名为A),并把双击事件的处理函数定义在A中,主窗口如何接收表格是否被双击

刚接触MFC遇到的问题&#xff0c;我在主对话框的.cpp里添加了表格的双击处理事件&#xff0c;但是没用&#xff0c;试了下添加单击的&#xff0c;发现居然可以进单击的处理函数&#xff0c;就很懵逼&#xff0c;然后我就把处理双击事件的函数添加到表格的类中&#xff0c;那这样…

鸿蒙ArkTS中的布局容器组件(Column、Row、Flex、 Stack、Grid)

在鸿蒙ArkTS中&#xff0c;布局容器组件有很多&#xff0c;常见的有&#xff1a;   ⑴ Column&#xff1a;&#xff08;垂直布局容器&#xff09;&#xff1a;用于将子组件垂直排列。   ⑵ Row&#xff1a;&#xff08;水平布局容器&#xff09;&#xff1a;用于将子组件水…

Qt低版本多网卡组播bug

原文地址 最近在某个项目中&#xff0c;发现了一个低版本Qt的bug&#xff0c;导致组播无法正常使用&#xff0c;经过一番排查&#xff0c;终于找到了原因&#xff0c;特此记录。 环境 Qt&#xff1a;5.7.0 mingw32操作系统&#xff1a;windows 11 现象 在Qt5.7.0版本中&…

RPC核心实现原理

目录 一、基本原理 二、详细步骤 三、额外考虑因素 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种计算机通信协议&#xff0c;也是一种用于实现分布式系统中不同节点之间进行通信和调用的技术。其实现原理主要可以分为以下几个步骤&…

Android Studio加载旧的安卓工程项目报错处理

文章目录 Invalid Gradle JDK configuration foundNDK not configuredCMake 3.10.2 was not found安装cmake适配cmake版本号 com.intellij.openapi.externalSystem.model.ExternalSystemExceptiongradle版本过低或下载不了下载gradle与依赖库超时替换gradle国内源替换Maven 仓库…

电路原理:电阻桥。

电路的基础是电阻电路。电阻电路有两种基本接线方法&#xff08;串连和并连&#xff0c;二者有不同的解算与用法&#xff1a;串连分压、并连分流&#xff09;。电阻电路就是使用基本接线方法的组合方案&#xff0c;其解算方法主要内容是判断好整体布局以及各个局部的串并连关系…

Pytorch训练时报nan

0. 引言 Pytorch训练时在batchN时loss为nan。经过断点检查发现在batchN-1时&#xff0c;网络参数非nan&#xff0c;输出非nan&#xff0c;但梯度为nan&#xff0c;导致网络参数已经全部被更新为nan&#xff0c;遇到这种情况应该如何排查&#xff0c;如何避免&#xff1f;由于导…

全星魅-物联网定位终端-北斗定位便携终端-北斗有源终端

在当今快速发展的物流运输行业中&#xff0c;精准定位与实时监控已成为确保货物安全与高效运输的关键因素。为了满足这一需求&#xff0c;QMCZ10作为一款集4G&#xff08;LTE Cat1&#xff09;通讯技术与智能定位功能于一体的终端产品&#xff0c;应运而生。它不仅具备普通定位…

银行卡二要素核验 API 对接说明

本文将介绍一种 银行卡二要素核验 API 对接说明&#xff0c;它可用于校验姓名和银行卡号的真实性和一致性。 接下来介绍下 银行卡二要素核验 API 的对接说明。 注册链接 点击链接注册&#xff0c;即可使用&#xff01; 申请流程 要使用 API&#xff0c;需要先到 银行卡二要…