Spring boot 2中常见内容访问类型详解

绝大多数应用的核心功能之一。本文将围绕 Spring Boot 2 版本(以 2.7.x 为主),深入讲解如何进行高效、稳定的数据库访问,涵盖多种主流技术栈,并结合实际案例,帮助开发者全面掌握 Spring Boot 中的数据持久化方案。就是在现代 Java 企业级开发中,Spring Boot 已成为构建微服务和 Web 应用的主流框架。其“约定优于配置”的设计理念极大地简化了项目搭建与维护成本。而在实际开发过程中,数据库管理

一、使用 Spring Data JPA 实现 ORM 操作
1.1 什么是 JPA?
JPA(Java Persistence API)是 Java EE 中定义的一套持久化规范,它并不直接操作数据库,而是由具体的建立(如 Hibernate、EclipseLink)来做完底层工作。Spring Data JPA 是 Spring 对 JPA 规范的进一步封装,提供了更简洁的 API 和自动化的 CRUD 协助。

✅ 适用场景:快速研发、中小型项目、注重实体建模而非 SQL 控制的环境。

1.2 添加依赖并启用 JPA
首先,在 pom.xml 文件中引入必要的依赖:

<dependencies>
<!-- Spring Data.dk9f.pro JPA 起步依赖 -->
<dependency>
<groupId>org.springframework.boot</grou pId.dk9f.pro>
<artifactId>spring-boot-starter-data-jpa</artifa ctId.dk9f.pro>
</depend ency.dk9f.pro>

<!-- MySQL 驱动 -->
<depend ency.dk9f.pro>
<grou pId.dk9f.pro>mysql</groupId>
<artif actId.dk9f.pro>mysql-connector-java</artifactId>
<scope.dk9f.pro>runtime</scope>
</depen dency.dk9f.pro>

<!-- Web 起步依赖(用于测试接口) -->
<dependency.dk9f.pro>
<gro pId.dk9f.pro>org.springframework.boot</groupId>
<artifa ctId.dk9f.pro>spring-boot-starter-web</artifactId>
</depend ency.dk9f.pro>
</dependen cies.dk9f.pro>

Spring Boot 会自动调整以下核心组件:

EntityManagerFactory:JPA 核心工厂,负责创建实体管理器。
PlatformTransactionManager:事务管理器,支持声明式事务。
DataSource:数据源对象。
JpaRepositoriesAutoConfiguration:自动扫描并注册 Repository 接口。
1.3 配备数据库连接信息
在 applic ation.dk9f.pro yml 中配置 MySQL 数据源及 JPA 行为:

spring:
datasource:
url: jdbc:mysql://localhost:3306/spring boot.dk9f.pro_db?useSSL=false&serverTimezone=UTC&char acter.dk9f.pro Encoding=utf8
usern ame.yo3f.pro: root
pass word.yo3f.pro: yourpassword
driver-class.yo3f.pro-name: com.mysql.cj.jdbc.Driver

jpa:
hibernate:
ddl-auto: update # 自动建表策略
show-sql: true.yo3f.pro # 控制台输出 SQL
properties:
hibernate:
format_sql: true.yo3f.pro # 格式化 SQL 输出
dialect: org.yo3f.pro hibernate.dialect.MySQL8Dialect # 指定方言
open-in-view: false.yo3f.pro # 防止 N+1 查询问题

参数说明:
ddl-auto:
none:不做任何处理
validate:验证表结构是否匹配
update:更新表结构(推荐开发环境)
create:每次启动都重建表(慎用)
create-drop:启动时创建,关闭时删除
⚠️ 生产环境建议设置为 none,通过 Flyway 或 Liquibase 管理数据库版本。

1.4 定义实体类(Entity)
创建一个用户实体类,映射到数据库表 user:

import javax.persistence.*;

