使用 IntelliJ IDEA + Spring JdbcTemplate 操作 MySQL 完全指南

一、开发环境搭建(基于 IDEA)

1. 创建 Spring Boot 项目

  1. 打开 IDEA → New Project → Spring Initializr
  2. 选择:
    • Project SDK: Java 17+
    • 依赖项:Spring Web, Spring Data JDBC, MySQL Driver

在这里插入图片描述
在这里插入图片描述

2. 手动添加依赖

2.1 手动添加 MySQL 依赖示例
<!-- pom.xml -->
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope>
</dependency>

3. 准备 MySQL 数据库

-- 执行以下 SQL 创建数据库和表
CREATE DATABASE spring_jdbc_demo;
USE spring_jdbc_demo;CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,email VARCHAR(100) UNIQUE,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

4. 配置数据源

# application.yml
spring:datasource:url: jdbc:mysql://localhost:3306/spring_jdbc_demo?useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: your_passworddriver-class-name: com.mysql.cj.jdbc.Driver

二、基础 CRUD 操作

1. 实体类定义

public class User {private Integer id;private String name;private String email;private LocalDateTime createdAt;// 省略构造函数、getter/setter、toString
}

2. 插入数据(Auto Increment 处理)

@Repository
public class UserRepository {@Autowiredprivate JdbcTemplate jdbcTemplate;public int insert(User user) {String sql = "INSERT INTO users (name, email) VALUES (?, ?)";return jdbcTemplate.update(sql, user.getName(), user.getEmail());}// 获取自增主键public Integer insertAndReturnId(User user) {SimpleJdbcInsert insert = new SimpleJdbcInsert(jdbcTemplate).withTableName("users").usingGeneratedKeyColumns("id");return insert.executeAndReturnKey(user.toMap()).intValue();}
}

3. 查询数据

// 使用 BeanPropertyRowMapper 自动映射
public List<User> findAll() {return jdbcTemplate.query("SELECT id, name, email, created_at as createdAt FROM users",new BeanPropertyRowMapper<>(User.class));
}// 带条件查询
public Optional<User> findById(int id) {try {return Optional.ofNullable(jdbcTemplate.queryForObject("SELECT * FROM users WHERE id = ?",new Object[]{id},(rs, rowNum) -> new User(rs.getInt("id"),rs.getString("name"),rs.getString("email"),rs.getTimestamp("created_at").toLocalDateTime())));} catch (EmptyResultDataAccessException e) {return Optional.empty();}
}

4. 更新与删除

public int updateEmail(int id, String newEmail) {return jdbcTemplate.update("UPDATE users SET email = ? WHERE id = ?",newEmail, id);
}public int deleteById(int id) {return jdbcTemplate.update("DELETE FROM users WHERE id = ?",id);
}

三、高级功能实现

1. 批量操作(提升性能)

public int[] batchInsert(List<User> users) {return jdbcTemplate.batchUpdate("INSERT INTO users (name, email) VALUES (?, ?)",new BatchPreparedStatementSetter() {public void setValues(PreparedStatement ps, int i) throws SQLException {ps.setString(1, users.get(i).getName());ps.setString(2, users.get(i).getEmail());}public int getBatchSize() {return users.size();}});
}

2. 事务管理实战

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Transactionalpublic void transferEmail(int fromId, int toId) {User fromUser = userRepository.findById(fromId).orElseThrow();User toUser = userRepository.findById(toId).orElseThrow();userRepository.updateEmail(fromId, "old_" + fromUser.getEmail());userRepository.updateEmail(toId, fromUser.getEmail());}
}

3. 使用 NamedParameterJdbcTemplate

@Repository
public class UserNamedRepository {private final NamedParameterJdbcTemplate namedTemplate;public UserNamedRepository(DataSource dataSource) {this.namedTemplate = new NamedParameterJdbcTemplate(dataSource);}public List<User> findByName(String name) {MapSqlParameterSource params = new MapSqlParameterSource().addValue("name", "%" + name + "%");return namedTemplate.query("SELECT * FROM users WHERE name LIKE :name",params,new BeanPropertyRowMapper<>(User.class));}
}

