spring-boot-route(九)整合JPA操作数据库

本文介绍了如何利用Spring Data JPA在Spring Boot项目中进行无SQL的CRUD操作,包括引入依赖、自定义主键生成器、创建实体类和Repository接口,以及实战测试。它展示了如何通过配置避免繁琐的SQL编写,提高开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单调的增删改查让越来越多的程序员感到乏味,这时候就出现了很多优秀的框架,完成了对增删改查操作的封装,只需要简单配置,无需书写任何sql,就可以完成增删改查。这里比较推荐的是Spring Data Jpa。

Spring Data JPA是Spring Data家族的一部分,可以轻松实现基于JPA的存储库。 此模块处理对基于JPA的数据访问层的增强支持。 它使构建使用数据访问技术的Spring驱动应用程序变得更加容易。

我们继续使用前两章用的数据库结构来进行演示。

一 引入mysql和spring-data-jpa依赖

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

二 创建实体类

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Student implements Serializable {

    private static final long serialVersionUID = 6712540741269055064L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer studentId;
    private Integer age;
    private String name;
    private Integer sex;
    private Date createTime;
    private Integer status;
}

@GeneratedValue是主键生成策略,Jpa自带的几种主键生成策略如下:

  • TABLE: 使用一个特定的数据库表格来保存主键

  • SEQUENCE: 根据底层数据库的序列来生成主键,条件是数据库支持序列。这个值要与generator一起使用,generator 指定生成主键使用的生成器(可能是orcale中自己编写的序列)

  • IDENTITY: 主键由数据库自动生成(主要是支持自动增长的数据库,如mysql)

  • AUTO: 主键由程序控制,也是GenerationType的默认值

主键生成策略扩展

自定义主键生成器:

public class MyGenerator implements IdentifierGenerator {
    
    @Override
    public Serializable generate(SharedSessionContractImplementor sharedSessionContractImplementor, Object o) throws HibernateException {
        return getId();
    }
    
    public static long getId(){
        return System.currentTimeMillis();
    }
}

然后在实体类做一下配置:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Student implements Serializable {

    private static final long serialVersionUID = 6712540741269055064L;

    @Id
    @GenericGenerator(name="idGenerator",strategy = "com.javatrip.springdatajpa.entity.MyGenerator")
    @GeneratedValue(generator = "idGenerator")
    private Integer studentId;
    private Integer age;
    private String name;
    private Integer sex;
    private Date createTime;
    private Integer status;
}

三 创建dao接口

dao层接口实现JpaRepository,泛型选择pojo和其主键类型,就会自动实现简单的CRUD等接口,无需手动开发,就能快速进行调用。

public interface StudentRepository extends JpaRepository<Student,Integer> {

    /**
     * 根据年龄,名字模糊查询
     * @return
     */
    Student findByNameLikeAndAge(String name,int age);
}

Jpa除了实现CRUD方法,还支持字段名模糊查询等各种不用手写sql的操作。

四 测试类测试CRUD

@SpringBootTest
class SpringDataJpaApplicationTests {

    @Autowired
    StudentRepository repository;
    @Test
    void contextLoads() {
        // 查询所有实体
        List<Student> all = repository.findAll();
        // 根据id查询实体类
        Optional<Student> byId = repository.findById(100);
        // 根据id删除数据
        repository.deleteById(100);
        // 插入一条数据
        // 如果数据库存在该实体的主键,则更新,否则插入
        Student student = new Student();
        student.setAge(18);
        student.setName("Java旅途");
        repository.save(student);

        repository.findByNameLikeAndAge("Java",18);
    }
}

spring-data-jpa在外国程序员界非常普遍。相比其他两种方式,它不需要写sql就可以完成非常完善的数据操作,我也是比较推荐使用它作为orm框架。


本文示例代码已上传至github,点个star支持一下!

更多优质内容推荐访问 毕设侠

