【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都以其"约定优于配置"的理念,让开发者能够集中精力于业务逻辑的实现,而不是纠结于繁琐的配置和底层实现细节。下一节我们来学习一下事务管理

相关推荐
君不见,青丝成雪1 分钟前
Hadoop技术栈(四)HIVE常用函数汇总
大数据·数据库·数据仓库·hive·sql
刘一说7 分钟前
CentOS 系统 Java 开发测试环境搭建手册
java·linux·运维·服务器·centos
Victor35612 分钟前
Redis(14)Redis的列表(List)类型有哪些常用命令?
后端
Victor35612 分钟前
Redis(15)Redis的集合(Set)类型有哪些常用命令?
后端
卷福同学13 分钟前
来上海三个月,我在马路边上遇到了阿里前同事...
java·后端
bingbingyihao2 小时前
多数据源 Demo
java·springboot
不羁。。5 小时前
【撸靶笔记】第七关:GET - Dump into outfile - String
数据库·笔记·oracle
yangchanghua1117 小时前
pgsql 如何查询今天范围内的数据(当天0点0分0秒 - 当天23点59分59秒....)
数据库·pgsql
larance7 小时前
SQLAlchemy 的异步操作来批量保存对象列表
数据库·python
python_chai7 小时前
从数据汇总到高级分析,SQL 查询进阶实战(下篇)—— 分组、子查询与窗口函数全攻略
数据库·sql·mysql