四、IDEA 高效开发技巧

1. 数据库连接配置

  1. 打开 IDEA Database 面板(右侧边栏)
  2. 添加 MySQL 数据源 → 填写连接信息
  3. 开启自动同步功能(方便查看表结构变化)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2. SQL 语句验证

  • 在代码中的 SQL 字符串上按 Alt+EnterInject language or reference → 选择 SQL
  • 获得语法高亮和自动提示功能

3. 快速测试方法

  • 在方法上右键 → Run 'methodName()'(需安装 JUnit)
  • 使用 Spring Boot Test 编写单元测试

五、常见问题排查

1. 时区问题解决方案

# 在连接字符串中添加时区参数
url: jdbc:mysql://localhost:3306/dbname?serverTimezone=Asia/Shanghai

2. 连接池配置优化

spring:datasource:hikari:maximum-pool-size: 10connection-timeout: 30000idle-timeout: 600000

3. 中文乱码处理

url: jdbc:mysql://localhost:3306/dbname?characterEncoding=utf8

六、项目结构推荐

src/main/java
├── com.example.demo
│   ├── config      # 配置类
│   ├── controller  # 控制器
│   ├── model       # 实体类
│   ├── repository  # 数据访问层
│   └── service     # 业务逻辑层
resources
├── sql             # SQL脚本存放目录
└── application.yml

七、学习资源推荐

  1. 官方文档:Spring Framework Data Access
  2. 调试技巧:IDEA 的 Database 工具 + HTTP Client 测试 API
  3. 扩展学习:Spring Data JPA 对比学习

完整示例项目:
GitHub 仓库链接
(包含单元测试、API 示例和 SQL 脚本)# 使用 IntelliJ IDEA + Spring JdbcTemplate 操作 MySQL 完全指南

一、开发环境搭建(基于 IDEA)

1. 创建 Spring Boot 项目

  1. 打开 IDEA → New Project → Spring Initializr
  2. 选择:
    • Project SDK: Java 17+
    • 依赖项:Spring Web, Spring Data JDBC, MySQL Driver

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2. 添加 MySQL 依赖

<!-- pom.xml -->
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope>
</dependency>

3. 准备 MySQL 数据库

-- 执行以下 SQL 创建数据库和表
CREATE DATABASE spring_jdbc_demo;
USE spring_jdbc_demo;CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50) NOT NULL,email VARCHAR(100) UNIQUE,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

4. 配置数据源

# application.yml
spring:datasource:url: jdbc:mysql://localhost:3306/spring_jdbc_demo?useSSL=false&serverTimezone=Asia/Shanghaiusername: rootpassword: your_passworddriver-class-name: com.mysql.cj.jdbc.Driver

二、基础 CRUD 操作

1. 实体类定义

public class User {private Integer id;private String name;private String email;private LocalDateTime createdAt;// 省略构造函数、getter/setter、toString
}

2. 插入数据(Auto Increment 处理)

@Repository
public class UserRepository {@Autowiredprivate JdbcTemplate jdbcTemplate;public int insert(User user) {String sql = "INSERT INTO users (name, email) VALUES (?, ?)";return jdbcTemplate.update(sql, user.getName(), user.getEmail());}// 获取自增主键public Integer insertAndReturnId(User user) {SimpleJdbcInsert insert = new SimpleJdbcInsert(jdbcTemplate).withTableName("users").usingGeneratedKeyColumns("id");return insert.executeAndReturnKey(user.toMap()).intValue();}
}

3. 查询数据

// 使用 BeanPropertyRowMapper 自动映射
public List<User> findAll() {return jdbcTemplate.query("SELECT id, name, email, created_at as createdAt FROM users",new BeanPropertyRowMapper<>(User.class));
}// 带条件查询
public Optional<User> findById(int id) {try {return Optional.ofNullable(jdbcTemplate.queryForObject("SELECT * FROM users WHERE id = ?",new Object[]{id},(rs, rowNum) -> new User(rs.getInt("id"),rs.getString("name"),rs.getString("email"),rs.getTimestamp("created_at").toLocalDateTime())));} catch (EmptyResultDataAccessException e) {return Optional.empty();}
}

