SpringBoot | 关系型数据库存储技术全解析:从JDBC到MyBatis-Plus
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、处理连接、结果集,步骤繁琐但最底层。
实现步骤:
-
引入依赖(spring-boot-starter-jdbc、mysql-connector-java)
-
配置application.yml数据库连接信息
-
用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。相当于"把宠物对象直接扔进数据库,它自己搞定存储"。
实现步骤:
-
引入依赖(spring-boot-starter-data-jpa,Hibernate是其默认实现)
-
实体类加注解(@Entity、@Id等)建立映射
-
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,但框架帮你处理参数和结果封装"。
实现步骤:
-
引入依赖(spring-boot-starter-mybatis)
-
配置application.yml指定mapper文件路径
-
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的灵活性。
实现步骤:
-
引入依赖(spring-boot-starter-mybatis-plus)
-
实体类加@TableName、@TableId注解
-
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项目中最主流的选择。
更多推荐


所有评论(0)