<think>我们将从多个维度比较Spring BootJava)和PHP(以Laravel框架为例)的优劣,包括性能、开发效率、生态系统、学习曲线、适用场景等。同时,提供代码示例对比。 # 1. 性能比较 ## Spring Boot (Java) - **优势**:基于JVM,具有优秀的并发处理能力和内存管理。对于CPU密集型和高并发场景有优势。 - **劣势**:启动时间较长,内存占用较高。 示例:简单的REST端点 ```java @RestController public class HelloController { @GetMapping("/hello") public String hello() { return "Hello, Spring Boot!"; } } ``` ## PHP (Laravel) - **优势**:PHP是解释型语言,每个请求独立,没有长期运行的内存泄漏问题。配合OPCache可提升性能。 - **劣势**:每个请求都需要重新初始化,对于I/O密集型操作效率较低。 示例:简单的REST端点 ```php // routes/api.php Route::get('/hello', function () { return response()->json(['message' => 'Hello, Laravel!']); }); ``` **性能结论**:Spring Boot在高并发、长连接(如WebSocket)场景表现更好;PHP在中小流量场景下表现足够,且易于水平扩展。 # 2. 开发效率比较 ## Spring Boot - **优势**:强大的IDE支持(IntelliJ IDEA),完善的类型系统,重构安全。 - **劣势**:配置相对复杂,需要更多样板代码。 ## Laravel - **优势**:极致的开发体验,Artisan命令行工具,简洁的Eloquent ORM,Blade模板引擎。 - **劣势**:动态类型系统可能导致运行时错误。 示例:数据库操作对比 **Spring Boot (JPA)** ```java @Entity public class User { @Id @GeneratedValue private Long id; private String name; // getters and setters } public interface UserRepository extends JpaRepository<User, Long> { List<User> findByName(String name); } @RestController public class UserController { @Autowired private UserRepository userRepo; @GetMapping("/users") public List<User> users() { return userRepo.findAll(); } } ``` **Laravel (Eloquent)** ```php // 创建模型 php artisan make:model User -m // 迁移文件 public function up() { Schema::create('users', function (Blueprint $table) { $table->id(); $table->string('name'); $table->timestamps(); }); } // app/Http/Controllers/UserController.php public function index() { return User::all(); } // routes/web.php Route::get('/users', [UserController::class, 'index']); ``` **开发效率结论**:Laravel在快速开发方面有显著优势,尤其是中小型项目。Spring Boot在大型项目中有更好的可维护性。 # 3. 生态系统和社区支持 ## Spring Boot - **优势**:庞大的Java生态系统,丰富的企业级库(如Spring Cloud, Spring Security)。微服务支持完善。 - **劣势**:学习曲线陡峭。 ## Laravel - **优势**:庞大的包市场(Packagist),丰富的扩展包(如Passport, Horizon, Scout)。社区活跃,教程丰富。 - **劣势**:深度企业级解决方案较少。 **生态系统结论**:两者都有强大的生态系统,Spring Boot更适合企业级复杂系统,Laravel更适合快速迭代的Web应用。 # 4. 学习曲线 ## Spring Boot - 需要掌握Java、JVM、Spring框架概念(IoC, AOP, MVC)。 - 学习曲线较陡峭,但长期回报高。 ## Laravel - PHP语法简单,框架设计优雅,文档完善。 - 学习曲线平缓,适合初学者快速上手。 **学习曲线结论**:PHP/Laravel更容易上手,Java/Spring Boot需要更多时间但更深入。 # 5. 适用场景 | 场景 | Spring Boot | PHP (Laravel) | |---------------------|-------------|---------------| | 大型企业应用 | ★★★★★ | ★★★☆☆ | | 高并发系统 | ★★★★★ | ★★★☆☆ | | 微服务架构 | ★★★★★ | ★★★☆☆ | | 中小型Web应用 | ★★★☆☆ | ★★★★★ | | 快速原型开发 | ★★★☆☆ | ★★★★★ | | 内容管理系统 | ★★☆☆☆ | ★★★★★ | | 长期维护项目 | ★★★★★ | ★★★★☆ | | 成本敏感项目 | ★★★☆☆ | ★★★★★ | # 6. 代码维护性和可扩展性 ## Spring Boot - 强类型语言,编译时检查,重构安全。 - 分层架构清晰,适合大型团队协作。 ## Laravel - 动态类型,重构困难,需要更多测试覆盖。 - 适合小团队快速迭代,大型项目需要严格规范。 **维护性结论**:Spring Boot在大型长期项目中有优势,Laravel在中小项目维护成本低。 # 7. 部署和运维 ## Spring Boot - 打包为JAR/WAR,通过Docker容器部署,需要JVM环境。 - 监控:Spring Boot Actuator, Micrometer, Prometheus。 ## Laravel - 部署需要Web服务器(Nginx/Apache)和PHP-FPM。 - 监控:Laravel Horizon, Telescope, 第三方服务。 **部署结论**:两者都支持容器化部署,Spring Boot更适应云原生环境。 # 8. 成本考量 ## Spring Boot - 开发者薪资较高,服务器资源消耗较大。 ## Laravel - 开发者资源丰富,服务器成本低。 **成本结论**:PHP在人力成本和服务器成本上更有优势。 # 总结:选择建议 - **选择 Spring Boot 当**: - 构建大型复杂的企业级应用 - 需要高并发、高可用性 - 需要深度集成微服务架构 - 项目预算充足,追求长期稳定 - **选择 PHP (Laravel) 当**: - 开发中小型Web应用或API - 需要快速原型开发和迭代 - 预算有限,人力成本敏感 - 团队熟悉PHP或需要快速上手 # 混合架构建议 在实际项目中,可以采用混合架构: - 核心服务用Spring Boot构建(如交易、用户账户) - 边缘服务用Laravel构建(如CMS、营销页面) 通过API网关整合两种技术栈,发挥各自优势。 §§相关问题§§: 1. 如何将Spring Boot微服务与Laravel前端应用整合? 2. 在云原生环境中,Spring Boot和Laravel的部署最佳实践是什么? 3. Java和PHP在内存管理机制上有哪些本质区别? 4. 如何为团队选择合适的技术栈:Spring Boot还是Laravel?</think># Spring Boot 与 PHP 的全面对比分析 我将从多个维度对 Spring BootJava)和 PHP(以 Laravel 框架为例)进行全面对比,包括性能、生态系统、开发效率、适用场景等关键方面。 ## 1. 性能对比 ### Spring Boot 性能特点 ```java // 简单的 Spring Boot 控制器 @RestController public class PerformanceController { @GetMapping("/heavy-computation") public String heavyComputation() { long start = System.currentTimeMillis(); // 模拟 CPU 密集型计算 double result = 0; for (int i = 0; i < 10000000; i++) { result += Math.sin(i) * Math.cos(i); } long duration = System.currentTimeMillis() - start; return "Computation took: " + duration + "ms"; } } ``` **优势**: - JVM 的 JIT 编译器优化长期运行的应用程序 - 更好的多线程支持(每个请求在独立线程运行) - 内存管理更高效(GC 优化) - 平均响应时间:15-50ms(计算密集型) **劣势**: - 较高的内存占用(最小 100MB+) - 较长的启动时间(5-30秒) ### PHP (Laravel) 性能特点 ```php // 简单的 Laravel 路由 Route::get('/heavy-computation', function () { $start = microtime(true); // 模拟 CPU 密集型计算 $result = 0; for ($i = 0; $i < 10000000; $i++) { $result += sin($i) * cos($i); } $duration = round((microtime(true) - $start) * 1000, 2); return "Computation took: {$duration}ms"; }); ``` **优势**: - 更低的初始内存占用(约 20-50MB) - 无冷启动问题(每个请求独立处理) - 配合 OPcache 可显著提升性能 - 平均响应时间:20-60ms(计算密集型) **劣势**: - 每个请求需要重新初始化 - 缺乏真正的多线程支持 **性能结论**: - **CPU 密集型**:Spring Boot (Java) 通常有 10-30% 的性能优势 - **I/O 密集型**:两者相当,取决于具体实现 - **内存效率**:PHP 有优势,特别是小型应用 - **启动时间**:PHP 有显著优势 ## 2. 生态系统与社区支持 ### Spring Boot 生态系统 ```xml <!-- 典型的 Spring Boot pom.xml 依赖 --> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency> </dependencies> ``` **优势**: - 企业级解决方案完善(Spring Cloud, Spring Security, Spring Data) - 强大的微服务支持(服务发现、配置中心、断路器) - 丰富的云原生集成(Kubernetes, Docker) - 成熟的大数据支持(Spark, Hadoop 集成) **劣势**: - 学习曲线陡峭 - 依赖管理复杂(Maven/Gradle) ### PHP (Laravel) 生态系统 ```json // 典型的 Laravel composer.json { "require": { "laravel/framework": "^9.0", "laravel/sanctum": "^3.0", "laravel/telescope": "^4.0", "laravel/horizon": "^5.0", "spatie/laravel-permission": "^5.0" } } ``` **优势**: - 丰富的 Web 开发专用包(身份验证、支付、API 开发) - 内容管理系统集成(WordPress, Drupal 等) - 简单直观的依赖管理(Composer) - 强大的社区支持(Packagist 有超过 35 万个包) **劣势**: - 企业级解决方案较少 - 微服务支持较弱(需额外工具) **生态系统结论**: - **企业应用**:Spring Boot 更优 - **Web 应用/API**:Laravel 更优 - **云原生**:Spring Boot 有优势 - **快速开发**:Laravel 有优势 ## 3. 开发效率对比 ### Spring Boot 开发效率 ```java // 创建带验证的 REST 端点 @RestController @RequestMapping("/api/users") public class UserController { @PostMapping public ResponseEntity<User> createUser(@Valid @RequestBody UserDto userDto) { User user = userService.createUser(userDto); return ResponseEntity.created(URI.create("/users/" + user.getId())) .body(user); } // 需要额外定义 UserDto 和验证注解 } // UserDto.java public class UserDto { @NotBlank @Size(min = 3, max = 50) private String username; @Email private String email; // getters/setters } ``` **开发效率特点**: - 强大的 IDE 支持(IntelliJ IDEA 等) - 编译时错误检查 - 重构安全 - 但需要更多样板代码 ### PHP (Laravel) 开发效率 ```php // 创建带验证的 REST 端点 Route::post('/users', function (Request $request) { $validated = $request->validate([ 'username' => 'required|min:3|max:50', 'email' => 'required|email' ]); $user = User::create($validated); return response()->json($user, 201); }); ``` **开发效率特点**: - Artisan 命令行工具自动化任务 - 简洁的 Eloquent ORM - Blade 模板引擎 - 更少的样板代码 - 但缺少编译时检查 **开发效率结论**: - **原型开发**:Laravel 显著更快 - **大型项目**:Spring Boot 的强类型系统在长期维护中更优 - **团队协作**:Spring Boot 的强类型系统减少错误 - **迭代速度**:Laravel 有优势 ## 4. 安全对比 ### Spring Security 特性 ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/public/**").permitAll() .anyRequest().authenticated() .and() .oauth2ResourceServer() .jwt(); } } ``` **安全优势**: - 细粒度的访问控制 - 完善的 OAuth2 支持 - 强大的企业安全特性(SAML, LDAP) - 类型安全的配置 ### Laravel 安全特性 ```php // 在控制器中使用授权 public function update(Request $request, Post $post) { $this->authorize('update', $post); // 更新逻辑 } // API 认证 Route::middleware('auth:sanctum')->group(function () { Route::get('/user', function (Request $request) { return $request->user(); }); }); ``` **安全优势**: - 简洁的授权语法 - Sanctum 提供 API 令牌认证 - 内置 CSRF 保护 - 简洁的密码哈希 **安全结论**: - **企业级安全**:Spring Security 更强大 - **API 安全**:两者都提供良好支持 - **配置复杂度**:Laravel 更简单 - **学习曲线**:Laravel 更容易上手 ## 5. 适用场景对比 ### 最佳使用场景 | 应用类型 | 推荐技术 | 理由 | |------------------------|---------------|------| | 大型企业系统 | Spring Boot | 类型安全、微服务支持、企业集成 | | 高并发交易平台 | Spring Boot | JVM 性能优化、线程管理 | | 内容管理系统 | Laravel | 快速开发、丰富的CMS插件 | | 初创公司 MVP | Laravel | 快速迭代、低成本 | | 微服务架构 | Spring Boot | Spring Cloud 生态完善 | | RESTful API 服务 | 两者皆可 | Laravel更简洁,Spring Boot更健壮 | | 实时数据处理 | Spring Boot | 更好的多线程支持 | | 小型到中型Web应用 | Laravel | 开发速度快、部署简单 | ## 6. 成本对比分析 ### 开发成本 ```markdown | 成本类型 | Spring Boot | PHP (Laravel) | |------------------|------------------------------|----------------------------| | 开发者薪资 | 较高(全球平均高20-30%) | 较低 | | 学习曲线 | 陡峭(3-6个月熟练) | 平缓(1-3个月熟练) | | 开发速度 | 较慢(强类型增加严谨性) | 较快(动态类型提高效率) | | 团队规模 | 适合中大型团队 | 适合小型到中型团队 | ``` ### 运维成本 ```markdown | 运维方面 | Spring Boot | PHP (Laravel) | |------------------|------------------------------|----------------------------| | 内存消耗 | 较高(最小100MB+) | 较低(最小20-50MB) | | CPU 使用 | 中等 | 中等 | | 扩展性 | 优秀(垂直+水平) | 良好(主要水平扩展) | | 云成本 | 较高(需要更多资源) | 较低 | | 容器化支持 | 优秀(JVM优化) | 良好 | ``` ## 7. 未来趋势与就业市场 ### 技术趋势 - **Spring Boot**:云原生、微服务、响应式编程 - **PHP**:PHP 8.x 性能提升(JIT编译器)、Laravel Octane(Swoole/RoadRunner) ### 就业市场(2023数据) ```markdown | 指标 | Spring Boot | PHP (Laravel) | |------------------|------------------------------|----------------------------| | 全球职位数量 | 约 120,000 | 约 90,000 | | 薪资范围(美国) | $90,000 - $160,000 | $70,000 - $130,000 | | 企业采用率 | 财富500强中65% | 全球网站中78% | | 新兴领域 | 云原生、大数据 | API 服务、CMS | ``` ## 混合架构实践案例 ### 电商平台架构示例 ```mermaid graph TD A[客户端] --> B[API Gateway: Spring Cloud Gateway] B --> C[用户服务: Spring Boot] B --> D[产品服务: Spring Boot] B --> E[订单服务: Spring Boot] B --> F[内容服务: Laravel] F --> G[WordPress 集成] C --> H[MySQL 集群] D --> I[Elasticsearch] E --> J[Redis 缓存] ``` **架构说明**: 1. 核心服务(用户、产品、订单)使用 Spring Boot 2. 内容服务(CMS、营销页面)使用 Laravel 3. API 网关统一入口 4. 混合使用 SQL 和 NoSQL 数据库 ## 总结:选择建议 ### 选择 Spring Boot 当: - 构建大型企业级应用系统 - 需要高并发处理能力 - 项目需要严格的类型安全 - 与大数据或AI技术集成 - 预算充足且需要长期维护 ### 选择 PHP (Laravel) 当: - 开发内容驱动的网站或应用 - 需要快速原型开发和迭代 - 预算有限或资源受限 - 团队熟悉PHP生态系统 - 项目规模中小型 ### 迁移策略建议: 1. **混合架构**:核心服务用 Spring Boot,边缘服务用 Laravel 2. **逐步迁移**:使用 API 网关整合新旧系统 3. **服务拆分**:将适合 PHP 的模块拆分出来 4. **统一接口**:保持 REST API 规范一致 最终选择应基于: - 项目规模和复杂度 - 团队技能和经验 - 性能要求 - 长期维护计划 - 预算限制
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java旅途

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值