4. 更新与删除

public int updateEmail(int id, String newEmail) {return jdbcTemplate.update("UPDATE users SET email = ? WHERE id = ?",newEmail, id);
}public int deleteById(int id) {return jdbcTemplate.update("DELETE FROM users WHERE id = ?",id);
}

三、高级功能实现

1. 批量操作(提升性能)

public int[] batchInsert(List<User> users) {return jdbcTemplate.batchUpdate("INSERT INTO users (name, email) VALUES (?, ?)",new BatchPreparedStatementSetter() {public void setValues(PreparedStatement ps, int i) throws SQLException {ps.setString(1, users.get(i).getName());ps.setString(2, users.get(i).getEmail());}public int getBatchSize() {return users.size();}});
}

2. 事务管理实战

@Service
public class UserService {@Autowiredprivate UserRepository userRepository;@Transactionalpublic void transferEmail(int fromId, int toId) {User fromUser = userRepository.findById(fromId).orElseThrow();User toUser = userRepository.findById(toId).orElseThrow();userRepository.updateEmail(fromId, "old_" + fromUser.getEmail());userRepository.updateEmail(toId, fromUser.getEmail());}
}

3. 使用 NamedParameterJdbcTemplate

@Repository
public class UserNamedRepository {private final NamedParameterJdbcTemplate namedTemplate;public UserNamedRepository(DataSource dataSource) {this.namedTemplate = new NamedParameterJdbcTemplate(dataSource);}public List<User> findByName(String name) {MapSqlParameterSource params = new MapSqlParameterSource().addValue("name", "%" + name + "%");return namedTemplate.query("SELECT * FROM users WHERE name LIKE :name",params,new BeanPropertyRowMapper<>(User.class));}
}

四、IDEA 高效开发技巧

1. 数据库连接配置

  1. 打开 IDEA Database 面板(右侧边栏)
  2. 添加 MySQL 数据源 → 填写连接信息
  3. 开启自动同步功能(方便查看表结构变化)

在这里插入图片描述

2. SQL 语句验证

  • 在代码中的 SQL 字符串上按 Alt+EnterInject language or reference → 选择 SQL
  • 获得语法高亮和自动提示功能

3. 快速测试方法

  • 在方法上右键 → Run 'methodName()'(需安装 JUnit)
  • 使用 Spring Boot Test 编写单元测试

五、常见问题排查

1. 时区问题解决方案

# 在连接字符串中添加时区参数
url: jdbc:mysql://localhost:3306/dbname?serverTimezone=Asia/Shanghai

2. 连接池配置优化

spring:datasource:hikari:maximum-pool-size: 10connection-timeout: 30000idle-timeout: 600000

3. 中文乱码处理

url: jdbc:mysql://localhost:3306/dbname?characterEncoding=utf8

六、项目结构推荐

src/main/java
├── com.example.demo
│   ├── config      # 配置类
│   ├── controller  # 控制器
│   ├── model       # 实体类
│   ├── repository  # 数据访问层
│   └── service     # 业务逻辑层
resources
├── sql             # SQL脚本存放目录
└── application.yml

七、学习资源推荐

  1. 官方文档:Spring Framework Data Access
  2. 调试技巧:IDEA 的 Database 工具 + HTTP Client 测试 API
  3. 扩展学习:Spring Data JPA 对比学习

完整示例项目:
GitHub 仓库链接
(包含单元测试、API 示例和 SQL 脚本)

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

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

相关文章

从愤怒的小鸟来看Unity武器拖尾的特效优化

