9. Spring Boot 中使用JPA

Spring Data 概览

Spring Jpa是Spring Data项目中的一个模块。其所处的架构大致在JDBC之上和服务层之间,起到一个抽象DAO层的作用。


Spring Data概览

在Spring Boot中使用Jpa需要完成以下几步:

  1. 添加maven依赖
  2. 设置properties配置
  3. 添加实体映射
  4. 添加dao层(repository)
  5. 添加服务层
  6. 添加Controller测试层

1. 添加maven依赖

在已经搭建好的项目上,要进行jpa的使用,首先需要添加maven依赖。默认已经添加了Spring Boot的parent或者dependecies依赖。此时,只需要添加一个不含有版本号的依赖即可。例如:


     org.springframework.boot
     spring-boot-starter-data-jpa

2. 设置项目中的properties

项目中的application.properties文件设置了整个项目中的配置信息,包括数据库,服务器等。因此,要进行jpa的设置,也需要在该文件中加入类似于如下的配置信息。

# 配置jpa
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/数据库名?useUnicode=yes&verifyServerCertificate=false&useSSL=false&requireSSL=false
spring.datasource.username=root   # 设置数据库连接用户
spring.datasource.password=aaaa  # 设置数据库连接密码
spring.jpa.hibernate.ddl-auto=update   # 如果不存在该表,则创建,有的话则去更新
spring.jpa.show-sql=true   # 在控制台打印出sql的开关

3. 添加数据库映射实体

实体其实代表的就是数据库中的一张表,这个实体类实现了HQL中从项目中类到数据库表的映射。常见的实体定义如图。

@Data
@Entity
@Table(name= "SYS_USERINFO")
public class SysUserInfo {
    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    @Column(name = "user_id")
    private int userId;

    @Column(name = "user_name")
    private String userName;

    @Column(name = "user_age")
    private int userAge;

    @Column(name = "gender")
    private String gender;

    @Column(name = "mail")
    private String mail;

    @Column(name = "address")
    private String address;

    @Column(name = "phone_number")
    private String phoneNumber;
}

定义代码中,这些注解比较明显。通过@Entity注解指明这是一个实体,通过@Table(name= "SYS_USERINFO")注解指明该实体在数据库中的表名。通过@Column(name = "列名")注解指明实体上的某属性在数据表中的列名。

4. 添加JpaRespository提供DAO层服务

创建一个对应提供实体类访问的接口,该接口继承JpaRepository<实体类名,主键类名>。此时就会默认创建一个很薄的DAO层,通过Hibernate提供的各种能力实现对实体类的访问。这里面的道道比较多,以后可以进行补充。常见的使用方法简单如下所示。

/**
 * Jpa接口,用于对接数据库的DAO
 *
 */
@Repository
public interface SysUserInfoRepository extends JpaRepository {
    // 对于有一些查询可以通过Query查询来实现
    @Query("select u from SysUserInfo u where u.userAge = :age")
    List findByUserAge(@Param("age") int age);

    SysUserInfo findByUserName(String userName);
}

这样的Repository接口需要使用@Repository注解进行Bean的注入。

在这个接口中,按照一定的规则写好方法声明就可以在服务层进行使用了。常见的做法有下面几种:

  • 通过Jpa的写法标准来声明方法就会默认创建HQL执行。例如:SysUserInfo findOneByUserNameAndUserAge(String userName, int userAge)
  • 通过@Query注解,借助sql语句实现特定的方法。

在注解里面的HQL语句中,表名和列表要写成实体类的类名和类的成员属性。不是数据库表名和列名。否则无法映射成功。

5. 添加服务层

服务层的定义有几个步骤:

  1. 通过@Service注解声明是服务层
  2. 通过构造函数和@Autowired注解注入数据库访问接口Dao
  3. 使用Dao层声明的方法操作数据库
@Service
public class SysUserInfoService {

    private SysUserInfoRepository sysUserInfoRepository;

    // 通过构造函数进行注入
    @Autowired
    public SysUserInfoService(SysUserInfoRepository sysUserInfoRepository){
        this.sysUserInfoRepository=sysUserInfoRepository;
    }

    /** 查询数据库中的存储所有用户信息 */
    public List getAllSysUserInfo(){
        return sysUserInfoRepository.findAll();
    }
}

6. 添加Controller测试层

在Controller中使用服务层,此时已经实现了从数据库的抽象外,直接操作了逻辑层。直接在构造函数中注入服务层对象后,就可以通过rest接口层进行服务提供了。例如:

...
// 通过构造函数进行依赖注入
    @Autowired
    public SysUserInfoController(SysUserInfoService sysUserInfoService){
        this.sysUserInfoService = sysUserInfoService;
    }
@GetMapping("")
    public List getAllSysUserInfo(){
        return sysUserInfoService.getAllSysUserInfo();
    }

7. 总结

Spring 中的Jpa操作,极大的简化了程序对数据库的操作步骤。

  • 通过一个简单的Repository接口层使得DAO层变得非常薄,省略了大量的配置信息等。
  • 将数据库操作简化为简单的配置和按照标准写好的方法声明即可。

8. 扩展: Repository的子接口

阅读本文可以发现,实现JPA的很重要的一个技术手段就是继承JpaRepository。 其实,还有很多子接口继承了Repository,以实现不同的功能。

  • CrudRepository: 继承 Repository,实现CRUD相关的方法。
  • PagingAndSortingRepository: 继承CrudRepository,实现了分页排序相关的方法。

同样的, 这些接口中查询方法定义规则和使用都需要满足Spring Boot中特地定义的规则。参考如下。



你可能感兴趣的:(9. Spring Boot 中使用JPA)