Spring Boot 结合 JPA(Java Persistence API)提供了一种非常强大且灵活的数据访问方式,使得开发者能够更专注于业务逻辑的实现,而不是底层的数据库操作。以下是对Spring Boot数据访问JPA的总结:
1. 依赖引入
在Spring Boot项目中,要使用JPA,首先需要在pom.xml
(Maven项目)或build.gradle
(Gradle项目)中引入JPA的依赖,通常还会包括数据库驱动和Spring Data JPA的starter依赖。例如,对于Maven项目,可以添加如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
2. 配置数据源
在application.properties
或application.yml
配置文件中,配置数据库连接信息、JPA相关属性(如DDL生成策略、显示SQL等)。
spring.application.name=T369-Spring-Boot
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/crm?useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456
#??JPA(Hibernate)????
#spring.jpa.properties.hibernate.hbm2ddl.auto=update
#spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
#spring.jpa.show-sql=true
#spring.jpa.properties.hibernate.format_sql=true
#mybatis.config-location=classpath:mybatis/mybatis-config.xml
#mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
mybatis.type-aliases-package=com.ktjiaoyu.crm.entity
logging.level.root=warn
logging.level.com.ktjiaoyu.crm.mapper=trace
logging.pattern.console=%p%m%n
3. 实体类
使用JPA注解(如@Entity
, @Id
, @GeneratedValue
, @Column
等)定义实体类,映射数据库表及其字段。
package com.ktjiaoyu.crm.entity;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
@Entity
@Table(name = "sys_role")
public class Role implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "role_id")
private Long roleId;
@Column(name = "role_name")
private String roleName;
@Column(name = "role_desc")
private String roleDesc;
@Column(name = "role_flag")
private Integer roleFlag;
@OneToMany(targetEntity = User.class,fetch = FetchType.LAZY,cascade = CascadeType.REMOVE,mappedBy = "role")
private Set<User> users=new HashSet<User>();
public Role() {
}
public Role(String roleName, String roleDesc, Integer roleFlag) {
this.roleName = roleName;
this.roleDesc = roleDesc;
this.roleFlag = roleFlag;
}
public Long getRoleId() {
return roleId;
}
public void setRoleId(Long roleId) {
this.roleId = roleId;
}
public String getRoleName() {
return roleName;
}
public void setRoleName(String roleName) {
this.roleName = roleName;
}
public String getRoleDesc() {
return roleDesc;
}
public void setRoleDesc(String roleDesc) {
this.roleDesc = roleDesc;
}
public Integer getRoleFlag() {
return roleFlag;
}
public void setRoleFlag(Integer roleFlag) {
this.roleFlag = roleFlag;
}
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
}
4. 仓库接口
继承JpaRepository
或CrudRepository
(或其他特定查询的仓库接口),定义数据访问方法。Spring Data JPA会基于方法名或@Query
注解自动实现这些方法。
import org.springframework.data.jpa.repository.JpaRepository; public interface UserRepository extends JpaRepository<User, Long> { // 根据用户名查找用户 User findByUsername(String username); }
5. 服务层
在服务层中注入仓库接口,编写业务逻辑。
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private UserRepository userRepository; public User getUserByUsername(String username) { return userRepository.findByUsername(username); } }
6. 控制器层
在控制器层中调用服务层的方法,处理HTTP请求。
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class UserController { @Autowired private UserService userService; @GetMapping("/user") public User getUser(@RequestParam String username) { return userService.getUserByUsername(username); } }
7. 优点与不足
- 优点:
- 简化数据访问层的代码,提高开发效率。
- 支持复杂的查询,通过方法名或JPQL/Criteria API实现。
- 灵活的数据库迁移策略。
- 良好的集成Spring事务管理。
- 不足:
- 对于复杂的数据操作,可能需要手动编写JPQL或Criteria查询,增加了学习成本。
- 性能调优需要更多的关注,如批量操作、分页优化等。
总的来说,Spring Boot结合JPA为开发者提供了一种高效、灵活的数据访问方式,是构建企业级应用的重要技术栈之一。