目录 前言 素材下载 介绍 官方文档 不添加拖尾的效果 添加拖尾 代码控制拖尾生成 拖尾排序问题 效果 修改拖尾高度和存活时间 效果 待机时无拖尾 效果 参考 前言 在游戏开发过程中&#xff0c;我们经常需要为武器添加拖尾特效&#xff0c;效果如下所示 Unity 自…

Web开发模式 前端渲染 后端渲染 身份认证

Web 开发模式 # 目前主流的Web 开发模式 两种 一、基于 服务器端渲染 的传统 Web开发模式 二、基于 前后端分离 的新型 Web开发模式# 服务端渲染的优缺点# 优点&#xff1a;1. 前端耗时少因为服务端负责动态生成 HTML内容&#xff0c;浏览器&#xff08;包括手…

C++ WonderTrader 源码分析之浮点数处理

介绍 在WonderTrader的文件decimal.h中封装了一些用于浮点数&#xff08;double&#xff09;处理的工具函数&#xff0c;主要目的是解决浮点数精度误差带来的比较问题&#xff0c;以及进行一些常用运算&#xff08;四舍五入、比较、取模等&#xff09;。下面我们逐行详细解释每…

指针——练习

sizeof和strlensizeofsizeof是用来计算变量所占内存空间大小的&#xff0c;单位是字节&#xff0c;如果操作数是类型&#xff0c;计算的是使用类型创建的变量所占内存空间的大小。sizeof只关注占用内存空间的大小&#xff0c;不在乎内存中存放什么数据。我们来看一下这个代码&a…

华为云 Flexus 部署 coze-studio

华为云 Flexus 部署 coze-studio 一、前置 主机和程序&#xff1a;云主机&#xff08;Flexus L ubuntu&#xff09; coze-studio 部署方式&#xff1a;docker&#xff08;提前装好的&#xff09; 字节跳动开源AI智能体开发平台Coze&#xff0c;具备极低的硬件门槛——2核CPU…

Linux系统编程Day7 -- 基于Linux系统知识的第一个程序

往期内容回顾 自动化构建工具-make/Makefile gcc/g编译及链接 Vim工具的使用 Linux常用工具&#xff08;yum与vim&#xff09; ​​​​​​ Linux系统编程Day4-- Shell与权限 编写第一个Linux程序 今天我们要利用我们所学到的Linux语言来编译第一个Linux程序&#xff0c;在进行…

安卓264和265编码器回调编码数据写入.265或者.264文件、查看编码数据是否正确、转换为Mp4文件、查看Mp4文件信息等方法合集

一、写入文件 1、变量定义 private FileOutputStream m265FileOutputStream null; private File m265File null; private static final String HEVC_265_FILE_NAME "output.265"; // 或 .265 private static final String AVC_264_FILE_NAME "output.264&qu…

如何打造一支AI时代下的IT团队,为企业战略目标快速赋能

执行摘要 在当前AI技术迅猛发展的背景下&#xff0c;中国中小企业正面临着前所未有的数字化转型机遇与挑战。据最新调研显示&#xff0c;2025年全球AI市场规模将突破5000亿美元&#xff0c;而中国AI应用占比已达35%。与此同时&#xff0c;AI领域人才缺口高达1000万人&#xff0…

机器学习-LinearRegression

1、 关键数学知识点&#xff1a; 边缘概率密度 联合密度对非关注变量积分&#xff1a;fX(x)∫fX,Y(x,y)dyf_X(x)∫f_{X,Y}(x,y)dyfX​(x)∫fX,Y​(x,y)dy&#xff1b; 条件概率密度 切片 fX∣Y(x∣y)fX,Y(x,y)/fY(y)f_{X|Y}(x|y)f_{X,Y}(x,y)/f_Y(y)fX∣Y​(x∣y)fX,Y​(x,y)…

解决微信小程序中如何把npm构建的模块与主包分离,构建到分包上面

1、配置分包2、复制packge.json到分包中3、在project.config.json中增加npm配置4、终端执行npm i下载模块5、构建npm到miniprogram_npm中

自动驾驶中的传感器技术21——Camera(12)

