SpringBoot--SpringBoot与数据访问

📅 2026/7/6 14:44:53
SpringBoot--SpringBoot与数据访问
五、SpringBoot与数据访问1、JDBC把spring-boot-starter-data-jdbc依赖换成spring-boot-starter-jdbc依赖加入mysql-connector-j依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-jdbc/artifactId /dependency dependency groupIdcom.mysql/groupId artifactIdmysql-connector-j/artifactId /dependency测试2、 整合Druid数据源引入druid依赖dependency groupIdcom.alibaba/groupId artifactIddruid/artifactId version1.2.27/version /dependency测试3、整合MyBatis(1)注解版引入mybatis-spring-boot-starter依赖dependency groupIdorg.mybatis.spring.boot/groupId artifactIdmybatis-spring-boot-starter/artifactId version3.0.3/version /dependency测试(2)配置文件版测试4、整合SpringData JPA JPA 简介JPAJava Persistence APIJava 持久层 API是 Java EE / Jakarta EE 平台中一套对象关系映射ORM规范定义了 Java 对象与关系数据库表之间的映射规则以及一套标准的 API 用于数据持久化操作。 核心概念概念说明实体Entity使用Entity注解的普通 Java 类POJO对应数据库中的一张表。映射元数据通过注解如Table、Column、Id或 XML 文件描述实体类字段与数据库列的对应关系。EntityManager核心接口负责管理实体的生命周期增删改查、事务控制以及缓存。JPQLJava Persistence Query Language面向对象的查询语言类似 SQL 但操作的是实体对象而非表。Criteria API类型安全的动态查询构建 API用于替代字符串拼接的 JPQL。✅ 主要优点标准化JPA 是 Java 官方规范不绑定特定实现可在不同实现如 Hibernate、EclipseLink、OpenJPA之间切换。简化开发通过注解和 API 大幅减少 JDBC 样板代码提高开发效率。对象与关系自动映射自动将 Java 对象转换为 SQL 语句反之亦然。缓存与性能优化支持一级缓存Session 级和二级缓存全局减少数据库访问。事务管理与 Spring 等容器集成支持声明式事务。 JPA 与 Hibernate 的关系JPA 是规范接口定义Hibernate 是 JPA 的一个实现同时也提供了更丰富的扩展功能。Spring Boot 默认使用 Hibernate 作为 JPA 实现通过spring-boot-starter-data-jpa引入。使用 JPA 规范的好处是你可以更换底层实现如切换到 EclipseLink而无需修改业务代码。️ 在 Spring Boot 中如何使用添加依赖spring-boot-starter-data-jpa 数据库驱动如 MySQL。配置数据库连接在application.yml中配置数据源和 JPA 属性如ddl-auto、show-sql。编写实体类使用 JPA 注解如Entity、Id映射表和字段。定义 Repository 接口继承JpaRepositoryT, ID即可获得基本的 CRUD 方法无需实现类。编写业务代码通过注入 Repository 进行数据操作。Entity Table(name tbl_user) public class User { Id GeneratedValue(strategy GenerationType.IDENTITY) private Long id; Column(name last_name, length 50) private String lastName; private String email; // 省略构造器、getter/setter } ​ // Repository 接口 public interface UserRepository extends JpaRepositoryUser, Long { ListUser findByLastNameLike(String pattern); } ​ // 使用 Autowired private UserRepository userRepository; ​ public void test() { User user userRepository.findById(1L).orElse(null); ListUser users userRepository.findByLastNameLike(张%); }⚠️ 常见注意事项JPA 默认的 “N1 查询” 问题需要合理使用FetchType或EntityGraph优化。ddl-autoupdate在生产环境需谨慎推荐使用 Flyway/Liquibase 管理数据库 schema。实体类必须有无参构造器JPA 规范要求。主键生成策略GenerationType需与数据库特性匹配如 MySQL 常用IDENTITY。例application.ymlspring: datasource: url: jdbc:mysql://localhost:3306/test?useSSLfalseuseUnicodetruecharacterEncodingutf8 username: root password: driver-class-name: com.mysql.jdbc.Driver jpa: hibernate: ddl-auto: update # 更新或者创建数据表结构 show-sql: true # 控制台显示SQL实体类User//使用JPA注解配置映射关系 Entity //告诉JPA这是一个实体类和数据表映射的类 Table(name tbl_user) //Table来指定和哪个数据表对应;如果省略默认表名就是user Data public class User { Id //这是一个主键 GeneratedValue(strategy GenerationType.IDENTITY)//自增主键 private Integer id; Column(name last_name,length 50) //这是和数据表对应的一个列 private String lastName; Column //省略默认列名就是属性名 private String email; }编写一个Dao接口来操作实体类对应的数据表Repository根据id查询用户信息插入新用户查看 lastName 以 ad 开头的用户列表查看 lastName 以 ad 开头的用户列表RestController public class UserController { Autowired UserRepository userRepository; /** * 根据id查询用户信息 * http://localhost:8080/user/1 */ GetMapping(/user/{id}) public User getUser(PathVariable(id) Integer id){ User user userRepository.findById(id).get(); return user; } /** * 插入新用户 * http://localhost:8080/user?lastNameliliemaillilitest.com */ GetMapping(/user) public User insertUser(User user){ User save userRepository.save(user); return save; } /** * 查看 lastName 以 ad 开头的用户列表 * http://localhost:8080/userByName */ GetMapping(/userByName) public ListUser getUserByName(User user){ user.setLastName(ad); ExampleMatcher exampleMatcher ExampleMatcher.matching() //模糊匹配{lastName}% .withMatcher(lastName, ExampleMatcher.GenericPropertyMatcher::startsWith); ExampleUser example Example.of(user, exampleMatcher); ListUser all userRepository.findAll(example); return all; } /** * 查看 lastName 以 ad 开头的用户列表 * http://localhost:8080/userByNameLike */ GetMapping(/userByNameLike) public ListUser getUserByNameLike(User user) { user.setLastName(ad); ListUser all userRepository.findByLastNameLike(user.getLastName() %); return all; } }