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

发布于:2025-08-08 ⋅ 阅读:(19) ⋅ 点赞:(0)

使用 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/Shanghai
    username: root
    password: your_password
    driver-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 {
    
    @Autowired
    private 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 {

    @Autowired
    private UserRepository userRepository;

    @Transactional
    public 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: 10
      connection-timeout: 30000
      idle-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/Shanghai
    username: root
    password: your_password
    driver-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 {
    
    @Autowired
    private 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 {

    @Autowired
    private UserRepository userRepository;

    @Transactional
    public 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: 10
      connection-timeout: 30000
      idle-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 脚本)


网站公告

今日签到

点亮在社区的每一天
去签到