SpringBoot关系型数据库存储技术全解析:从JDBC到MyBatis-Plus

SpringBoot中关系型数据库存储技术及框架各有特点:JDBC作为Java访问数据库的标准接口,需手动编写SQL、处理连接与结果集,虽底层但开发效率低;Hibernate是全自动ORM框架,通过对象与表映射实现CRUD自动化,开发高效却难优化复杂SQL;JPA是ORM规范,Hibernate为其主流实现,Spring Data JPA进一步简化Dao层并支持方法名自动生成SQL;MyBatis作为半自动ORM框架,将SQL与Java代码分离,保留高SQL控制权的同时简化参数和结果封装;MyBatis-Plus则是MyBatis的增强工具,自动生成CRUD接口并支持条件构造器,兼顾开发效率与灵活性。下文将以“宠物信息管理系统”为统一案例,详解各技术实现并对比优劣。

一、案例背景:宠物信息管理系统

我们以"宠物信息管理"为统一案例,需要实现以下功能:

  • 新增宠物(id、名称、品种、年龄、创建时间)

  • 查询所有宠物

  • 根据ID查询单个宠物

  • 更新宠物信息

  • 删除宠物

数据库表设计(MySQL):


CREATE TABLE `pet` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
  `name` varchar(30) DEFAULT NULL COMMENT '宠物名称',
  `breed` varchar(50) DEFAULT NULL COMMENT '宠物品种',
  `age` int(11) DEFAULT NULL COMMENT '宠物年龄',
  `create_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='宠物表';

二、逐个拆解:主流数据库存储技术实现

1. JDBC:最基础的"手工操作"

核心概念:JDBC(Java Database Connectivity)是Java访问数据库的标准接口,相当于"数据库操作的说明书"。它需要开发者手动写SQL、处理连接、结果集,步骤繁琐但最底层。

实现步骤

  1. 引入依赖(spring-boot-starter-jdbc、mysql-connector-java)

  2. 配置application.yml数据库连接信息

  3. 用JdbcTemplate模板类简化操作(Spring提供的工具类,避免重复写try-catch)

核心代码


// 1. 实体类
@Data
public class Pet {
    private Long id;
    private String name;
    private String breed;
    private Integer age;
    private LocalDateTime createTime;
}

// 2. 数据访问层
@Repository
public class PetJdbcDao {
    @Autowired
    private JdbcTemplate jdbcTemplate;

    // 新增宠物
    public int addPet(Pet pet) {
        String sql = "INSERT INTO pet(name, breed, age) VALUES(?, ?, ?)";
        return jdbcTemplate.update(sql, pet.getName(), pet.getBreed(), pet.getAge());
    }

    // 查询所有宠物
    public List<Pet> getAllPets() {
        String sql = "SELECT * FROM pet";
        return jdbcTemplate.query(sql, (rs, rowNum) -> {
            Pet pet = new Pet();
            pet.setId(rs.getLong("id"));
            pet.setName(rs.getString("name"));
            pet.setBreed(rs.getString("breed"));
            pet.setAge(rs.getInt("age"));
            pet.setCreateTime(rs.getObject("create_time", LocalDateTime.class));
            return pet;
        });
    }
}

2. Hibernate:全自动的"黑盒子"

核心概念:Hibernate是ORM(对象关系映射)框架,把Java对象和数据库表直接映射,开发者不用写SQL,框架自动完成CRUD。相当于"把宠物对象直接扔进数据库,它自己搞定存储"。

实现步骤

  1. 引入依赖(spring-boot-starter-data-jpa,Hibernate是其默认实现)

  2. 实体类加注解(@Entity、@Id等)建立映射

  3. Dao层继承JpaRepository

核心代码


// 1. 实体类(映射数据库表)
@Entity
@Data
@Table(name = "pet")
public class Pet {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY) // 自增主键
    private Long id;
    private String name;
    private String breed;
    private Integer age;
    @Column(name = "create_time", updatable = false) // 禁止更新
    private LocalDateTime createTime = LocalDateTime.now();
}

// 2. 数据访问层(不用写实现!)
public interface PetHibernateDao extends JpaRepository<Pet, Long> {
    // 继承后自带findAll、findById、save、delete等方法
}

3. JPA:统一规范的"接口协议"

核心概念:JPA(Java Persistence API)不是框架,而是ORM的规范(接口),Hibernate是它的实现之一。Spring Data JPA是对JPA的增强,让 Dao层代码更简洁,还支持自定义查询方法。

特色功能:通过方法名自动生成SQL,比如List<Pet> findByBreed(String breed);会自动执行"SELECT * FROM pet WHERE breed = ?"

核心代码( Dao层扩展)


public interface PetJpaDao extends JpaRepository<Pet, Long> {
    // 按品种查询宠物
    List<Pet> findByBreed(String breed);
    // 按年龄大于查询
    List<Pet> findByAgeGreaterThan(Integer age);
}

4. MyBatis:半自动的"SQL掌控者"

核心概念:MyBatis是半自动ORM框架,需要开发者写SQL,但把SQL和Java代码分离(放在XML或注解里),同时支持结果集映射。相当于"自己写SQL,但框架帮你处理参数和结果封装"。

实现步骤

  1. 引入依赖(spring-boot-starter-mybatis)

  2. 配置application.yml指定mapper文件路径

  3. Dao层加@Mapper注解,SQL写在XML中

核心代码


// 1. Dao层接口
@Mapper
public interface PetMybatisDao {
    void addPet(Pet pet);
    List<Pet> getAllPets();
    Pet getPetById(Long id);
}

// 2. Mapper.xml文件(resources/mapper/PetMybatisDao.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.demo.dao.PetMybatisDao">
    <insert id="addPet" parameterType="com.example.demo.entity.Pet">
        INSERT INTO pet(name, breed, age) VALUES(#{name}, #{breed}, #{age})
    </insert>
    <select id="getAllPets" resultType="com.example.demo.entity.Pet">
        SELECT * FROM pet
    </select>
</mapper>

5. MyBatis-Plus:MyBatis的"超级助手"

核心概念:MyBatis-Plus(MP)是MyBatis的增强工具,在MyBatis基础上增加了"CRUD接口自动生成"、"条件构造器"等功能,不用写XML就能实现大部分操作,同时保留MyBatis的灵活性。

实现步骤

  1. 引入依赖(spring-boot-starter-mybatis-plus)

  2. 实体类加@TableName、@TableId注解

  3. Dao层继承BaseMapper

核心代码


// 1. 实体类
@Data
@TableName("pet")
public class Pet {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private String breed;
    private Integer age;
    @TableField(value = "create_time", fill = FieldFill.INSERT) // 插入时自动填充
    private LocalDateTime createTime;
}

// 2. 自动填充处理器(处理create_time)
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
    }
}

// 3. Dao层(自带CRUD,无需写SQL)
public interface PetMpDao extends BaseMapper<Pet> {
}

// 4. 条件查询示例(Service层)
@Service
public class PetMpService {
    @Autowired
    private PetMpDao petMpDao;

    // 查询年龄大于3的狗狗
    public List<Pet> getDogsOlderThan3() {
        LambdaQueryWrapper<Pet> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(Pet::getBreed, "狗狗").gt(Pet::getAge, 3);
        return petMpDao.selectList(wrapper);
    }
}

三、横向对比:各技术优劣与选型建议

用一张表把核心差异说清楚:

技术 开发效率 SQL控制权 学习成本 性能 适用场景
JDBC 极低(全手动) 完全控制 低(基础API) 高(无额外开销) 简单项目、底层优化场景
Hibernate 高(全自动) 低(难优化复杂SQL) 高(ORM概念多) 中(自动SQL可能冗余) 快速开发、SQL简单的项目
JPA 高(接口化) 中(支持自定义SQL) 中(理解规范) 企业级项目、追求规范的团队
MyBatis 中(需写SQL) 高(SQL与代码分离) 中(XML/注解映射) 高(SQL可优化) 复杂SQL场景、需要优化性能的项目
MyBatis-Plus 极高(CRUD自动生成) 高(兼容MyBatis) 低(MyBatis基础上扩展) 绝大多数SpringBoot项目,兼顾效率与灵活

四、总结:一句话选技术

简单项目用JDBC,快速开发用Hibernate/JPA,复杂SQL用MyBatis,想"鱼和熊掌兼得"(效率+灵活)就用MyBatis-Plus——这是目前SpringBoot项目中最主流的选择。

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