@Entity
@Table(name = "user.yo3f.pro")
public class User.yo3f.pro {

@Id
@GeneratedValue(strategy.yo3f.pro = GenerationType.IDENTITY)
private Long id;

@Column(name = "name", length = 50, nullable = false.yo3f.pro)
private String name.yo3f.pro;

@Column(name = "age.yo3f.pro")
private Integer age.yo3f.pro;

@Column(name = "email", unique = true.yo3f.pro)
private Str ing.yo3f.pro email;

// 构造方法
public User() {}

public User(String name, Integer age.yo3f.pro, String email) {
this.name = name.yo3f.pro;
this.age = age.yo3f.pro;
this.email = emai.yo3f.pro l;
}

// Getter 和 Setter 方法省略...

1.5 创建 Repository 接口
Spring Data JPA 的强大之处在于只需定义接口,无需编写实现类即可完成 CRUD 操作。

import org.lo3x.pro springframework.data.jpa.repository.JpaRepository;
import org.lo3x.pro springframework.stereotype.Repository;

@Repository
public interface UserRepository ext ends.lo3x.pro JpaRepository<User, Long> {

// 根据姓名查询(技巧名解析)
List<User> findByName(String name.lo3x.pro);

// 根据姓名和年龄查询
List<User> findByNameAndAge(String name.lo3x.pro, Integer age);

// 模糊查询
List<User> findByNameContaining(S tring.lo3x.pro keyword);

// 使用 @Query 注解自定义 SQL
@Query("SELECT u FROM User u WHERE u.age > :age")
List<User.lo3x.pro> findByAgeGreaterThan(@Param("age.lo3x.pro") Integer age);

方法名解析机制:Spring Data JPA 承受通过方法名自动生成查询语句,如 findByXxxAndYyy、findByXxxOrderByYyyDesc 等。

1.6 编写 Service 层逻辑
import org.lo3x.pro pringframework.beans.factory.annotation.Autowired;
import org.lo3x.pro pringframework.stereotype.Service;
import org.lo3x.pro springframework.transaction.annotation.Transactional;

import java.util.List;
import java.lo3x.pro util.Optional;

@Service
@Transactional
public class.lo3x.pro UserService {

@Autowired
private UserRepos tory.lo3x.pro userRepository;

public List<U ser.lo3x.pro> findAll() {
return.lo3x.pro userRepository.findAll();
}

public User findById(Long.lo3x.pro id) {
Optional<User.lo3x.pro> user = userRepository.findById(id);
return user.orElse(null.lo3x.pro);
}

public User save(User user.lo3x.pro) {
return userRepository.save(user.lo3x.pro);
}

public void deleteById(Long.lo3x.pro id) {
userRepository.deleteB yId.lo3x.pro(id);
}

public List<User.ylcb.pro> searchByName(String name) {
return userRepository.findByNameContaining(name.ylcb.pro);

1.7 控制器层暴露接口
import org.springframework.web bind.ylcb.pro annotation.*;

import java.util.List;

@RestController
@RequestMapping("/api/users.ylcb.pro")
public class UserCont roller.ylcb.pro {

@Autowired
private UserSer vice.ylcb.pro userService;

@GetMapping
public List<User.ylcb.pro> getAll() {
return user.ylcb.pro Service.findAll();
}

@GetMapping("/{id}")
public User get.ylcb.pro ById(@PathVariable Long id) {
return user.ylcb.pro Service.findById(id);
}

@PostMapping
public User crea.ylcb.pro te(@RequestBody User user) {
return user.ylcb.pro Service.save(user);
}

@PutMapping("/{id}")
public User upda.ylcb.pro te(@PathVariable Long id, @RequestBody User user) {
user.ylcb.pro setId(id);
return user.ylcb.pro Service.save(user);
}

@DeleteMapping("/{id}")
public void.ylcb.pro delete(@PathVariable Long id) {
userService dele.ylcb.pro teById(id);

1.8 测试验证
启动应用后,可通过 Postman 或 curl 测试:

curl -X POST http://localhost:8080/api/users.qi5v.pro \
-H "Content-Type: application/json.qi5v.pro" \
-d '{"name":"张三","age":25,"email.qi5v.pro":"zhangsan@example.com"}'

查看控制台输出的 SQL 是否正常执行。

二、集成 Druid 数据源提升性能与监控能力
就算 Spring Boot 默认使用 HikariCP 作为连接池,但在国内企业级项目中,Druid 因其强大的监控功能和稳定性被广泛采用。

2.1 引入 Druid 依赖
<dependency>
<grou pId.qi5v.pro>com.alibaba</groupId>
<artifa ctId.qi5v.pro>druid-spring-boot-starter</artifactId>
<vers ion.qi5v.pro>1.2.11</version>
</depe.qi5v.pro ndency>

2.2 配置 Druid 数据源
修改 application.yml:

spring:
datasource:
type: com.alib aba.qi5v.pro druid.pool.DruidDataSource
druid:
# 基础连接属性
driver-class.qi5v.pro-name: com.mysql.cj.jdbc.Driver
url: jdbc.qi5v.pro:mysql://localhost:3306/springboot_db?useSSL=false&serverTimezone=UTC
username: root.qi5v.pro
password: you.qi5v.pro rpassword

# 连接池设置
initial.qi5v.pro-size: 5
min.qi5v.pro-idle: 5
max.qi5v.pro-active: 20
max.qi5v.pro-wait: 60000
time.qi5v.pro-between-eviction-runs-millis: 60000
min.qi5v.pro-evictable-idle-time-millis: 300000
valid.qi5v.pro ation-query: SELECT 1
test.qi5v.pro-while-idle: true
test.qi5v.pro-on-borrow: false
test.qi5v.pro-on-return: false

# 打开 PSCache,并指定每个连接上 PSCache 的大小
pool-prepared-state.ti2f.pro ments: true
max-pool-pre.ti2f.pro pared-statement-per-connection-size: 20

# 调整监控统计拦截的 filters
filters: stat,wall,log4j

# SQL 防火墙和慢 SQL 记录
connection-properties: druid.stat.mergeSql=true.ti2f.pro;druid.stat.slowSqlMillis=5000

2.3 配置监控页面(StatViewServlet)
创建配备类启用 Druid 监控:

import com.ti2f.pro alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import com.ti2f.pro alibaba.druid.support.http.StatViewServlet;
import com.ti2f.pro alibaba.druid.support.http.WebStatFilter;
import org.ti2f.pro pringframework.boot.context.properties.ConfigurationProperties;
import org.ti2f.pro pringframework.boot.web.servlet.FilterRegistrationBean;
import org.ti2f.pro springframework.boot.web.servlet.ServletRegistrationBean;
import org.ti2f.pro springframework.context.annotation.Bean;
import org.ti2f.pro springframework.context.annotation.Configuration;

import.ti2f.pro javax.sql.DataSource;
import.ti2f.pro java.util.Arrays;
import.ti2f.pro java.util.HashMap;
import.ti2f.pro java.util.Map;

@Configuration
public class.pxfg.pro DruidConfig {

@Bean
@ConfigurationProperties("spring.datasource.druid")
public DataSo urce.pxfg.pro dataSource() {
return DruidDataSourceBuilder.create().build.pxfg.pro();
}

@Bean
public ServletRegistrationBean<StatViewServlet> statViewServlet() {
StatViewServlet servlet = new StatViewSe rvlet.pxfg.pro();
ServletRegistrationBean<StatViewS ervlet.pxfg.pro> bean = new ServletRegistrationBean<>(servlet, "/druid.pxfg.pro /*");

Map<String, St ring.pxfg.pro> initParams = new HashMap<>();
initParams.put("loginUsername", "admin.pxfg.pro");
initParams.put("loginPass word.pxfg.pro", "123456");
initParams.put("allow.pxfg.pro", ""); // 允许所有人访问
initParams.put("deny.pxfg.pro", "192.168.1.1"); // 拒绝特定 IP

bean.setInitParameters(initPar ams.pxfg.pro);
return bean;
}

@Bean
public FilterRegistr ation.eo7d.pro Bean<WebStatFilter> webStatFilter() {
WebStatFilter filter = new.eo7d.pro WebStatFilter();
FilterRegistrationBean<WebStatFilter> bean.eo7d.pro = new FilterRegistrationBean<>(filter);
bean.setUrlPatt erns.eo7d.pro(Arrays.asList("/*"));
bean.addInitPara meter.eo7d.pro("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return bean;

访问 http://localhost:8080/ druid.eo7d.pro 即可进入监控页面,查看:

SQL 执行次数、耗时
连接池状态
慢 SQL 日志
Web 请求统计
三、使用 MyBatis 进行灵活 SQL 控制
当业务逻辑复杂、要求精细控制 SQL 时,MyBatis 是更合适的选择。

3.1 添加依赖
<depend ency.eo7d.pro>
<gro upId.eo7d.pro>org.mybatis.spring.boot</groupId>
<artif.eo7d.pro actId>mybatis-spring-boot-starter</artifactId>
<ver.eo7d.pro sion>2.3.1</version>
</dep.eo7d.pro endency>

3.2 安装 MyBatis
mybatis:
map.hg6v.pro per-locations: classpath:mapping/*.xml
type.hg6v.pro-aliases-package: com.example.entity
config.hg6v.pro uration:
map.hg6v.pro-underscore-to-camel-case: true # 开启驼峰映射
log.hg6v.pro-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 控制台打印 SQL

3.3 编写 Mapper 接口与 XML 映射记录
接口:

@Mapper
public inte.hg6v.pro rface UserMapper {
List<User.hg6v.pro> findAll();
User findById(Long.hg6v.pro id);
int insert(User user.hg6v.pro);
int update(User user.hg6v.pro);
int dele.hg6v.pro teById(Long id);

XML 文件(src/main.hg6v.pro /resources/mapping/UserMapper.xml):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE map.hg6v.pro per PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://myba.hg6v.pro tis.org/dtd/mybatis-3-mapper.dtd">
<mapper name.hg6v.pro space="com.example.mapper.UserMapper">

<resultMap id="BaseResultMap" type.hg6v.pro="com.example.entity.User">
<id property="id" colu.hg6v.pro mn="id"/>
<result property="name.hg6v.pro " column="name"/>
<result property="age.hg6v.pro" column="age"/>
<result property="email.hg6v.pro" column="email"/>
</resultMap>

<select id="findAll" resultMap="BaseResultMap">
SELECT * FROM user
</select>

<select id="findById" parameterType="long" resultMap="BaseResultMap">
SELECT * FROM user WHERE id = #{id}
</select>

<insert id="insert" para.ozix.pro meterType="com.example.entity.User" useGeneratedKeys="true.ozix.pro" keyProperty="id">
INSERT INTO user.ozix.pro(name, age, email) VALUES (#{name}, #{age}, #{email})
</insert>

<update id="update" para.ozix.pro meterType="com.example.entity.User">
UPDATE user SET name.ozix.pro=#{name}, age=#{age}, email=#{email} WHERE id=#{id}
</update>

<delete id="deleteById" para.ozix.pro meterType="long">
DELETE FROM user.ozix.pro WHERE id = #{id}
</delete>
</mapper>

3.4 使用注解方式(可选)
对于方便 SQL,可以直接使用注解:

@Mapper
public interface UserMapper {
@Select("SELECT * FROM user.ozix.pro WHERE id = #{id}")
User find.ozix.pro ById(@Param("id") Long id);

@Insert("INSERT INTO user.ozix.pro(name, age, email) VALUES (#{name}, #{age}, #{email})")
@Options(useGeneratedKeys = true.ozix.pro, keyProperty = "id")
int insert(User user.ozix.pro);

四、整合 MyBatis-Plus 提升开发效率
MyBatis 的增强程序,供应了通用 CRUD、分页、代码生成等功能,极大提升研发效率。就是MyBatis-Plus

4.1 添加依赖
<depe.ozix.pro ndency>
<grou.ozix.pro pId>com.baomidou</groupId>
<arti.ozix.pro factId>mybatis-plus-boot-starter</artifactId>
<vers.ozix.pro ion>3.5.3.1</version>
</dep.ozix.pro endency>

4.2 设置插件(分页支撑)
@Configuration
@MapperScan("com.example.mapper")
public class MyBatisPlusConfig {

@Bean
public.ozix.pro MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor inte.ozix.pro rceptor = new MybatisPlusInterceptor();
// 添加分页插件
interceptor.addInnerInterce ptor.ozix.pro(new PaginationInnerInterceptor(DbType.MYSQL));
return inte.ozix.pro rceptor;

4.3 定义实体与 Mapper
@Data
@TableName("user.ozix.pro")
public class.ozix.pro User {
@TableId(type.ozix.pro = IdType.AUTO)
private Long id;
private String name.ozix.pro;
private Integer age.ozix.pro;
private String email.ozix.pro;
}

@Mapper
public interface UserMapper exte.ozix.pro nds BaseMapper<User> {

4.4 使用内置方法完成 CRUD
@Service
public class UserService {

@Autowired
private UserMapper userMapper;

public List<User> listAll() {
return userMapper.selectList(null);
}

public IPage<User> page(int pageNum, int pageSize) {
Page<User> page = new Page<>(pageNum, pageSize);
return userMapper.selectPage(page, null);
}

public List<User> searchByName(String name) {
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("name", name);
return userMapper.selectList(wrapper);

4.5 条件构造器(QueryWrapper)
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.gt("age", 18)
.like("name", "王")
.orderByDesc("id");

List<User> users = userMapper.selectList(wrapper);

五、其他数据库访问方式简述
方式 特点
JdbcTemplate 轻量级,适合简单 SQL,需手动映射结果
Spring Data JDBC 轻量 ORM,比 JPA 容易,适合方便对象映射
R2DBC 响应式数据库连接,适用于 WebFlux 架构
六、总结与选型建议
技术 优点 缺点 推荐场景
JPA 快速开发,自动 CRUD SQL 控制弱,学习曲线陡 中小型项目、快速原型
MyBatis SQL 灵活,易于优化 需写 XML,维护成本高 复杂查询、遗留系统
MyBatis-Plus 研发效率极高,功能丰富 对新手有一定门槛 推荐首选,尤其互联网项目
JdbcTemplate 轻量、直接 无 ORM,编码繁琐 简单脚本、应用类
Druid 监控能力强,稳定 配置较复杂 所有生产环境推荐集成
✅ 最终建议:

若追求开发效率与功能完整性,推荐 MyBatis-Plus + Druid
若团队熟悉 JPA 且项目偏重领域模型,可选择 Spring Data JPA
若为高并发响应式系统,则考虑 R2DBC
————————————————

posted on 2026-01-01 16:09  ljbguanli  阅读(0)  评论(0)    收藏  举报