自动驾驶摄像头的图像评测 摄像头的性能受到环境光照、天气条件、运动模糊等因素的影响&#xff0c;因此需要通过多方面的评测来确保其在各种场景下的可靠性。 在自动驾驶领域&#xff0c;图像质量评估不仅关注图像的清晰度、分辨率等传统指标&#xff0c;还需要结合目标检测…

AI+OA原生应用 麦当秀AIPPT

麦当秀也在WAIC期间重新定义AIOA一、什么是“原生AI”&#xff1f;“原生AI”可以理解为&#xff1a;AI系统本身具备完整的办公能力&#xff0c;不需要依赖传统办公软件&#xff08;如Word、Excel、PPT&#xff09;作为载体。也就是说&#xff0c;用户可以直接通过AI系统完成文…

K8S 入门操作

之前一直用kubectl这个命令操作&#xff0c;这些都是基于命令来操作K8S kubectl get pods kubectl get nodes kubectl get svc kubectl create deployment... kubectl expose deployment...kubectl 文档 命令行工具 (kubectl) | Kubernetes 命令参考 Kubectl Reference Doc…

蒙文OCR识别技术难点实现及应用场景剖析

一、蒙文OCR识别核心技术难点1. 文字特性带来的识别挑战连写特性&#xff1a;蒙文字符存在复杂的连写形式&#xff08;词首、词中、词尾变形&#xff09;方向特异性&#xff1a;传统蒙文为垂直书写&#xff08;现代也有横排&#xff09;&#xff0c;需特殊方向处理字符相似性&a…

通过docker构建一个java镜像

通过docker构建一个java镜像 FROM zlyxzq/centos7:v1 VOLUME /tmp WORKDIR /app COPY /target/aa.jar /root/app/aa.jarENV TZAsia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezoneENV JAVA_HOME /usr/local/java ENV PA…

SpringBoot学习日记 Day5:解锁企业级开发核心技能

一、前言&#xff1a;从玩具项目到生产系统经过前四天的学习&#xff0c;我们已经能够开发基础功能了。但要让应用真正具备生产价值&#xff0c;还需要掌握数据库高级操作、事务控制、缓存优化等企业级开发技能。今天就来攻克这些关键知识点&#xff01;二、JPA进阶&#xff1a…

将英文PDF文件完整地翻译成中文的4类方式

文章目录一、在线翻译服务&#xff08;最快捷&#xff0c;适合临时查看&#xff09;1.1 代表工具&#xff1a;1.2 操作流程&#xff08;以Google翻译为例&#xff09;1.3 优点和缺点1.4 适用场景二、专业软件&#xff08;最佳平衡&#xff0c;兼顾格式与质量&#xff09;2.1 代…

【分享】我国八大沙漠空间矢量范围

今天小编整理分享的是 我国八大沙漠空间矢量范围shp。▲ 我国八大沙漠空间矢量范围概况数据概况我国八大沙漠空间矢量范围。中国八大沙漠。分别为腾格里沙漠&#xff0c;塔克拉马干沙漠&#xff0c;巴丹吉林沙漠&#xff0c;库布奇沙漠&#xff0c;乌兰布和沙漠&#xff0c;库…

【音视频】WebRTC C++ native 编译

一、搭建环境 我们这里介绍在Windows10VS2019的环境下编译WebRTC源码&#xff0c;由于WebRTC源码在外网上&#xff0c;需要科学的方式下载&#xff0c;不然下载特别慢&#xff0c;建议直接找国内下载好的源码&#xff0c;这里的源码是2021年的版本&#xff1a;https://pan.bai…

Selenium在Pyhton应用

目录 1. selenium的基本原理 2. selenium环境的搭建步骤 3. 元素的定位和操作 4.元素的基本属性方法 5.浏览器的操作方法 6.三种等待 强制等待 显示等待 隐式等待 7. 键盘与鼠标的操作 鼠标悬停用 拖拽操作 8. 下拉框元素定位 9.页面滚动操作 10. 页面截图操作 S…