【SpringBoot3.x教程05】SpringBoot与关系型数据库的整合

前言:常用的ORM框架有哪些

JdbcTemplate

JdbcTemplate 是Spring框架提供的一个JDBC抽象库,旨在简化传统的JDBC操作,避免了繁琐的JDBC代码和数据库资源的手动处理。通过JdbcTemplate,开发者可以更加专注于业务逻辑而不是数据库的连接管理和资源释放。

核心特点

  • 简化数据库交互:自动处理连接的开启和关闭,减少了重复的数据库连接代码。
  • 异常处理 :提供了一个统一的异常处理机制,将SQL异常转换为DataAccessException,方便异常管理。
  • 灵活的查询和更新操作:支持直接执行SQL查询和更新操作,以及调用存储过程。
  • 回调机制 :通过RowMapperResultSetExtractor等回调接口,可以将数据库结果集映射到Java对象或集合。

使用场景:适用于需要直接使用SQL进行数据操作的场景,特别是在需要细粒度控制SQL执行和结果映射时。

Spring Data JPA

Spring Data JPA 是对JPA(Java Persistence API)的进一步封装和整合,目的是简化JPA的使用和提高开发效率。Spring Data JPA通过提供repository抽象层,使得数据库操作更加简单。

核心特点

  • 简化数据访问层(DAO)代码 :通过扩展JpaRepository接口,自动实现了一系列标准的数据访问方法,如保存、删除、查询等。
  • 查询方法名解析:支持通过解析方法名自动生成查询,无需编写查询语句。
  • 查询注解 :通过@Query注解,可以自定义JPQL(Java Persistence Query Language)或原生SQL查询。
  • 事务管理:整合了Spring的声明式事务管理。

使用场景:适用于JPA项目,特别是对于域驱动设计(DDD)和需要快速开发的应用程序。

MyBatis

MyBatis 是一个半ORM(对象关系映射)框架,提供了对象与数据库之间的映射,同时保留了编写原生SQL的能力。它避免了JDBC代码的繁琐和手动设置参数、获取结果集的过程,同时提供了更多的控制权和灵活性。

核心特点

  • 灵活的SQL编写:支持完全的SQL编写,使得开发者可以利用数据库的特性,如窗口函数、CTE(公用表表达式)等。
  • 动态SQL:支持动态SQL语句的构建,根据条件拼接不同的SQL片段。
  • 映射器(Mapper)XML文件:通过XML文件或注解定义SQL语句和映射规则。
  • 延迟加载:支持关联对象的延迟加载。

使用场景:适用于那些需要高度控制SQL语句,或数据库设计复杂、需要优化数据库查询性能的项目。

本文重点:学会三种方式的CRUD操作

第一步:引入pom依赖
<!-- MySQL 驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Spring Boot Starter for Data JPA -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- Spring Boot Starter for JdbcTemplate -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- MyBatis Spring Boot Starter -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.1.4</version>
</dependency>
第二步:配置数据库属性
spring.datasource.url=jdbc:mysql://xxxx:3306/nextJava?useSSL=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456

# JPA特有配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

# MyBatis特有配置
mybatis.mapper-locations=classpath:mappers/*.xml
第三步:代码实现
  1. 使用JdbcTemplate

    @Repository
    public class UserRepository {
    @Autowired
    private JdbcTemplate jdbcTemplate;

     // 增
     public int save(User user) {
         return jdbcTemplate.update("INSERT INTO user(name, email) VALUES(?, ?)",
                                     user.getName(), user.getEmail());
     }
    
     // 删
     public int deleteById(Long id) {
         return jdbcTemplate.update("DELETE FROM user WHERE id = ?", id);
     }
    
     // 改
     public int update(User user) {
         return jdbcTemplate.update("UPDATE user SET name = ?, email = ? WHERE id = ?",
                                     user.getName(), user.getEmail(), user.getId());
     }
    
     // 查
     public User findById(Long id) {
         return jdbcTemplate.queryForObject("SELECT * FROM user WHERE id = ?",
                                            new Object[]{id},
                                            (rs, rowNum) ->
                                                    new User(
                                                            rs.getLong("id"),
                                                            rs.getString("name"),
                                                            rs.getString("email")
                                                    ));
     }
    

    }

2、使用Spring Data JPA

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    // Constructors, Getters and Setters
}

使用Spring Data JPA,只需要定义接口,继承JpaRepository即可自动拥有增删改查功能:

public interface UserRepository extends JpaRepository<User, Long> {
}

3、使用Mybatis

在src/main/resources/mappers目录下创建MyBatis的映射文件UserMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.UserMapper">
    <insert id="save" parameterType="com.example.model.User">
        INSERT INTO user(name, email) VALUES(#{name}, #{email})
    </insert>
    <delete id="deleteById" parameterType="long">
        DELETE FROM user WHERE id = #{id}
    </delete>
    <update id="update" parameterType="com.example.model.User">
        UPDATE user SET name = #{name}, email = #{email} WHERE id = #{id}
    </update>
    <select id="findById" parameterType="long" resultType="com.example.model.User">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>

以及Mapper类

@Mapper
public interface UserMapper {
    void save(User user);
    void deleteById(Long id);
    void update(User user);
    User findById(Long id);
}

对应表创建语句为:

CREATE TABLE IF NOT EXISTS `User` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(255) NOT NULL,
  `email` VARCHAR(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `email_unique` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

结束语

无论是使用JdbcTemplate来直接操作数据库,还是利用Spring Data JPA和MyBatis这样的ORM框架来简化数据持久层的开发,Spring Boot都以其"约定优于配置"的理念,让开发者能够集中精力于业务逻辑的实现,而不是纠结于繁琐的配置和底层实现细节。下一节我们来学习一下事务管理

相关推荐
time never ceases16 分钟前
使用docker方式进行Oracle数据库的物理迁移(helowin/oracle_11g)
数据库·docker·oracle
Frank牛蛙19 分钟前
1.每日SQL----2024/11/7
数据库·sql
Ciderw21 分钟前
块存储、文件存储和对象存储详细介绍
网络·数据库·nvme·对象存储·存储·块存储·文件存储
薛晓刚22 分钟前
数据库优化指南:如何将基本功能运用到极致?
数据库
stars_User25 分钟前
MySQL数据库面试题(下)
数据库·mysql
沈询-阿里35 分钟前
java-智能识别车牌号_基于spring ai和开源国产大模型_qwen vl
java·开发语言
AaVictory.41 分钟前
Android 开发 Java中 list实现 按照时间格式 yyyy-MM-dd HH:mm 顺序
android·java·list
Yaml41 小时前
智能化健身房管理:Spring Boot与Vue的创新解决方案
前端·spring boot·后端·mysql·vue·健身房管理
未来之窗软件服务1 小时前
sql速度优化多条合并为一条语句
数据库