springboot依赖之JDBC(二)

news2024/11/13 9:44:38

要在 IntelliJ IDEA 中创建一个 Spring Boot 项目并实现基于 JdbcTemplate 的增删改查功能,以下是一个详细的步骤和代码示例。这个例子使用一个简单的用户信息表(users),并展示如何使用 JdbcTemplate` 的各种方法进行操作。

前文有介绍简单的jdbc操作,手写SQL。这次我们介绍下进阶级别的数据库操作方式。
springboot依赖之JDBC API手写sql 管理数据库

1. 创建 Spring Boot 项目

  1. 创建一个新的 Spring Boot 项目

    • 打开 IntelliJ IDEA。
    • 选择 New Project > Spring Initializr
    • 输入项目名称,例如 springjdbc2
    • 添加依赖项:Spring Web, Spring Data JPA, MySQL DriverSpring JDBC lombok
  2. 配置数据库连接
    src/main/resources/application.properties 中配置数据库连接信息,例如:

    spring.application.name=spring-jdbc2
    
    spring.datasource.url=jdbc:mysql://localhost:3306/spring-dependencies?useSSL=false&serverTimezone=UTC
    spring.datasource.username=root
    spring.datasource.password=root
    spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    

2. 创建用户信息表users

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) NOT NULL,
    age INT NOT NULL
);

3. 创建用户实体类User

src/main/java/com/example/jdbc_example/model/User.java 中创建一个简单的用户实体类:

package com.spedencencies.springjdbc2.model;

import lombok.Data;

/**
 * @author zhizhou   2024/8/26 23:30
 */
@Data
public class User {
    private int id;
    private String name;
    private String email;
    private int age;
}

4. 创建 JdbcTemplate 实现类

repository/UserRepository.java 中创建一个 UserRepository 类,用于处理数据库操作:

package com.spedencencies.springjdbc2.rrepository;

import com.spedencencies.springjdbc2.model.User;
import org.springframework.stereotype.Repository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
/**
 * @author zhizhou   2024/8/26 23:31
 */
@Repository
public class UserRepository {
    
    @Autowired
    private JdbcTemplate jdbcTemplate;
    
    // 添加用户
    public int addUser(User user) {
        String sql = "INSERT INTO users (name, email, age) VALUES (?, ?, ?)";
        return jdbcTemplate.update(sql, user.getName(), user.getEmail(), user.getAge());
    }
    
    // 删除用户
    public int deleteUser(int id) {
        String sql = "DELETE FROM users WHERE id = ?";
        return jdbcTemplate.update(sql, id);
    }
    
    // 更新用户
    public int updateUser(User user) {
        String sql = "UPDATE users SET name = ?, email = ?, age = ? WHERE id = ?";
        return jdbcTemplate.update(sql, user.getName(), user.getEmail(), user.getAge(), user.getId());
    }
    
    // 查询用户列表
    public List<User> getAllUsers() {
        String sql = "SELECT * FROM users";
        return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(User.class));
    }
    
    // 使用 queryForObject 查询单个用户
    public User getUserById(int id) {
        String sql = "SELECT * FROM users WHERE id = ?";
        return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(User.class), id);
    }
    
    // 使用 queryForMap 查询用户
    public Map<String, Object> getUserAsMap(int id) {
        String sql = "SELECT * FROM users WHERE id = ?";
        return jdbcTemplate.queryForMap(sql, id);
    }
    
    // 使用 queryForList 查询多条记录
    public List<Map<String, Object>> getAllUsersAsMap() {
        String sql = "SELECT * FROM users";
        return jdbcTemplate.queryForList(sql);
    }
    
    // 使用 queryForRowSet 查询
    public void queryForRowSetExample() {
        String sql = "SELECT * FROM users";
        var rowSet = jdbcTemplate.queryForRowSet(sql);
        
        while (rowSet.next()) {
            int id = rowSet.getInt("id");
            String name = rowSet.getString("name");
            System.out.println("ID: " + id + ", Name: " + name);
        }
    }
    
    // 使用 batchUpdate 批量插入
    public int[][] batchInsertUsers(List<User> users) {
        String sql = "INSERT INTO users (name, email, age) VALUES (?, ?, ?)";
        return jdbcTemplate.batchUpdate(sql, users, users.size(), (ps, user) -> {
            ps.setString(1, user.getName());
            ps.setString(2, user.getEmail());
            ps.setInt(3, user.getAge());
        });
    }
}

5. 测试 JdbcTemplate 功能

在 SpringJdbc2Application 中,可以编写简单的测试代码来验证上述功能:

package com.spedencencies.springjdbc2;

import com.spedencencies.springjdbc2.model.User;
import com.spedencencies.springjdbc2.rrepository.UserRepository;
import org.apache.tomcat.util.json.JSONParser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.ArrayList;
import java.util.List;

@SpringBootApplication
public class SpringJdbc2Application implements CommandLineRunner{
    
    @Autowired
    private UserRepository userRepository;
    
    
    public static void main(String[] args) {
        SpringApplication.run(SpringJdbc2Application.class, args);
    }
    
    
    @Override
    public void run(String... args) {
        // 添加用户
        User user = new User();
        user.setName("一周一志");
        user.setEmail("zhizhou@example.com");
        user.setAge(18);
        userRepository.addUser(user);
        
        // 查询用户
        User queriedUser = userRepository.getUserById(3);
        System.out.println("Queried User: " + queriedUser.getName());
        
        // 更新用户
        queriedUser.setName("一周一志程序员 Updated");
        userRepository.updateUser(queriedUser);
        
        // 查询所有用户
        List<User> allUsers = userRepository.getAllUsers();
        allUsers.forEach(u -> System.out.println("User: " + u.getName()));
        
        // 删除用户
        //userRepository.deleteUser(2);
        
        // 测试其他查询方法
        userRepository.queryForRowSetExample();
    
        // 批量插入用户
        List<User> users = new ArrayList<>();
        User user1 = new User();
        user1.setName("一周一志");
        user1.setEmail("zhizhou@example.com");
        user1.setAge(18);
        users.add(user1);
        User user2 = new User();
        user2.setName("一周一志");
        user2.setEmail("1184795629@qq.com");
        user2.setAge(18);
        users.add(user2);
        int[][] res = userRepository.batchInsertUsers(users);
        //打印成json字符串
        for (int i = 0; i < res.length; i++) {
            for (int j = 0; j < res[i].length; j++)
                System.out.println("res[" + i + "][" + j + "] = " + res[i][j]);
        }
    }
}

6. 运行项目

启动 Spring Boot 项目,控制台输出你在测试代码中执行的各种数据库操作。
在这里插入图片描述

结论

通过上述步骤,在 Spring Boot 项目使用 JdbcTemplate 实现了一个用户信息表的增删改查功能。这个例子展示了 JdbcTemplate 的多个高级操作方法,包括 queryqueryForObjectqueryForMapqueryForListqueryForRowSetbatchUpdate,这些方法可以帮助你更灵活地操作数据库。

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

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

相关文章

【Linux —— 生产者消费者模型】

Linux —— 生产者消费者模型 生产者消费者模型概述生产者消费者模型特点生产者消费者模型优点基于BlockingQueue的生产者消费者模型 生产者消费者模型概述 生产者消费者模型是一种并发编程模型,用于解决多线程或多进程间的数据共享和同步问题。在这个模型中,有两种角色:生产者…

Python 3.11 从入门到实战1(环境准备)

本篇文章是python3.11的学习开篇&#xff0c;我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;获得python基础学习与实例、实践相结合&#xff0c;使我们完全掌握python。并做到独立完成项目开发的能力。 今天的谈论的比较简单&#xff0c;也是后续学习的基础。pyt…

深入MySQL

MySQL逻辑架构 MySQL逻辑架构整体分为三层&#xff0c;顶层客户端并非MySQL独有&#xff0c;如&#xff1a;连接处理、授权认证、安全等功能都在客户端层。 核心服务层&#xff0c;MySQL大多数核心服务都在这一层&#xff0c;包括查询解析、分析、优化、缓存、内置函数等。所有…

Python中csv文件的操作5

在《Python中csv文件的操作1》中提到&#xff0c;可以通过read()和write()方法读取和写入csv文件中的所有内容。除了上述的两个方法外&#xff0c;还可以通过readline()、readlines()、writelines()实现csv文件的读写操作。 1 readline()方法 readline()方法每次只读取文件的…

入行「游戏策划」,该从何处下手?

想知道策划岗位该怎么入行可点击蓝链 相比较起以技术为最重要评判标准的开发岗&#xff0c; 「游戏策划」这一岗位在非业界人士的眼中 一直都是一个风评方差很大的岗位。 有人说策划岗又轻松又威风&#xff0c; 只需要输出想法&#xff0c;落地都交给开发&#xff0c; 干…

xss-labs 11-15关通关攻略

第11关 一.进入11关 二.进行抓包 在抓到的数据包中加入Referer:"οnclick"alert(1)"type"text 第12关 进入第12关发现没有注入点&#xff0c;进入源代码看哪里可以注入发现 二.在ua头注入 Referer:"οnclick"alert(1)"type"text…

【鸿蒙样式初探】多个组件如何共用同一样式

最近开发鸿蒙&#xff0c;刚接触难免二和尚摸不着头脑&#xff0c;尤其是样式...... 背景 在做银行卡显示的一个小需求时&#xff1a; 每个Text都需要设置fontColor:#FFFFFF" 想着是否可以简单点 解决历程 思路一&#xff1a;&#xff08;拒绝) 使用Styles 提取封装公…

matlab仿真 信道编码和交织(下)

&#xff08;内容源自详解MATLAB&#xff0f;SIMULINK 通信系统建模与仿真 刘学勇编著第八章内容&#xff0c;有兴趣的读者请阅读原书&#xff09; ​ ​ ​ clear alln3;k2;%A(3,2)循环码N10000;%消息比特的行数msgrandi([0 1],N,k);%消息比特一共N*k行polcyclpoly(n,k);…

C++ TinyWebServer项目总结(12. 高性能I/O框架库Libevent)

Linux服务器程序必须处理三类事件&#xff08;I/O、信号和定时事件&#xff09;&#xff0c;在处理这三类事件时需要考虑以下问题&#xff1a; 统一事件源。统一处理这三类事件既能使代码简单易懂&#xff0c;又能避免一些潜在的逻辑错误。实现统一事件源的一般方法&#xff1…

如何用Java SpringBoot+Vue搭建花开富贵花园管理系统

&#x1f393; 作者&#xff1a;计算机毕设小月哥 | 软件开发专家 &#x1f5a5;️ 简介&#xff1a;8年计算机软件程序开发经验。精通Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等技术栈。 &#x1f6e0;️ 专业服务 &#x1f6e0;️ 需求定制化开发源码提…

推荐一篇 学习SQL 的文章

学习 java&#xff0c;当然避不开数据库的知识&#xff0c;个人认为好学好理解的一篇文章&#xff0c;推荐给大家 SQL语法基础知识总结 | JavaGuide「Java学习 面试指南」一份涵盖大部分 Java 程序员所需要掌握的核心知识。准备 Java 面试&#xff0c;首选 JavaGuide&#xf…

智能优化算法-鹈鹕优化算法(POA)(附源码)

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1.内容介绍 鹈鹕优化算法 (Pelican Optimization Algorithm, POA) 是一种基于群体智能的元启发式优化算法&#xff0c;它模拟了鹈鹕的捕食行为和社会交互特性&#xff0c;用于解决复杂的优化问题。 POA的工作机制主要包括…

单元测试、系统测试和集成测试知识详解

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、单元测试的概念 单元测试是对软件基本组成单元进行的测试&#xff0c;如函数或一个类的方法。当然这里的基本单元不仅仅指的是一个函数或者方法&#xff…

FlagEval 8月榜 | 文生视频大模型主观评测结果揭晓,新增6款新发布模型

近日&#xff0c;智源研究院联合中国传媒大学发布文生视频大模型主观评测榜单&#xff0c;在今年5月对Sora、Runway Gen-2、PixVerse V1、Pika 1.0、VideoCrafter-V2、Show-1、Open-Sora 1.0七个模型性能表现评测结果的基础之上&#xff0c;不仅对部分模型的升级版本进行了对比…

C++初学(16)

16.1、if语句 当C程序必须决定是否执行某个操作时&#xff0c;通常使用if语句来实现选择。if有两种格式&#xff1a;if和if else。 if语句的语法与while相似&#xff1a; if(text-condition)statement 如果text-condition&#xff08;测试条件&#xff09;为true&#xff0…

iTimes工时管理系统:企业高效管理的得力助手

在当今快节奏的商业环境中&#xff0c;企业面临着越来越多的挑战&#xff0c;其中之一便是如何高效、准确地管理员工工时。工时管理不仅关乎企业的成本控制&#xff0c;还直接影响到项目执行效率、员工满意度以及整体运营水平。因此&#xff0c;选择一款优秀的工时管理系统显得…

【应用层】Tomcat10安装以及对应的VScode插件使用

文章日期是2024年8月26日&#xff0c;Tomcat10为稳定版中最新的&#xff0c;Tomcat11为测试版。 流程&#xff1a;下载Tomcat10-->等待下载时&#xff0c;安装对应的VScode插件-->配置Tomcat10-->配置对应的VScode插件 1、下载Tomcat10 2、安装对应的VScode插件 3…

Codeforce 963

CF 963 B 模拟加贪心 偶数个数C 模拟前缀和 灯能否全亮D 二分DP 中位数尽可能大F1 模拟镜像 题目链接 B 模拟加贪心 偶数个数 考点&#xff1a;贪心 思路&#xff1a;除了全是偶数的情况&#xff0c;其他的情况都需要将偶数转换为奇数。最少的操作步数是偶数个数&#xff0c;…

IOS 15 实现Toast和小菊花Loading提示

本文主要是实现toast和loading两种提示功能&#xff0c;例如&#xff1a;登陆时参数不正确提示&#xff0c;toast提示后会自动隐藏。加载提示&#xff1a;不会自动隐藏&#xff0c;常用于网络请求&#xff0c;上传等。 添加依赖 #提示框架 #https://github.com/jdg/MBProgress…