一、前言
在 java web 开发中,数据库访问是绕不开的话题。
传统方式使用 jdbc 编写 sql,维护困难、可读性差。后来有了 mybatis 这种半自动 orm 框架,再到 jpa(java persistence api)这种全自动 orm 规范,可以让我们用面向对象的方式操作数据库,而不必写大量 sql。
spring boot 对 jpa 提供了非常友好的自动化支持,几乎可以“零配置”就完成数据库操作。
二、jpa 简介
jpa(java persistence api)并不是一个具体实现,而是 java 官方定义的 orm 规范,它的常见实现有:
- hibernate(最常用,spring boot 默认 jpa 实现)
- eclipselink
- openjpa
核心思想:
用 实体类(entity)映射数据库表,用 方法调用 代替手写 sql。
例如:
// 查询所有用户
list<user> users = userrepository.findall();
// 根据用户名查询
user user = userrepository.findbyusername("tom");
三、项目环境准备
1. 新建 spring boot 项目
在 spring initializr 选择:
spring boot 版本:3.x(或 2.7.x)
依赖:
- spring web
- spring data jpa
- mysql driver
生成后导入 ide(intellij idea / vscode)。
2. maven 依赖
如果是手动添加,pom.xml 配置如下:
<dependencies>
<!-- spring web -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-web</artifactid>
</dependency>
<!-- spring data jpa -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-data-jpa</artifactid>
</dependency>
<!-- mysql 驱动 -->
<dependency>
<groupid>com.mysql</groupid>
<artifactid>mysql-connector-j</artifactid>
<scope>runtime</scope>
</dependency>
<!-- 测试依赖 -->
<dependency>
<groupid>org.springframework.boot</groupid>
<artifactid>spring-boot-starter-test</artifactid>
<scope>test</scope>
</dependency>
</dependencies>
3. 配置数据库连接
在 application.yml 中配置:
spring:
datasource:
url: jdbc:mysql://localhost:3306/jpa_demo?usessl=false&servertimezone=utc
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.driver
jpa:
hibernate:
ddl-auto: update # 自动建表(create、update、validate、none)
show-sql: true # 控制台打印 sql
properties:
hibernate:
format_sql: true # 格式化 sql 输出
ddl-auto 参数说明:
create:每次启动删除旧表,创建新表update:如果表不存在则创建,如果有新字段则更新validate:验证表结构和实体类是否匹配none:不做任何处理
四、编写 jpa 样例
1. 创建实体类
user.java
package com.example.jpademo.entity;
import jakarta.persistence.*;
import lombok.data;
@data
@entity
@table(name = "users") // 表名
public class user {
@id
@generatedvalue(strategy = generationtype.identity) // 自增主键
private long id;
@column(nullable = false, unique = true, length = 50)
private string username;
@column(nullable = false)
private string password;
}
2. 创建 repository 接口
userrepository.java
package com.example.jpademo.repository;
import com.example.jpademo.entity.user;
import org.springframework.data.jpa.repository.jparepository;
public interface userrepository extends jparepository<user, long> {
// 按用户名查找
user findbyusername(string username);
}
jparepository 已经内置了大量方法:save()、findall()、findbyid()、deletebyid() 等。
3. 创建 service 层
userservice.java
package com.example.jpademo.service;
import com.example.jpademo.entity.user;
import com.example.jpademo.repository.userrepository;
import org.springframework.stereotype.service;
import java.util.list;
@service
public class userservice {
private final userrepository userrepository;
public userservice(userrepository userrepository) {
this.userrepository = userrepository;
}
public list<user> getallusers() {
return userrepository.findall();
}
public user createuser(user user) {
return userrepository.save(user);
}
}
4. 创建 controller
usercontroller.java
package com.example.jpademo.controller;
import com.example.jpademo.entity.user;
import com.example.jpademo.service.userservice;
import org.springframework.web.bind.annotation.*;
import java.util.list;
@restcontroller
@requestmapping("/users")
public class usercontroller {
private final userservice userservice;
public usercontroller(userservice userservice) {
this.userservice = userservice;
}
@getmapping
public list<user> list() {
return userservice.getallusers();
}
@postmapping
public user add(@requestbody user user) {
return userservice.createuser(user);
}
}
五、运行测试
启动 spring boot 项目(idea run)
使用 postman 测试:
新增用户
post http://localhost:8080/users
content-type: application/json
{
"username": "tom",
"password": "123456"
}
查询所有用户
get http://localhost:8080/users
控制台会输出类似:
insert into users (password, username) values (?, ?) select u1_0.id, u1_0.password, u1_0.username from users u1_0
六、常见问题
为什么启动时会自动建表?
因为 spring.jpa.hibernate.ddl-auto 设置了 update,hibernate 会自动根据实体生成表结构。
不想自动建表怎么办?
把 ddl-auto 改成 none 或 validate,用手动 sql 建表。
怎么写复杂 sql?
- 方法名查询:
findbyusernameandpassword - jpql 查询:
@query("select u from user u where u.username = ?1") - 原生 sql:
@query(value = "select * from users where username = ?1", nativequery = true)
七、总结
spring boot 集成 jpa 最大的优点就是:
- 几乎零配置即可运行
- 面向对象操作数据库,减少 sql 编写
- 内置方法丰富,支持分页、排序、条件查询
- 复杂 sql 也可以灵活编写
但要注意:
- 适合中小型业务,超复杂 sql 可能 mybatis 更高效
ddl-auto在生产环境建议设为none,防止误删表- 尽量用事务(
@transactional)保证数据一致性
以上就是springboot集成jpa全指南的详细内容,更多关于springboot集成jpa的资料请关注代码网其它相关文章!
发表评论